Merge branch 'dev' into ui
This commit is contained in:
		| @@ -34,28 +34,18 @@ DEFINES += -DSHELLMATTA_HELP_ALIAS=\"?\" | |||||||
|  |  | ||||||
| # RCC Manager | # RCC Manager | ||||||
| CFILES += stm-periph/clock-enable-manager.c | CFILES += stm-periph/clock-enable-manager.c | ||||||
|  |  | ||||||
| CFILES += stm-periph/uart.c stm-periph/dma-ring-buffer.c | CFILES += stm-periph/uart.c stm-periph/dma-ring-buffer.c | ||||||
|  |  | ||||||
| CFILES += digio.c | CFILES += digio.c | ||||||
|  |  | ||||||
| CFILES += stm-periph/unique-id.c | CFILES += stm-periph/unique-id.c | ||||||
|  |  | ||||||
| CFILES += calibration.c | CFILES += calibration.c | ||||||
|  |  | ||||||
| CFILES += temp-converter.c | CFILES += temp-converter.c | ||||||
|  |  | ||||||
| CFILES += rotary-encoder.c button.c | CFILES += rotary-encoder.c button.c | ||||||
|  |  | ||||||
| CFILES += stack-check.c | CFILES += stack-check.c | ||||||
|  |  | ||||||
| CFILES += ui/lcd.c ui/menu.c | CFILES += ui/lcd.c ui/menu.c | ||||||
|  |  | ||||||
| #CFILES += onewire-temp-sensors.c | #CFILES += onewire-temp-sensors.c | ||||||
|  |  | ||||||
| CFILES += fatfs/diskio.c fatfs/ff.c fatfs/ffsystem.c fatfs/ffunicode.c fatfs/shimatta_sdio_driver/shimatta_sdio.c | CFILES += fatfs/diskio.c fatfs/ff.c fatfs/ffsystem.c fatfs/ffunicode.c fatfs/shimatta_sdio_driver/shimatta_sdio.c | ||||||
|  |  | ||||||
| CFILES += pid-controller.c oven-driver.c | CFILES += pid-controller.c oven-driver.c | ||||||
|  | CFILES += settings/settings.c settings/settings-sd-card.c | ||||||
|  |  | ||||||
| DEFINES += -DDEBUGBUILD | DEFINES += -DDEBUGBUILD | ||||||
|  |  | ||||||
|   | |||||||
| @@ -36,6 +36,7 @@ static volatile int * volatile streaming_flag_ptr = NULL; | |||||||
| static uint32_t filter_startup_cnt; | static uint32_t filter_startup_cnt; | ||||||
| static volatile float adc_pt1000_raw_reading_hf; | static volatile float adc_pt1000_raw_reading_hf; | ||||||
| static volatile uint16_t dma_sample_buffer[ADC_PT1000_DMA_AVG_SAMPLES]; | static volatile uint16_t dma_sample_buffer[ADC_PT1000_DMA_AVG_SAMPLES]; | ||||||
|  | static volatile uint32_t adc_watchdog_counter = 0UL; | ||||||
|  |  | ||||||
| volatile float * volatile stream_buffer = NULL; | volatile float * volatile stream_buffer = NULL; | ||||||
| volatile uint32_t stream_count; | volatile uint32_t stream_count; | ||||||
| @@ -334,6 +335,8 @@ void ADC_IRQHandler(void) | |||||||
|  |  | ||||||
| 	if (adc1_sr & ADC_SR_AWD) { | 	if (adc1_sr & ADC_SR_AWD) { | ||||||
| 		ADC1->SR &= ~ADC_SR_AWD; | 		ADC1->SR &= ~ADC_SR_AWD; | ||||||
|  | 		adc_watchdog_counter++; | ||||||
|  | 		if (adc_watchdog_counter >= ADC_PT1000_WATCHDOG_SAMPLE_COUNT) | ||||||
| 			pt1000_error |= ADC_PT1000_WATCHDOG_ERROR; | 			pt1000_error |= ADC_PT1000_WATCHDOG_ERROR; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| @@ -369,6 +372,9 @@ void DMA2_Stream0_IRQHandler() | |||||||
| 		if (streaming_flag_ptr) | 		if (streaming_flag_ptr) | ||||||
| 			append_stream_buffer(adc_val); | 			append_stream_buffer(adc_val); | ||||||
|  |  | ||||||
|  | 		if (adc_watchdog_counter > 0UL) | ||||||
|  | 			adc_watchdog_counter--; | ||||||
|  |  | ||||||
| 		/* Call moving average filter */ | 		/* Call moving average filter */ | ||||||
| 		adc_pt1000_filter(adc_val); | 		adc_pt1000_filter(adc_val); | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -2,6 +2,7 @@ | |||||||
|  |  | ||||||
| import os | import os | ||||||
| import sys | import sys | ||||||
|  | import pathlib | ||||||
|  |  | ||||||
| license_header = """/* Reflow Oven Controller | license_header = """/* Reflow Oven Controller | ||||||
| * | * | ||||||
| @@ -22,7 +23,6 @@ license_header = """/* Reflow Oven Controller | |||||||
| * along with the reflow oven controller project. | * along with the reflow oven controller project. | ||||||
| * If not, see <http://www.gnu.org/licenses/>. | * If not, see <http://www.gnu.org/licenses/>. | ||||||
| */ | */ | ||||||
|  |  | ||||||
| """ | """ | ||||||
|  |  | ||||||
| project_dir = os.path.dirname(os.path.realpath(__file__)) | project_dir = os.path.dirname(os.path.realpath(__file__)) | ||||||
| @@ -37,19 +37,23 @@ cpath = os.path.join(project_dir, sys.argv[1]+'.c') | |||||||
| hfile = sys.argv[1]+'.h' | hfile = sys.argv[1]+'.h' | ||||||
| hpath = os.path.join(module_include_dir, hfile) | hpath = os.path.join(module_include_dir, hfile) | ||||||
|  |  | ||||||
| h_define = '__'+hfile.replace('.', '_').replace('-', '_').upper()+'__' | h_define = '__'+hfile.replace('.', '_').replace('-', '_').replace('/', '_').upper()+'__' | ||||||
|  |  | ||||||
| if os.path.exists(cpath) or os.path.exists(hpath): | if os.path.exists(cpath) or os.path.exists(hpath): | ||||||
| 	print("File already exists! Abort!") | 	print("File already exists! Abort!") | ||||||
| 	sys.exit() | 	sys.exit() | ||||||
|  |  | ||||||
| print('Creating C file: %s' % (cpath)) | print('Creating C file: %s' % (cpath)) | ||||||
|  | cfile_folder = os.path.dirname(cpath) | ||||||
|  | pathlib.Path(cfile_folder).mkdir(parents=True, exist_ok=True) | ||||||
| with open(cpath, 'x') as f: | with open(cpath, 'x') as f: | ||||||
| 	f.write(license_header) | 	f.write(license_header) | ||||||
| 	f.write('\n') | 	f.write('\n') | ||||||
| 	f.write('#include <%s>' % (os.path.join(include_prefix, hfile))) | 	f.write('#include <%s>' % (os.path.join(include_prefix, hfile))) | ||||||
|  |  | ||||||
| print('Creating H file: %s' % (hpath)) | print('Creating H file: %s' % (hpath)) | ||||||
|  | hfile_folder = os.path.dirname(hpath) | ||||||
|  | pathlib.Path(hfile_folder).mkdir(parents=True, exist_ok=True) | ||||||
| with open(hpath, 'x') as f: | with open(hpath, 'x') as f: | ||||||
| 	f.write(license_header) | 	f.write(license_header) | ||||||
| 	f.write('\n') | 	f.write('\n') | ||||||
|   | |||||||
| @@ -32,9 +32,9 @@ static struct sd_info card_info; // = {.type = CARD_NONE}; | |||||||
|  * @brief checkNotInserted |  * @brief checkNotInserted | ||||||
|  * @return return 0 if card is inserted, else 1 |  * @return return 0 if card is inserted, else 1 | ||||||
|  */ |  */ | ||||||
| static int sdio_check_inserted() { | int sdio_check_inserted() { | ||||||
| #if SDIO_ENABLE_INS | #if SDIO_ENABLE_INS | ||||||
| 	return ((INS_PORT->IDR & INS_PIN) == (INS_ACTIVE_LEVEL<<INS_PIN) ? 0 : 1); | 	return ((INS_PORT->IDR & (1<<INS_PIN)) == (INS_ACTIVE_LEVEL<<INS_PIN) ? 0 : 1); | ||||||
| #else | #else | ||||||
| 	return 0; // Assume Card is inserted | 	return 0; // Assume Card is inserted | ||||||
| #endif | #endif | ||||||
| @@ -46,7 +46,7 @@ static int sdio_check_inserted() { | |||||||
|  */ |  */ | ||||||
| static int sdio_check_write_protection() { | static int sdio_check_write_protection() { | ||||||
| #if SDIO_ENABLE_WRITEPROT | #if SDIO_ENABLE_WRITEPROT | ||||||
| 	return ((WRITEPROT_PORT->IDR & WRITEPROT_PIN) == (WRITEPROT_ACTIVE_LEVEL<<WRITEPROT_PIN) ? 1 : 0); | 	return ((WRITEPROT_PORT->IDR & (1<<WRITEPROT_PIN)) == (WRITEPROT_ACTIVE_LEVEL<<WRITEPROT_PIN) ? 1 : 0); | ||||||
| #else | #else | ||||||
| 	return 0; // Assume Card is not write protected | 	return 0; // Assume Card is not write protected | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -20,6 +20,8 @@ DRESULT sdio_disk_write(const BYTE *buff, DWORD sector, UINT count); | |||||||
| DRESULT sdio_disk_ioctl(BYTE cmd, void* buff); | DRESULT sdio_disk_ioctl(BYTE cmd, void* buff); | ||||||
| DWORD get_fattime(); | DWORD get_fattime(); | ||||||
|  |  | ||||||
|  | int sdio_check_inserted(); | ||||||
|  |  | ||||||
|  |  | ||||||
| //Defines for Card Status in struct _CardStatus | //Defines for Card Status in struct _CardStatus | ||||||
| #define CURRENT_STATE_IDLE 0 | #define CURRENT_STATE_IDLE 0 | ||||||
|   | |||||||
| @@ -24,7 +24,7 @@ | |||||||
|  |  | ||||||
| /* Port Definitions */ | /* Port Definitions */ | ||||||
|  |  | ||||||
| #define PORTCLKMASK (RCC_AHB1ENR_GPIODEN | RCC_AHB1ENR_GPIOCEN) | #define PORTCLKMASK (RCC_AHB1ENR_GPIODEN | RCC_AHB1ENR_GPIOCEN | RCC_AHB1ENR_GPIOAEN) | ||||||
|  |  | ||||||
| #define ALTFUNC     12 | #define ALTFUNC     12 | ||||||
|  |  | ||||||
| @@ -50,10 +50,10 @@ | |||||||
| #define WRITEPROT_ACTIVE_LEVEL 0 | #define WRITEPROT_ACTIVE_LEVEL 0 | ||||||
|  |  | ||||||
| // Card inserted pin | // Card inserted pin | ||||||
| #define SDIO_ENABLE_INS 0 | #define SDIO_ENABLE_INS 1 | ||||||
| #define INS_PORT GPIOD // Add this port to port clock mask! | #define INS_PORT GPIOA // Add this port to port clock mask! | ||||||
| #define INS_PIN 0 | #define INS_PIN 8 | ||||||
| #define INS_PULLUP 0 | #define INS_PULLUP 1 | ||||||
| #define INS_ACTIVE_LEVEL 0 | #define INS_ACTIVE_LEVEL 0 | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -59,6 +59,12 @@ | |||||||
|  */ |  */ | ||||||
| #define ADC_PT1000_UPPER_WATCHDOG 4000U | #define ADC_PT1000_UPPER_WATCHDOG 4000U | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @brief Number of ADC samples the value has to be outside the Watchdog limit (@ref ADC_PT1000_UPPER_WATCHDOG and @ref ADC_PT1000_LOWER_WATCHDOG) | ||||||
|  |  * in order to produce a watchdog error | ||||||
|  |  */ | ||||||
|  | #define ADC_PT1000_WATCHDOG_SAMPLE_COUNT 25U | ||||||
|  |  | ||||||
| enum adc_pt1000_error {ADC_PT1000_NO_ERR= 0, ADC_PT1000_WATCHDOG_ERROR=(1UL<<0), ADC_PT1000_OVERFLOW=(1UL<<1), ADC_PT1000_INACTIVE = (1UL<<2)}; | enum adc_pt1000_error {ADC_PT1000_NO_ERR= 0, ADC_PT1000_WATCHDOG_ERROR=(1UL<<0), ADC_PT1000_OVERFLOW=(1UL<<1), ADC_PT1000_INACTIVE = (1UL<<2)}; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|   | |||||||
| @@ -0,0 +1,24 @@ | |||||||
|  | /* Reflow Oven Controller | ||||||
|  | * | ||||||
|  | * Copyright (C) 2020  Mario Hüttel <mario.huettel@gmx.net> | ||||||
|  | * | ||||||
|  | * This file is part of the Reflow Oven Controller Project. | ||||||
|  | * | ||||||
|  | * The reflow oven controller is free software: you can redistribute it and/or modify | ||||||
|  | * it under the terms of the GNU General Public License version 2 as | ||||||
|  | * published by the Free Software Foundation. | ||||||
|  | * | ||||||
|  | * The Reflow Oven Control Firmware is distributed in the hope that it will be useful, | ||||||
|  | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  | * GNU General Public License for more details. | ||||||
|  | * | ||||||
|  | * You should have received a copy of the GNU General Public License | ||||||
|  | * along with the reflow oven controller project. | ||||||
|  | * If not, see <http://www.gnu.org/licenses/>. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | #ifndef __SETTINGS_SETTINGS_SD_CARD_H__ | ||||||
|  | #define __SETTINGS_SETTINGS_SD_CARD_H__ | ||||||
|  |  | ||||||
|  | #endif /* __SETTINGS_SETTINGS_SD_CARD_H__ */ | ||||||
							
								
								
									
										27
									
								
								stm-firmware/include/reflow-controller/settings/settings.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								stm-firmware/include/reflow-controller/settings/settings.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | |||||||
|  | /* Reflow Oven Controller | ||||||
|  | * | ||||||
|  | * Copyright (C) 2020  Mario Hüttel <mario.huettel@gmx.net> | ||||||
|  | * | ||||||
|  | * This file is part of the Reflow Oven Controller Project. | ||||||
|  | * | ||||||
|  | * The reflow oven controller is free software: you can redistribute it and/or modify | ||||||
|  | * it under the terms of the GNU General Public License version 2 as | ||||||
|  | * published by the Free Software Foundation. | ||||||
|  | * | ||||||
|  | * The Reflow Oven Control Firmware is distributed in the hope that it will be useful, | ||||||
|  | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  | * GNU General Public License for more details. | ||||||
|  | * | ||||||
|  | * You should have received a copy of the GNU General Public License | ||||||
|  | * along with the reflow oven controller project. | ||||||
|  | * If not, see <http://www.gnu.org/licenses/>. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #ifndef __SETTINGS_SETTINGS_H__ | ||||||
|  | #define __SETTINGS_SETTINGS_H__ | ||||||
|  |  | ||||||
|  | settings_save_calibration(); | ||||||
|  |  | ||||||
|  | #endif /* __SETTINGS_SETTINGS_H__ */ | ||||||
| @@ -30,4 +30,6 @@ void shell_handle_input(shellmatta_handle_t shell, const char *data, size_t len) | |||||||
|  |  | ||||||
| void shell_print_string(shellmatta_handle_t shell, const char *string); | void shell_print_string(shellmatta_handle_t shell, const char *string); | ||||||
|  |  | ||||||
|  | void shell_print_motd(shellmatta_handle_t shell); | ||||||
|  |  | ||||||
| #endif /* __SHELL_H__ */ | #endif /* __SHELL_H__ */ | ||||||
|   | |||||||
| @@ -29,6 +29,18 @@ int32_t stack_check_get_usage(); | |||||||
|  |  | ||||||
| int32_t stack_check_get_free(); | int32_t stack_check_get_free(); | ||||||
|  |  | ||||||
|  | static inline int stack_check_collision() | ||||||
|  | { | ||||||
|  | 	int ret = 0; | ||||||
|  | 	int32_t free_space = stack_check_get_free(); | ||||||
|  |  | ||||||
|  | 	if ((unsigned int)free_space < STACK_CHECK_MIN_HEAP_GAP) { | ||||||
|  | 			ret = -1; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return ret; | ||||||
|  | } | ||||||
|  |  | ||||||
| static inline uint32_t read_stack_pointer() | static inline uint32_t read_stack_pointer() | ||||||
| { | { | ||||||
| 	uint32_t stack_pointer; | 	uint32_t stack_pointer; | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ | |||||||
|  * it under the terms of the GNU General Public License version 2 as |  * it under the terms of the GNU General Public License version 2 as | ||||||
|  * published by the Free Software Foundation. |  * published by the Free Software Foundation. | ||||||
|  * |  * | ||||||
|  * GDSII-Converter is distributed in the hope that it will be useful, |  * The Reflow Oven Control Firmware is distributed in the hope that it will be useful, | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  * GNU General Public License for more details. |  * GNU General Public License for more details. | ||||||
|   | |||||||
| @@ -34,6 +34,7 @@ | |||||||
| #include <reflow-controller/shell.h> | #include <reflow-controller/shell.h> | ||||||
| #include <reflow-controller/pid-controller.h> | #include <reflow-controller/pid-controller.h> | ||||||
| #include <reflow-controller/digio.h> | #include <reflow-controller/digio.h> | ||||||
|  | #include "fatfs/shimatta_sdio_driver/shimatta_sdio.h" | ||||||
| #include <reflow-controller/temp-converter.h> | #include <reflow-controller/temp-converter.h> | ||||||
| #include <reflow-controller/rotary-encoder.h> | #include <reflow-controller/rotary-encoder.h> | ||||||
| #include <stm-periph/stm32-gpio-macros.h> | #include <stm-periph/stm32-gpio-macros.h> | ||||||
| @@ -60,6 +61,9 @@ static uint32_t rot; | |||||||
| static volatile float pid_out; | static volatile float pid_out; | ||||||
| static volatile float current_temperature; | static volatile float current_temperature; | ||||||
|  |  | ||||||
|  | FATFS fs; | ||||||
|  | FATFS *fs_ptr = &fs; | ||||||
|  |  | ||||||
| static inline void uart_gpio_config() | static inline void uart_gpio_config() | ||||||
| { | { | ||||||
| #ifdef DEBUGBUILD | #ifdef DEBUGBUILD | ||||||
| @@ -104,11 +108,32 @@ static inline void setup_sell_uart(struct stm_uart *uart) | |||||||
| 	NVIC_EnableIRQ(DMA2_Stream7_IRQn); | 	NVIC_EnableIRQ(DMA2_Stream7_IRQn); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static bool mount_sd_card_if_avail(bool mounted) | ||||||
|  | { | ||||||
|  | 	FRESULT res; | ||||||
|  |  | ||||||
|  | 	if (sdio_check_inserted() && mounted) { | ||||||
|  | 		memset(fs_ptr, 0, sizeof(FATFS)); | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (!sdio_check_inserted() && !mounted) { | ||||||
|  | 		res = f_mount(fs_ptr, "0:/", 1); | ||||||
|  | 		if (res == FR_OK) { | ||||||
|  | 			return true; | ||||||
|  | 		} else { | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return mounted; | ||||||
|  | } | ||||||
|  |  | ||||||
| const char *oven_controller_hello_world = "Hello world :)\n"; | const char *oven_controller_hello_world = "Hello world :)\n"; | ||||||
|  |  | ||||||
| int main() | int main() | ||||||
| { | { | ||||||
| 	FATFS fs; | 	bool sd_card_mounted = false; | ||||||
| 	FIL test_file; | 	FIL test_file; | ||||||
| 	const char *uart_input; | 	const char *uart_input; | ||||||
| 	size_t uart_input_len; | 	size_t uart_input_len; | ||||||
| @@ -132,8 +157,10 @@ int main() | |||||||
| 	setup_sell_uart(&shell_uart); | 	setup_sell_uart(&shell_uart); | ||||||
|  |  | ||||||
| 	shell_handle = shell_init(write_shell_callback); | 	shell_handle = shell_init(write_shell_callback); | ||||||
|  | 	shell_print_motd(shell_handle); | ||||||
|  |  | ||||||
| 	if (f_mount(&fs, "0:/", 1) == FR_OK) { | 	if (f_mount(fs_ptr, "0:/", 1) == FR_OK) { | ||||||
|  | 		sd_card_mounted = true; | ||||||
| 		f_open(&test_file, "hello-world.txt", FA_OPEN_APPEND | FA_WRITE); | 		f_open(&test_file, "hello-world.txt", FA_OPEN_APPEND | FA_WRITE); | ||||||
| 		f_write(&test_file, oven_controller_hello_world, strlen(oven_controller_hello_world), NULL); | 		f_write(&test_file, oven_controller_hello_world, strlen(oven_controller_hello_world), NULL); | ||||||
| 		f_close(&test_file); | 		f_close(&test_file); | ||||||
| @@ -143,6 +170,9 @@ int main() | |||||||
| 	pid_zero(&pid); | 	pid_zero(&pid); | ||||||
|  |  | ||||||
| 	while (1) { | 	while (1) { | ||||||
|  |  | ||||||
|  | 		sd_card_mounted = mount_sd_card_if_avail(sd_card_mounted); | ||||||
|  |  | ||||||
| 		pt1000_value_status = adc_pt1000_get_current_resistance(&pt1000_value); | 		pt1000_value_status = adc_pt1000_get_current_resistance(&pt1000_value); | ||||||
|  |  | ||||||
| 		if (pt1000_value_status >= 0) { | 		if (pt1000_value_status >= 0) { | ||||||
|   | |||||||
							
								
								
									
										21
									
								
								stm-firmware/settings/settings-sd-card.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								stm-firmware/settings/settings-sd-card.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | |||||||
|  | /* Reflow Oven Controller | ||||||
|  | * | ||||||
|  | * Copyright (C) 2020  Mario Hüttel <mario.huettel@gmx.net> | ||||||
|  | * | ||||||
|  | * This file is part of the Reflow Oven Controller Project. | ||||||
|  | * | ||||||
|  | * The reflow oven controller is free software: you can redistribute it and/or modify | ||||||
|  | * it under the terms of the GNU General Public License version 2 as | ||||||
|  | * published by the Free Software Foundation. | ||||||
|  | * | ||||||
|  | * The Reflow Oven Control Firmware is distributed in the hope that it will be useful, | ||||||
|  | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  | * GNU General Public License for more details. | ||||||
|  | * | ||||||
|  | * You should have received a copy of the GNU General Public License | ||||||
|  | * along with the reflow oven controller project. | ||||||
|  | * If not, see <http://www.gnu.org/licenses/>. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | #include <reflow-controller/settings/settings-sd-card.h> | ||||||
							
								
								
									
										21
									
								
								stm-firmware/settings/settings.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								stm-firmware/settings/settings.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | |||||||
|  | /* Reflow Oven Controller | ||||||
|  | * | ||||||
|  | * Copyright (C) 2020  Mario Hüttel <mario.huettel@gmx.net> | ||||||
|  | * | ||||||
|  | * This file is part of the Reflow Oven Controller Project. | ||||||
|  | * | ||||||
|  | * The reflow oven controller is free software: you can redistribute it and/or modify | ||||||
|  | * it under the terms of the GNU General Public License version 2 as | ||||||
|  | * published by the Free Software Foundation. | ||||||
|  | * | ||||||
|  | * The Reflow Oven Control Firmware is distributed in the hope that it will be useful, | ||||||
|  | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  | * GNU General Public License for more details. | ||||||
|  | * | ||||||
|  | * You should have received a copy of the GNU General Public License | ||||||
|  | * along with the reflow oven controller project. | ||||||
|  | * If not, see <http://www.gnu.org/licenses/>. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | #include <reflow-controller/settings/settings.h> | ||||||
| @@ -18,6 +18,8 @@ | |||||||
|  * If not, see <http://www.gnu.org/licenses/>. |  * If not, see <http://www.gnu.org/licenses/>. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
|  | #include <stm32/stm32f4xx.h> | ||||||
|  | #include <cmsis/core_cm4.h> | ||||||
| #include <reflow-controller/shell.h> | #include <reflow-controller/shell.h> | ||||||
| #include <stm-periph/uart.h> | #include <stm-periph/uart.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
| @@ -30,7 +32,7 @@ | |||||||
| #include <stm-periph/unique-id.h> | #include <stm-periph/unique-id.h> | ||||||
| #include <reflow-controller/calibration.h> | #include <reflow-controller/calibration.h> | ||||||
| #include <reflow-controller/temp-converter.h> | #include <reflow-controller/temp-converter.h> | ||||||
|  | #include <fatfs/ff.h> | ||||||
| #include <reflow-controller/stack-check.h> | #include <reflow-controller/stack-check.h> | ||||||
| #include <reflow-controller/rotary-encoder.h> | #include <reflow-controller/rotary-encoder.h> | ||||||
|  |  | ||||||
| @@ -275,8 +277,11 @@ static shellmatta_retCode_t shell_cmd_pt1000_res_loop(const shellmatta_handle_t | |||||||
| 			shellmatta_printf(handle, "\x1b[1A\x1b[150D\x1b[K"); | 			shellmatta_printf(handle, "\x1b[1A\x1b[150D\x1b[K"); | ||||||
| 		shell_cmd_pt1000_res(handle, "", 0UL); | 		shell_cmd_pt1000_res(handle, "", 0UL); | ||||||
|  |  | ||||||
| 		led_set(0, led_status); | 		led_set(1, led_status); | ||||||
| 		led_set(1, !led_status); | 		if (adc_pt1000_check_error() & ADC_PT1000_WATCHDOG_ERROR) { | ||||||
|  | 			led_set(0, 1); | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		led_status ^= 0x1; | 		led_status ^= 0x1; | ||||||
|  |  | ||||||
| 		systick_wait_ms(150); | 		systick_wait_ms(150); | ||||||
| @@ -288,6 +293,43 @@ static shellmatta_retCode_t shell_cmd_pt1000_res_loop(const shellmatta_handle_t | |||||||
| 	return SHELLMATTA_OK; | 	return SHELLMATTA_OK; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static shellmatta_retCode_t shell_cmd_ls(const shellmatta_handle_t handle, const char *arguments, | ||||||
|  | 						      uint32_t length) | ||||||
|  | { | ||||||
|  | 	(void)length; | ||||||
|  | 	(void)arguments; | ||||||
|  | 	DIR dir; | ||||||
|  | 	FRESULT res; | ||||||
|  | 	FILINFO fno; | ||||||
|  |  | ||||||
|  | 	res = f_opendir(&dir, "/"); | ||||||
|  | 	if (res != FR_OK) { | ||||||
|  | 		shellmatta_printf(handle, "Filesystem inaccessible. Is an SD Card inserted?\r\n"); | ||||||
|  | 		return SHELLMATTA_OK; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	while (f_readdir(&dir, &fno) == FR_OK) { | ||||||
|  | 		if (fno.fname[0] == 0) | ||||||
|  | 			break; | ||||||
|  | 		shellmatta_printf(handle, "%c\t%s\r\n", (fno.fattrib & AM_DIR ? 'd' : 'f'), fno.fname); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	f_closedir(&dir); | ||||||
|  |  | ||||||
|  | 	return SHELLMATTA_OK; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static shellmatta_retCode_t shell_cmd_reset(const shellmatta_handle_t handle, const char *arguments, | ||||||
|  | 					 uint32_t length) | ||||||
|  | { | ||||||
|  | 	(void)handle; | ||||||
|  | 	(void)length; | ||||||
|  | 	(void)arguments; | ||||||
|  |  | ||||||
|  | 	NVIC_SystemReset(); | ||||||
|  |  | ||||||
|  | 	return SHELLMATTA_BUSY; | ||||||
|  | } | ||||||
| //typedef struct shellmatta_cmd | //typedef struct shellmatta_cmd | ||||||
| //{ | //{ | ||||||
| //    char                    *cmd;       /**< command name                           */ | //    char                    *cmd;       /**< command name                           */ | ||||||
| @@ -298,7 +340,7 @@ static shellmatta_retCode_t shell_cmd_pt1000_res_loop(const shellmatta_handle_t | |||||||
| //    struct shellmatta_cmd   *next;      /**< pointer to next command or NULL        */ | //    struct shellmatta_cmd   *next;      /**< pointer to next command or NULL        */ | ||||||
| //} shellmatta_cmd_t; | //} shellmatta_cmd_t; | ||||||
|  |  | ||||||
| static shellmatta_cmd_t cmd[10] = { | static shellmatta_cmd_t cmd[12] = { | ||||||
| 	{ | 	{ | ||||||
| 		.cmd = "version", | 		.cmd = "version", | ||||||
| 		.cmdAlias = "ver", | 		.cmdAlias = "ver", | ||||||
| @@ -377,8 +419,25 @@ static shellmatta_cmd_t cmd[10] = { | |||||||
| 		.helpText = "Get current rotary encoder value", | 		.helpText = "Get current rotary encoder value", | ||||||
| 		.usageText = "", | 		.usageText = "", | ||||||
| 		.cmdFct = shell_cmd_rot, | 		.cmdFct = shell_cmd_rot, | ||||||
|  | 		.next = &cmd[10], | ||||||
|  | 	}, | ||||||
|  | 	{ | ||||||
|  | 		.cmd = "ls", | ||||||
|  | 		.cmdAlias = NULL, | ||||||
|  | 		.helpText = "List filesystem contents", | ||||||
|  | 		.usageText = "", | ||||||
|  | 		.cmdFct = shell_cmd_ls, | ||||||
|  | 		.next = &cmd[11], | ||||||
|  | 	}, | ||||||
|  | 	{ | ||||||
|  | 		.cmd = "reset", | ||||||
|  | 		.cmdAlias = NULL, | ||||||
|  | 		.helpText = "Reset controller", | ||||||
|  | 		.usageText = "Resets the controller", | ||||||
|  | 		.cmdFct = shell_cmd_reset, | ||||||
| 		.next = NULL, | 		.next = NULL, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| shellmatta_handle_t shell_init(shellmatta_write_t write_func) | shellmatta_handle_t shell_init(shellmatta_write_t write_func) | ||||||
| @@ -394,6 +453,12 @@ shellmatta_handle_t shell_init(shellmatta_write_t write_func) | |||||||
| 	return handle; | 	return handle; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void shell_print_motd(shellmatta_handle_t shell) | ||||||
|  | { | ||||||
|  | 	shellmatta_printf(shell, "\r\nShimatta 仕舞った Reflow Controller ready\r\n\r\n"); | ||||||
|  | 	shell_cmd_ver(shell, NULL, 0UL); | ||||||
|  | 	shell_handle_input(shell, "\r\n", 2UL); | ||||||
|  | } | ||||||
|  |  | ||||||
| void shell_handle_input(shellmatta_handle_t shell, const char *data, size_t len) | void shell_handle_input(shellmatta_handle_t shell, const char *data, size_t len) | ||||||
| { | { | ||||||
|   | |||||||
 Submodule stm-firmware/shellmatta updated: 6c76dfc7ae...ebf65d7448
									
								
							
		Reference in New Issue
	
	Block a user