Compare commits
No commits in common. "47d8df052a6f6ecdb3c6e80ee9e8ce087d2edfd5" and "f0bf10d91d5955afd29152445cf51b8de34b7f39" have entirely different histories.
47d8df052a
...
f0bf10d91d
4
.gitmodules
vendored
4
.gitmodules
vendored
@ -5,7 +5,3 @@
|
|||||||
path = c-style-checker
|
path = c-style-checker
|
||||||
url = https://git.shimatta.de/mhu/c-style-checker.git
|
url = https://git.shimatta.de/mhu/c-style-checker.git
|
||||||
branch = master
|
branch = master
|
||||||
[submodule "reflow-controller-temp-profile-lang"]
|
|
||||||
path = reflow-controller-temp-profile-lang
|
|
||||||
url = https://git.shimatta.de/mhu/reflow-controller-temp-profile-lang.git
|
|
||||||
branch = master
|
|
||||||
|
@ -1 +0,0 @@
|
|||||||
Subproject commit c369231e42ecd67bf4d1a72a54b165dcee3b6bdb
|
|
@ -7,13 +7,13 @@ CFILES = main.c syscalls.c setup/system_stm32f4xx.c systick.c
|
|||||||
ASFILES = boot/startup_stm32f4xx.S
|
ASFILES = boot/startup_stm32f4xx.S
|
||||||
INCLUDEPATH = -Iinclude
|
INCLUDEPATH = -Iinclude
|
||||||
|
|
||||||
OBJDIR_BASE = obj
|
OBJDIR = obj
|
||||||
TARGET_BASE = reflow-controller
|
target = reflow-controller
|
||||||
LIBRARYPATH = -L. -Lmathlib
|
LIBRARYPATH = -L. -Lmathlib
|
||||||
LIBRARIES = -larm_cortexM4lf_math -lm
|
LIBRARIES = -larm_cortexM4lf_math -lm
|
||||||
|
|
||||||
DEFINES = -DSTM32F407xx -DSTM32F4XX -DARM_MATH_CM4 -DHSE_VALUE=8000000UL
|
DEFINES = -DSTM32F407xx -DSTM32F4XX -DARM_MATH_CM4 -DHSE_VALUE=8000000UL
|
||||||
MAPFILE_BASE = memory-mapping
|
mapfile = memory-mapping
|
||||||
|
|
||||||
export GIT_VER = $(shell git describe --always --dirty --tags)
|
export GIT_VER = $(shell git describe --always --dirty --tags)
|
||||||
DEFINES += -DGIT_VER=$(GIT_VER)
|
DEFINES += -DGIT_VER=$(GIT_VER)
|
||||||
@ -48,67 +48,30 @@ CFILES += pid-controller.c oven-driver.c
|
|||||||
CFILES += settings/settings.c settings/settings-sd-card.c
|
CFILES += settings/settings.c settings/settings-sd-card.c
|
||||||
CFILES += safety-adc.c
|
CFILES += safety-adc.c
|
||||||
|
|
||||||
DEBUG_DEFINES = -DDEBUGBUILD
|
DEFINES += -DDEBUGBUILD
|
||||||
RELEASE_DEFINES =
|
|
||||||
|
|
||||||
###################################################################################
|
###################################################################################
|
||||||
ifeq ($(CROSS_COMPILE),)
|
CC=arm-none-eabi-gcc
|
||||||
CROSS_COMPILE=arm-none-eabi-
|
OBJCOPY=arm-none-eabi-objcopy
|
||||||
endif
|
OBJDUMP=arm-none-eabi-objdump
|
||||||
|
SIZE=arm-none-eabi-size
|
||||||
|
|
||||||
CC=$(CROSS_COMPILE)gcc
|
LFLAGS = -mlittle-endian -mthumb -mcpu=cortex-m4 -mthumb-interwork
|
||||||
OBJCOPY=$(CROSS_COMPILE)objcopy
|
|
||||||
OBJDUMP=$(CROSS_COMPILE)objdump
|
|
||||||
SIZE=$(CROSS_COMPILE)size
|
|
||||||
|
|
||||||
CFLAGS_RELEASE = -O3 -g
|
|
||||||
CFLAGS_DEBUG = -O0 -g
|
|
||||||
|
|
||||||
LFLAGS_RELEASE = -Wl,--gc-sections
|
|
||||||
LFLAGS_DEBUG =
|
|
||||||
|
|
||||||
CFLAGS =
|
|
||||||
LFLAGS =
|
|
||||||
|
|
||||||
ifneq ($(DEBUGBUILD),true)
|
|
||||||
DEFINES += $(RELEASE_DEFINES)
|
|
||||||
CFLAGS += $(CFLAGS_RELEASE)
|
|
||||||
LFLAGS += $(LFLAGS_RELEASE)
|
|
||||||
target = $(TARGET_BASE)-release
|
|
||||||
OBJDIR = $(OBJDIR_BASE)/release
|
|
||||||
MAPFILE = $(MAPFILE_BASE)-release
|
|
||||||
else
|
|
||||||
DEFINES += $(DEBUG_DEFINES)
|
|
||||||
target = $(TARGET_BASE)-debug
|
|
||||||
CFLAGS += $(CFLAGS_DEBUG)
|
|
||||||
LFLAGS += $(LFLAGS_DEBUG)
|
|
||||||
OBJDIR = $(OBJDIR_BASE)/debug
|
|
||||||
MAPFILE = $(MAPFILE_BASE)-debug
|
|
||||||
endif
|
|
||||||
|
|
||||||
LFLAGS += -mlittle-endian -mthumb -mcpu=cortex-m4 -mthumb-interwork
|
|
||||||
LFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 --disable-newlib-supplied-syscalls -nostartfiles
|
LFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 --disable-newlib-supplied-syscalls -nostartfiles
|
||||||
LFLAGS += -Tstm32f407vet6_flash.ld -Wl,-Map=$(MAPFILE).map
|
LFLAGS += -Tstm32f407vet6_flash.ld -Wl,-Map=$(mapfile).map
|
||||||
|
|
||||||
CFLAGS += -c -mlittle-endian -mthumb -mcpu=cortex-m4 -mthumb-interwork
|
CFLAGS = -c -mlittle-endian -mthumb -mcpu=cortex-m4 -mthumb-interwork
|
||||||
CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 -nostartfiles
|
CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 -nostartfiles -O0 -g
|
||||||
CFLAGS += -Wall -Wextra -Wold-style-declaration -Wuninitialized -Wmaybe-uninitialized -Wunused-parameter -Wimplicit-fallthrough=3 -Wsign-compare
|
CFLAGS += -Wall -Wextra -Wold-style-declaration -Wuninitialized -Wmaybe-uninitialized -Wunused-parameter -Wimplicit-fallthrough=3 -Wsign-compare
|
||||||
|
|
||||||
####################################################################################
|
####################################################################################
|
||||||
|
|
||||||
OBJ = $(CFILES:%.c=$(OBJDIR)/%.c.o)
|
OBJ = $(CFILES:%.c=$(OBJDIR)/%.c.o)
|
||||||
ASOBJ += $(ASFILES:%.S=$(OBJDIR)/%.S.o)
|
ASOBJ += $(ASFILES:%.S=$(OBJDIR)/%.S.o)
|
||||||
|
|
||||||
|
all: default
|
||||||
|
|
||||||
default: $(target).elf
|
default: $(target).elf
|
||||||
|
|
||||||
all: debug release
|
|
||||||
|
|
||||||
release:
|
|
||||||
$(QUIET)$(MAKE) DEBUGBUILD=false
|
|
||||||
|
|
||||||
debug:
|
|
||||||
$(QUIET)$(MAKE) DEBUGBUILD=true
|
|
||||||
|
|
||||||
%.bin: %.elf
|
%.bin: %.elf
|
||||||
$(QUIET)$(OBJCOPY) -O binary $^ $@
|
$(QUIET)$(OBJCOPY) -O binary $^ $@
|
||||||
%.hex: %.elf
|
%.hex: %.elf
|
||||||
@ -134,7 +97,7 @@ $(ASOBJ):
|
|||||||
$(QUIET)$(CC) $(CFLAGS) -MMD -MT $@ $(INCLUDEPATH) $(DEFINES) -o $@ $(@:$(OBJDIR)/%.S.o=%.S)
|
$(QUIET)$(CC) $(CFLAGS) -MMD -MT $@ $(INCLUDEPATH) $(DEFINES) -o $@ $(@:$(OBJDIR)/%.S.o=%.S)
|
||||||
|
|
||||||
|
|
||||||
.PHONY: qtproject-legacy qtproject qtproject-debug clean mrproper objcopy disassemble program
|
.PHONY: qtproject-legacy qtproject clean mrproper objcopy disassemble program
|
||||||
|
|
||||||
program: $(target).elf
|
program: $(target).elf
|
||||||
./program-device.sh $<
|
./program-device.sh $<
|
||||||
@ -145,21 +108,12 @@ disassemble: $(target).elf
|
|||||||
objcopy: $(target).bin $(target).hex
|
objcopy: $(target).bin $(target).hex
|
||||||
|
|
||||||
mrproper: clean
|
mrproper: clean
|
||||||
@echo "Purging project files..."
|
$(QUIET)rm -f $(target).pro
|
||||||
$(QUIET)rm -f $(target).pro $(target).creator $(target).files $(target).cflags $(target).cxxflags $(target).includes $(target).config
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@echo -n "Cleaning up derived files for "
|
@echo "Cleaning up derived files..."
|
||||||
ifneq ($(DEBUGBUILD),true)
|
|
||||||
@echo "RELEASE build"
|
|
||||||
else
|
|
||||||
@echo "DEBUG build"
|
|
||||||
endif
|
|
||||||
$(QUIET)rm -f $(target).elf $(target).bin $(target).hex $(OBJ) $(ASOBJ) $(mapfile).map $(CFILES:%.c=$(OBJDIR)/%.c.d) $(ASFILES:%.S=$(OBJDIR)/%.S.d)
|
$(QUIET)rm -f $(target).elf $(target).bin $(target).hex $(OBJ) $(ASOBJ) $(mapfile).map $(CFILES:%.c=$(OBJDIR)/%.c.d) $(ASFILES:%.S=$(OBJDIR)/%.S.d)
|
||||||
$(QUIET)rm -rf $(OBJDIR)/*
|
$(QUIET)rm -rf $(OBJDIR)/*
|
||||||
ifneq ($(DEBUGBUILD),true)
|
|
||||||
$(QUIET)$(MAKE) DEBUGBUILD=true clean
|
|
||||||
endif
|
|
||||||
|
|
||||||
qtproject-legacy:
|
qtproject-legacy:
|
||||||
echo -e "TEMPLATE = app\nCONFIG -= console app_bundle qt" > $(target).pro
|
echo -e "TEMPLATE = app\nCONFIG -= console app_bundle qt" > $(target).pro
|
||||||
@ -171,13 +125,9 @@ qtproject-legacy:
|
|||||||
echo -ne "\nDEFINES += " >> $(target).pro
|
echo -ne "\nDEFINES += " >> $(target).pro
|
||||||
echo "$(DEFINES)" | sed "s/-D//g" >> $(target).pro
|
echo "$(DEFINES)" | sed "s/-D//g" >> $(target).pro
|
||||||
|
|
||||||
qtproject-debug:
|
|
||||||
@echo "Generating debug build project"
|
|
||||||
$(QUIET)$(MAKE) DEBUGBUILD=true qtproject
|
|
||||||
|
|
||||||
qtproject:
|
qtproject:
|
||||||
$(QUIET)rm -f $(target).files $(target).cflags $(target).config $(target).creator $(target).includes $(target).creator.user
|
$(QUIET)rm -f $(target).files $(target).cflags $(target).config $(target).creator $(target).includes $(target).creator.user
|
||||||
@echo "Generating source file list"
|
echo "Generating source file list"
|
||||||
$(QUIET)echo "$(CFILES)" | tr ' ' '\n' > $(target).files
|
$(QUIET)echo "$(CFILES)" | tr ' ' '\n' > $(target).files
|
||||||
@echo -n "Appending found header files from folders "
|
@echo -n "Appending found header files from folders "
|
||||||
@echo `echo $(INCLUDEPATH) | sed "s/-I//g"`
|
@echo `echo $(INCLUDEPATH) | sed "s/-I//g"`
|
||||||
|
@ -238,8 +238,6 @@ static int sdio_check_status_register_cmd13(uint16_t rca, uint32_t *status)
|
|||||||
uint32_t response;
|
uint32_t response;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
*status = 0UL;
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
sdio_send_cmd(13, (rca<<16)&0xFFFF0000, SHORT_ANS);
|
sdio_send_cmd(13, (rca<<16)&0xFFFF0000, SHORT_ANS);
|
||||||
if (!(res = sdio_get_response(13, SHORT_ANS, &response))) {
|
if (!(res = sdio_get_response(13, SHORT_ANS, &response))) {
|
||||||
@ -467,14 +465,10 @@ static int sdio_send_select_card_cmd7(uint16_t rca) {
|
|||||||
} while(--timeout > 0);
|
} while(--timeout > 0);
|
||||||
|
|
||||||
/* Check, if card in in TRANS state */
|
/* Check, if card in in TRANS state */
|
||||||
if (sdio_check_status_register_cmd13(rca, &status.value)) {
|
if (sdio_check_status_register_cmd13(rca, &(status.value)))
|
||||||
res = -1;
|
res = -1;
|
||||||
goto ret_val;
|
|
||||||
}
|
|
||||||
if (status.statusstruct.CURRENT_STATE != CURRENT_STATE_TRAN)
|
if (status.statusstruct.CURRENT_STATE != CURRENT_STATE_TRAN)
|
||||||
res = -2;
|
res = -2;
|
||||||
|
|
||||||
ret_val:
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -711,10 +705,9 @@ DRESULT sdio_disk_write(const BYTE *buff, DWORD sector, UINT count)
|
|||||||
|
|
||||||
while (count) {
|
while (count) {
|
||||||
do {
|
do {
|
||||||
ret = sdio_check_status_register_cmd13(card_info.rca, &status.value);
|
sdio_check_status_register_cmd13(card_info.rca, &status.value);
|
||||||
} while (status.statusstruct.CURRENT_STATE == CURRENT_STATE_PRG ||
|
} while (status.statusstruct.CURRENT_STATE == CURRENT_STATE_PRG ||
|
||||||
status.statusstruct.CURRENT_STATE == CURRENT_STATE_RCV ||
|
status.statusstruct.CURRENT_STATE == CURRENT_STATE_RCV);
|
||||||
!ret);
|
|
||||||
|
|
||||||
if (status.statusstruct.CURRENT_STATE == CURRENT_STATE_STBY) {
|
if (status.statusstruct.CURRENT_STATE == CURRENT_STATE_STBY) {
|
||||||
if (sdio_send_select_card_cmd7(card_info.rca))
|
if (sdio_send_select_card_cmd7(card_info.rca))
|
||||||
|
@ -45,7 +45,7 @@ struct oven_pid_errors {
|
|||||||
|
|
||||||
struct oven_pid_status {
|
struct oven_pid_status {
|
||||||
bool active;
|
bool active;
|
||||||
bool error_set;
|
bool aborted;
|
||||||
struct oven_pid_errors error_flags;
|
struct oven_pid_errors error_flags;
|
||||||
float target_temp;
|
float target_temp;
|
||||||
float current_temp;
|
float current_temp;
|
||||||
@ -58,8 +58,6 @@ void oven_driver_set_power(uint8_t power);
|
|||||||
|
|
||||||
void oven_driver_disable(void);
|
void oven_driver_disable(void);
|
||||||
|
|
||||||
void oven_pid_ack_errors(void);
|
|
||||||
|
|
||||||
void oven_pid_init(struct pid_controller *controller_to_copy);
|
void oven_pid_init(struct pid_controller *controller_to_copy);
|
||||||
|
|
||||||
void oven_pid_handle(float target_temp);
|
void oven_pid_handle(float target_temp);
|
||||||
|
@ -39,12 +39,6 @@ enum safety_adc_check_result {
|
|||||||
SAFETY_ADC_INTERNAL_ERROR = (1U<<4),
|
SAFETY_ADC_INTERNAL_ERROR = (1U<<4),
|
||||||
};
|
};
|
||||||
|
|
||||||
extern enum safety_adc_check_result global_safety_adc_status;
|
|
||||||
|
|
||||||
enum safety_adc_check_result safety_adc_get_errors();
|
|
||||||
|
|
||||||
void safety_adc_clear_errors(void);
|
|
||||||
|
|
||||||
void safety_adc_init();
|
void safety_adc_init();
|
||||||
|
|
||||||
void safety_adc_deinit();
|
void safety_adc_deinit();
|
||||||
|
@ -36,18 +36,18 @@
|
|||||||
#include <reflow-controller/shell.h>
|
#include <reflow-controller/shell.h>
|
||||||
#include <reflow-controller/digio.h>
|
#include <reflow-controller/digio.h>
|
||||||
#include "fatfs/shimatta_sdio_driver/shimatta_sdio.h"
|
#include "fatfs/shimatta_sdio_driver/shimatta_sdio.h"
|
||||||
|
#include <reflow-controller/temp-converter.h>
|
||||||
#include <stm-periph/stm32-gpio-macros.h>
|
#include <stm-periph/stm32-gpio-macros.h>
|
||||||
#include <stm-periph/clock-enable-manager.h>
|
#include <stm-periph/clock-enable-manager.h>
|
||||||
#include <stm-periph/uart.h>
|
#include <stm-periph/uart.h>
|
||||||
#include <reflow-controller/shell-uart-config.h>
|
#include <reflow-controller/shell-uart-config.h>
|
||||||
|
#include <helper-macros/helper-macros.h>
|
||||||
#include <reflow-controller/oven-driver.h>
|
#include <reflow-controller/oven-driver.h>
|
||||||
#include <reflow-controller/safety-adc.h>
|
#include <reflow-controller/safety-adc.h>
|
||||||
#include <fatfs/ff.h>
|
#include <fatfs/ff.h>
|
||||||
#include <reflow-controller/reflow-menu.h>
|
#include <reflow-controller/reflow-menu.h>
|
||||||
|
|
||||||
bool global_error_state;
|
static void setup_nvic_priorities()
|
||||||
|
|
||||||
static void setup_nvic_priorities(void)
|
|
||||||
{
|
{
|
||||||
/* No sub priorities */
|
/* No sub priorities */
|
||||||
NVIC_SetPriorityGrouping(2);
|
NVIC_SetPriorityGrouping(2);
|
||||||
@ -61,7 +61,7 @@ static void setup_nvic_priorities(void)
|
|||||||
FATFS fs;
|
FATFS fs;
|
||||||
FATFS * const fs_ptr = &fs;
|
FATFS * const fs_ptr = &fs;
|
||||||
|
|
||||||
static inline void uart_gpio_config(void)
|
static inline void uart_gpio_config()
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* In case the application is build in debug mode, use the TX/RX Pins on the debug header
|
* In case the application is build in debug mode, use the TX/RX Pins on the debug header
|
||||||
@ -121,16 +121,30 @@ static bool mount_sd_card_if_avail(bool mounted)
|
|||||||
|
|
||||||
if (!sdio_check_inserted() && !mounted) {
|
if (!sdio_check_inserted() && !mounted) {
|
||||||
res = f_mount(fs_ptr, "0:/", 1);
|
res = f_mount(fs_ptr, "0:/", 1);
|
||||||
if (res == FR_OK)
|
if (res == FR_OK) {
|
||||||
return true;
|
return true;
|
||||||
else
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return mounted;
|
return mounted;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setup_unused_pins(void)
|
static inline int32_t handle_pid_controller(struct pid_controller *pid, float target_temperature,
|
||||||
|
float current_temperature)
|
||||||
|
{
|
||||||
|
int32_t pid_out;
|
||||||
|
|
||||||
|
pid_out = (int32_t)pid_sample(pid, target_temperature - current_temperature);
|
||||||
|
|
||||||
|
/* Blink green LED */
|
||||||
|
led_set(1, !led_get(1));
|
||||||
|
|
||||||
|
return pid_out;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void setup_unused_pins()
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -140,7 +154,7 @@ static void setup_unused_pins(void)
|
|||||||
GPIOE->PUPDR |= PULLDOWN(i);
|
GPIOE->PUPDR |= PULLDOWN(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void setup_system(void)
|
static inline void setup_system()
|
||||||
{
|
{
|
||||||
setup_nvic_priorities();
|
setup_nvic_priorities();
|
||||||
systick_setup();
|
systick_setup();
|
||||||
@ -171,11 +185,10 @@ static void handle_shell_uart_input(shellmatta_handle_t shell_handle)
|
|||||||
shell_handle_input(shell_handle, uart_input, uart_input_len);
|
shell_handle_input(shell_handle, uart_input, uart_input_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern char _sccmram;
|
||||||
|
extern char _eccmram;
|
||||||
static void zero_ccm_ram(void)
|
static void zero_ccm_ram(void)
|
||||||
{
|
{
|
||||||
/* These extern variables are placed in the linker script */
|
|
||||||
extern char _sccmram;
|
|
||||||
extern char _eccmram;
|
|
||||||
uint32_t len;
|
uint32_t len;
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
uint32_t *ptr = (uint32_t *)&_sccmram;
|
uint32_t *ptr = (uint32_t *)&_sccmram;
|
||||||
@ -185,31 +198,10 @@ static void zero_ccm_ram(void)
|
|||||||
ptr[i] = 0UL;
|
ptr[i] = 0UL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
volatile bool error_state = false;
|
||||||
* @brief This function sets the appropriate error flags in the oven PID controller
|
volatile enum safety_adc_check_result safety_adc_status = SAFETY_ADC_CHECK_OK;
|
||||||
* depending on the Safety ADC measurements.
|
|
||||||
* The PID controller's error flags have to be cleared via the GUI by either starting a new RUN or explicitly
|
|
||||||
* ack'ing these errors.
|
|
||||||
*/
|
|
||||||
static void propagate_safety_adc_error_to_oven_pid(void)
|
|
||||||
{
|
|
||||||
enum safety_adc_check_result safety_adc_result;
|
|
||||||
|
|
||||||
safety_adc_result = safety_adc_get_errors();
|
int main()
|
||||||
|
|
||||||
if (safety_adc_result & SAFETY_ADC_CHECK_TEMP_LOW ||
|
|
||||||
safety_adc_result & SAFETY_ADC_CHECK_TEMP_HIGH)
|
|
||||||
oven_pid_report_error(OVEN_PID_ERR_OVERTEMP);
|
|
||||||
|
|
||||||
if (safety_adc_result & SAFETY_ADC_CHECK_VREF_LOW ||
|
|
||||||
safety_adc_result & SAFETY_ADC_CHECK_VREF_HIGH)
|
|
||||||
oven_pid_report_error(OVEN_PID_ERR_VREF_TOL);
|
|
||||||
|
|
||||||
if (safety_adc_result & SAFETY_ADC_INTERNAL_ERROR)
|
|
||||||
oven_pid_report_error(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
{
|
||||||
bool sd_card_mounted = false;
|
bool sd_card_mounted = false;
|
||||||
shellmatta_handle_t shell_handle;
|
shellmatta_handle_t shell_handle;
|
||||||
@ -221,8 +213,6 @@ int main(void)
|
|||||||
zero_ccm_ram();
|
zero_ccm_ram();
|
||||||
setup_system();
|
setup_system();
|
||||||
|
|
||||||
global_error_state = false;
|
|
||||||
|
|
||||||
shell_handle = shell_init(write_shell_callback);
|
shell_handle = shell_init(write_shell_callback);
|
||||||
shell_print_motd(shell_handle);
|
shell_print_motd(shell_handle);
|
||||||
|
|
||||||
@ -231,26 +221,41 @@ int main(void)
|
|||||||
|
|
||||||
pid_status = oven_pid_get_status();
|
pid_status = oven_pid_get_status();
|
||||||
|
|
||||||
if (systick_ticks_have_passed(quarter_sec_timestamp, 250)) {
|
if(systick_ticks_have_passed(quarter_sec_timestamp, 250)) {
|
||||||
|
safety_adc_status = handle_safety_adc();
|
||||||
quarter_sec_timestamp = systick_get_global_tick();
|
quarter_sec_timestamp = systick_get_global_tick();
|
||||||
|
|
||||||
(void)handle_safety_adc();
|
if (safety_adc_status & SAFETY_ADC_CHECK_TEMP_LOW || safety_adc_status & SAFETY_ADC_CHECK_TEMP_HIGH) {
|
||||||
propagate_safety_adc_error_to_oven_pid();
|
oven_pid_report_error(OVEN_PID_ERR_OVERTEMP);
|
||||||
|
}
|
||||||
|
|
||||||
if (global_error_state)
|
if (safety_adc_status & SAFETY_ADC_CHECK_VREF_LOW || safety_adc_status & SAFETY_ADC_CHECK_VREF_HIGH) {
|
||||||
|
oven_pid_report_error(OVEN_PID_ERR_VREF_TOL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (safety_adc_status & SAFETY_ADC_INTERNAL_ERROR) {
|
||||||
|
oven_pid_report_error(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (error_state) {
|
||||||
led_set(0, !led_get(0));
|
led_set(0, !led_get(0));
|
||||||
else
|
} else {
|
||||||
led_set(0, 0);
|
led_set(0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
pt1000_status = adc_pt1000_check_error();
|
pt1000_status = adc_pt1000_check_error();
|
||||||
global_error_state = pid_status->error_set || !!safety_adc_get_errors() || !!pt1000_status;
|
|
||||||
|
}
|
||||||
|
|
||||||
|
error_state = pid_status->aborted | !!safety_adc_status | !!pt1000_status;
|
||||||
|
|
||||||
menu_wait_request = reflow_menu_handle();
|
menu_wait_request = reflow_menu_handle();
|
||||||
|
|
||||||
/* Deactivate oven output in case of error! */
|
/* Deactivate oven output in case of error! */
|
||||||
if (!pid_status->active || global_error_state)
|
if (!pid_status->active || pid_status->aborted || error_state) {
|
||||||
|
oven_pid_stop();
|
||||||
oven_driver_set_power(0U);
|
oven_driver_set_power(0U);
|
||||||
|
}
|
||||||
|
|
||||||
handle_shell_uart_input(shell_handle);
|
handle_shell_uart_input(shell_handle);
|
||||||
|
|
||||||
@ -259,7 +264,6 @@ int main(void)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void sdio_wait_ms(uint32_t ms)
|
void sdio_wait_ms(uint32_t ms)
|
||||||
@ -267,12 +271,12 @@ void sdio_wait_ms(uint32_t ms)
|
|||||||
systick_wait_ms(ms);
|
systick_wait_ms(ms);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DMA2_Stream7_IRQHandler(void)
|
void DMA2_Stream7_IRQHandler()
|
||||||
{
|
{
|
||||||
uint32_t hisr = DMA2->HISR;
|
uint32_t hisr = DMA2->HISR;
|
||||||
|
|
||||||
DMA2->HIFCR = hisr;
|
DMA2->HIFCR = hisr;
|
||||||
|
|
||||||
if (hisr & DMA_HISR_TCIF7)
|
if (hisr & DMA_HISR_TCIF7) {
|
||||||
uart_tx_dma_complete_int_callback(&shell_uart);
|
uart_tx_dma_complete_int_callback(&shell_uart);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@ static struct pid_controller oven_pid;
|
|||||||
|
|
||||||
static struct oven_pid_status oven_pid_current_status = {
|
static struct oven_pid_status oven_pid_current_status = {
|
||||||
.active = false,
|
.active = false,
|
||||||
.error_set = false,
|
.aborted = false,
|
||||||
.target_temp = 0.0f,
|
.target_temp = 0.0f,
|
||||||
.current_temp = 0.0f,
|
.current_temp = 0.0f,
|
||||||
.timestamp_last_run = 0ULL
|
.timestamp_last_run = 0ULL
|
||||||
@ -71,17 +71,6 @@ void oven_driver_disable()
|
|||||||
rcc_manager_disable_clock(&RCC->APB1ENR, BITMASK_TO_BITNO(OVEN_CONTROLLER_TIM_RCC_MASK));
|
rcc_manager_disable_clock(&RCC->APB1ENR, BITMASK_TO_BITNO(OVEN_CONTROLLER_TIM_RCC_MASK));
|
||||||
}
|
}
|
||||||
|
|
||||||
void oven_pid_ack_errors(void)
|
|
||||||
{
|
|
||||||
oven_pid_current_status.error_set = false;
|
|
||||||
oven_pid_current_status.error_flags.vref_tol = false;
|
|
||||||
oven_pid_current_status.error_flags.pt1000_other = false;
|
|
||||||
oven_pid_current_status.error_flags.generic_error = false;
|
|
||||||
oven_pid_current_status.error_flags.pt1000_adc_off = false;
|
|
||||||
oven_pid_current_status.error_flags.controller_overtemp = false;
|
|
||||||
oven_pid_current_status.error_flags.pt1000_adc_watchdog = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void oven_pid_init(struct pid_controller *controller_to_copy)
|
void oven_pid_init(struct pid_controller *controller_to_copy)
|
||||||
{
|
{
|
||||||
pid_copy(&oven_pid, controller_to_copy);
|
pid_copy(&oven_pid, controller_to_copy);
|
||||||
@ -89,7 +78,12 @@ void oven_pid_init(struct pid_controller *controller_to_copy)
|
|||||||
oven_pid.output_sat_max = 100.0f;
|
oven_pid.output_sat_max = 100.0f;
|
||||||
oven_pid_current_status.timestamp_last_run = 0ULL;
|
oven_pid_current_status.timestamp_last_run = 0ULL;
|
||||||
oven_pid_current_status.active = true;
|
oven_pid_current_status.active = true;
|
||||||
oven_pid_ack_errors();
|
oven_pid_current_status.error_flags.vref_tol = false;
|
||||||
|
oven_pid_current_status.error_flags.pt1000_other = false;
|
||||||
|
oven_pid_current_status.error_flags.generic_error = false;
|
||||||
|
oven_pid_current_status.error_flags.pt1000_adc_off = false;
|
||||||
|
oven_pid_current_status.error_flags.controller_overtemp = false;
|
||||||
|
oven_pid_current_status.error_flags.pt1000_adc_watchdog = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void oven_pid_handle(float target_temp)
|
void oven_pid_handle(float target_temp)
|
||||||
@ -99,7 +93,7 @@ void oven_pid_handle(float target_temp)
|
|||||||
int resistance_status;
|
int resistance_status;
|
||||||
enum adc_pt1000_error pt1000_error;
|
enum adc_pt1000_error pt1000_error;
|
||||||
|
|
||||||
if (oven_pid_current_status.active && !oven_pid_current_status.error_set) {
|
if (oven_pid_current_status.active && !oven_pid_current_status.aborted) {
|
||||||
if (systick_ticks_have_passed(oven_pid_current_status.timestamp_last_run,
|
if (systick_ticks_have_passed(oven_pid_current_status.timestamp_last_run,
|
||||||
(uint64_t)(oven_pid.sample_period * 1000))) {
|
(uint64_t)(oven_pid.sample_period * 1000))) {
|
||||||
|
|
||||||
@ -133,7 +127,7 @@ void oven_pid_report_error(enum oven_pid_error_report report)
|
|||||||
struct oven_pid_errors *e = &oven_pid_current_status.error_flags;
|
struct oven_pid_errors *e = &oven_pid_current_status.error_flags;
|
||||||
|
|
||||||
oven_pid_current_status.active = false;
|
oven_pid_current_status.active = false;
|
||||||
oven_pid_current_status.error_set = true;
|
oven_pid_current_status.aborted = true;
|
||||||
|
|
||||||
if (report == 0) {
|
if (report == 0) {
|
||||||
e->generic_error = true;
|
e->generic_error = true;
|
||||||
|
@ -23,24 +23,10 @@
|
|||||||
#include <helper-macros/helper-macros.h>
|
#include <helper-macros/helper-macros.h>
|
||||||
#include <stm-periph/clock-enable-manager.h>
|
#include <stm-periph/clock-enable-manager.h>
|
||||||
|
|
||||||
enum safety_adc_check_result global_safety_adc_status;
|
|
||||||
|
|
||||||
enum safety_adc_check_result safety_adc_get_errors()
|
|
||||||
{
|
|
||||||
return global_safety_adc_status;
|
|
||||||
}
|
|
||||||
|
|
||||||
void safety_adc_clear_errors(void)
|
|
||||||
{
|
|
||||||
global_safety_adc_status = SAFETY_ADC_CHECK_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
void safety_adc_init()
|
void safety_adc_init()
|
||||||
{
|
{
|
||||||
rcc_manager_enable_clock(&RCC->APB2ENR, BITMASK_TO_BITNO(SAFETY_ADC_ADC_RCC_MASK));
|
rcc_manager_enable_clock(&RCC->APB2ENR, BITMASK_TO_BITNO(SAFETY_ADC_ADC_RCC_MASK));
|
||||||
|
|
||||||
safety_adc_clear_errors();
|
|
||||||
|
|
||||||
/* Enable temperature and VREFINT measurement */
|
/* Enable temperature and VREFINT measurement */
|
||||||
ADC->CCR |= ADC_CCR_TSVREFE;
|
ADC->CCR |= ADC_CCR_TSVREFE;
|
||||||
|
|
||||||
@ -131,17 +117,16 @@ void safety_adc_trigger_meas(enum safety_adc_meas_channel measurement)
|
|||||||
SAFETY_ADC_ADC_PERIPHERAL->CR2 |= ADC_CR2_SWSTART;
|
SAFETY_ADC_ADC_PERIPHERAL->CR2 |= ADC_CR2_SWSTART;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint16_t safety_vref_meas_raw;
|
static volatile uint16_t safety_vref_meas_raw;
|
||||||
static bool safety_vref_valid = false;
|
static volatile bool safety_vref_valid = false;
|
||||||
static uint16_t safety_temp_meas_raw;
|
static volatile uint16_t safety_temp_meas_raw;
|
||||||
static bool safety_temp_valid = false;
|
static volatile bool safety_temp_valid = false;
|
||||||
static float safety_vref;
|
static float safety_vref;
|
||||||
static float safety_temp;
|
static float safety_temp;
|
||||||
|
|
||||||
enum safety_adc_check_result handle_safety_adc()
|
enum safety_adc_check_result handle_safety_adc()
|
||||||
{
|
{
|
||||||
static enum safety_adc_meas_channel safety_meas_channel = SAFETY_ADC_MEAS_VREF;
|
static enum safety_adc_meas_channel safety_meas_channel = SAFETY_ADC_MEAS_VREF;
|
||||||
enum safety_adc_check_result check_result;
|
|
||||||
uint16_t result;
|
uint16_t result;
|
||||||
int poll_status;
|
int poll_status;
|
||||||
|
|
||||||
@ -168,13 +153,10 @@ enum safety_adc_check_result handle_safety_adc()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (safety_temp_valid && safety_vref_valid) {
|
if (safety_temp_valid && safety_vref_valid) {
|
||||||
check_result = safety_adc_check_results(safety_vref_meas_raw, safety_temp_meas_raw, &safety_vref, &safety_temp);
|
return safety_adc_check_results(safety_vref_meas_raw, safety_temp_meas_raw, &safety_vref, &safety_temp);
|
||||||
global_safety_adc_status |= check_result;
|
|
||||||
} else {
|
} else {
|
||||||
check_result = SAFETY_ADC_CHECK_OK;
|
return SAFETY_ADC_CHECK_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
return check_result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
float safety_adc_get_temp()
|
float safety_adc_get_temp()
|
||||||
|
@ -361,20 +361,6 @@ static shellmatta_retCode_t shell_cmd_safety_adc(const shellmatta_handle_t handl
|
|||||||
shellmatta_printf(handle, "VREF:\t%8.2f\tmV\r\n", safety_adc_get_vref());
|
shellmatta_printf(handle, "VREF:\t%8.2f\tmV\r\n", safety_adc_get_vref());
|
||||||
shellmatta_printf(handle, "TEMP:\t%8.2f\tdeg. Celsius\r\n", safety_adc_get_temp());
|
shellmatta_printf(handle, "TEMP:\t%8.2f\tdeg. Celsius\r\n", safety_adc_get_temp());
|
||||||
|
|
||||||
shellmatta_printf(handle, "Errors:\t%X", safety_adc_get_errors());
|
|
||||||
|
|
||||||
return SHELLMATTA_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static shellmatta_retCode_t shell_cmd_safety_adc_clear_error(const shellmatta_handle_t handle, const char *arguments,
|
|
||||||
uint32_t length)
|
|
||||||
{
|
|
||||||
(void)length;
|
|
||||||
(void)arguments;
|
|
||||||
(void)handle;
|
|
||||||
|
|
||||||
safety_adc_clear_errors();
|
|
||||||
|
|
||||||
return SHELLMATTA_OK;
|
return SHELLMATTA_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -388,7 +374,7 @@ static shellmatta_retCode_t shell_cmd_safety_adc_clear_error(const shellmatta_ha
|
|||||||
// 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[15] = {
|
static shellmatta_cmd_t cmd[14] = {
|
||||||
{
|
{
|
||||||
.cmd = "version",
|
.cmd = "version",
|
||||||
.cmdAlias = "ver",
|
.cmdAlias = "ver",
|
||||||
@ -499,14 +485,6 @@ static shellmatta_cmd_t cmd[15] = {
|
|||||||
.helpText = "",
|
.helpText = "",
|
||||||
.usageText = "",
|
.usageText = "",
|
||||||
.cmdFct = shell_cmd_safety_adc,
|
.cmdFct = shell_cmd_safety_adc,
|
||||||
.next = &cmd[14],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.cmd = "safety-adc-clear-error",
|
|
||||||
.cmdAlias = NULL,
|
|
||||||
.helpText = "",
|
|
||||||
.usageText = "",
|
|
||||||
.cmdFct = shell_cmd_safety_adc_clear_error,
|
|
||||||
.next = NULL,
|
.next = NULL,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
279
temp-profile-spec/.gitignore
vendored
Normal file
279
temp-profile-spec/.gitignore
vendored
Normal file
@ -0,0 +1,279 @@
|
|||||||
|
|
||||||
|
# Created by https://www.gitignore.io/api/latex
|
||||||
|
# Edit at https://www.gitignore.io/?templates=latex
|
||||||
|
|
||||||
|
### LaTeX ###
|
||||||
|
## Core latex/pdflatex auxiliary files:
|
||||||
|
*.aux
|
||||||
|
*.lof
|
||||||
|
*.log
|
||||||
|
*.lot
|
||||||
|
*.fls
|
||||||
|
*.out
|
||||||
|
*.toc
|
||||||
|
*.fmt
|
||||||
|
*.fot
|
||||||
|
*.cb
|
||||||
|
*.cb2
|
||||||
|
.*.lb
|
||||||
|
|
||||||
|
## Intermediate documents:
|
||||||
|
*.dvi
|
||||||
|
*.xdv
|
||||||
|
*-converted-to.*
|
||||||
|
# these rules might exclude image files for figures etc.
|
||||||
|
# *.ps
|
||||||
|
# *.eps
|
||||||
|
# *.pdf
|
||||||
|
|
||||||
|
## Generated if empty string is given at "Please type another file name for output:"
|
||||||
|
specification.pdf
|
||||||
|
|
||||||
|
## Bibliography auxiliary files (bibtex/biblatex/biber):
|
||||||
|
*.bbl
|
||||||
|
*.bcf
|
||||||
|
*.blg
|
||||||
|
*-blx.aux
|
||||||
|
*-blx.bib
|
||||||
|
*.run.xml
|
||||||
|
|
||||||
|
## Build tool auxiliary files:
|
||||||
|
*.fdb_latexmk
|
||||||
|
*.synctex
|
||||||
|
*.synctex(busy)
|
||||||
|
*.synctex.gz
|
||||||
|
*.synctex.gz(busy)
|
||||||
|
*.pdfsync
|
||||||
|
|
||||||
|
## Build tool directories for auxiliary files
|
||||||
|
# latexrun
|
||||||
|
latex.out/
|
||||||
|
|
||||||
|
## Auxiliary and intermediate files from other packages:
|
||||||
|
# algorithms
|
||||||
|
*.alg
|
||||||
|
*.loa
|
||||||
|
|
||||||
|
# achemso
|
||||||
|
acs-*.bib
|
||||||
|
|
||||||
|
# amsthm
|
||||||
|
*.thm
|
||||||
|
|
||||||
|
# beamer
|
||||||
|
*.nav
|
||||||
|
*.pre
|
||||||
|
*.snm
|
||||||
|
*.vrb
|
||||||
|
|
||||||
|
# changes
|
||||||
|
*.soc
|
||||||
|
|
||||||
|
# comment
|
||||||
|
*.cut
|
||||||
|
|
||||||
|
# cprotect
|
||||||
|
*.cpt
|
||||||
|
|
||||||
|
# elsarticle (documentclass of Elsevier journals)
|
||||||
|
*.spl
|
||||||
|
|
||||||
|
# endnotes
|
||||||
|
*.ent
|
||||||
|
|
||||||
|
# fixme
|
||||||
|
*.lox
|
||||||
|
|
||||||
|
# feynmf/feynmp
|
||||||
|
*.mf
|
||||||
|
*.mp
|
||||||
|
*.t[1-9]
|
||||||
|
*.t[1-9][0-9]
|
||||||
|
*.tfm
|
||||||
|
|
||||||
|
#(r)(e)ledmac/(r)(e)ledpar
|
||||||
|
*.end
|
||||||
|
*.?end
|
||||||
|
*.[1-9]
|
||||||
|
*.[1-9][0-9]
|
||||||
|
*.[1-9][0-9][0-9]
|
||||||
|
*.[1-9]R
|
||||||
|
*.[1-9][0-9]R
|
||||||
|
*.[1-9][0-9][0-9]R
|
||||||
|
*.eledsec[1-9]
|
||||||
|
*.eledsec[1-9]R
|
||||||
|
*.eledsec[1-9][0-9]
|
||||||
|
*.eledsec[1-9][0-9]R
|
||||||
|
*.eledsec[1-9][0-9][0-9]
|
||||||
|
*.eledsec[1-9][0-9][0-9]R
|
||||||
|
|
||||||
|
# glossaries
|
||||||
|
*.acn
|
||||||
|
*.acr
|
||||||
|
*.glg
|
||||||
|
*.glo
|
||||||
|
*.gls
|
||||||
|
*.glsdefs
|
||||||
|
|
||||||
|
# uncomment this for glossaries-extra (will ignore makeindex's style files!)
|
||||||
|
# *.ist
|
||||||
|
|
||||||
|
# gnuplottex
|
||||||
|
*-gnuplottex-*
|
||||||
|
|
||||||
|
# gregoriotex
|
||||||
|
*.gaux
|
||||||
|
*.gtex
|
||||||
|
|
||||||
|
# htlatex
|
||||||
|
*.4ct
|
||||||
|
*.4tc
|
||||||
|
*.idv
|
||||||
|
*.lg
|
||||||
|
*.trc
|
||||||
|
*.xref
|
||||||
|
|
||||||
|
# hyperref
|
||||||
|
*.brf
|
||||||
|
|
||||||
|
# knitr
|
||||||
|
*-concordance.tex
|
||||||
|
# TODO Comment the next line if you want to keep your tikz graphics files
|
||||||
|
*.tikz
|
||||||
|
*-tikzDictionary
|
||||||
|
|
||||||
|
# listings
|
||||||
|
*.lol
|
||||||
|
|
||||||
|
# luatexja-ruby
|
||||||
|
*.ltjruby
|
||||||
|
|
||||||
|
# makeidx
|
||||||
|
*.idx
|
||||||
|
*.ilg
|
||||||
|
*.ind
|
||||||
|
|
||||||
|
# minitoc
|
||||||
|
*.maf
|
||||||
|
*.mlf
|
||||||
|
*.mlt
|
||||||
|
*.mtc[0-9]*
|
||||||
|
*.slf[0-9]*
|
||||||
|
*.slt[0-9]*
|
||||||
|
*.stc[0-9]*
|
||||||
|
|
||||||
|
# minted
|
||||||
|
_minted*
|
||||||
|
*.pyg
|
||||||
|
|
||||||
|
# morewrites
|
||||||
|
*.mw
|
||||||
|
|
||||||
|
# nomencl
|
||||||
|
*.nlg
|
||||||
|
*.nlo
|
||||||
|
*.nls
|
||||||
|
|
||||||
|
# pax
|
||||||
|
*.pax
|
||||||
|
|
||||||
|
# pdfpcnotes
|
||||||
|
*.pdfpc
|
||||||
|
|
||||||
|
# sagetex
|
||||||
|
*.sagetex.sage
|
||||||
|
*.sagetex.py
|
||||||
|
*.sagetex.scmd
|
||||||
|
|
||||||
|
# scrwfile
|
||||||
|
*.wrt
|
||||||
|
|
||||||
|
# sympy
|
||||||
|
*.sout
|
||||||
|
*.sympy
|
||||||
|
sympy-plots-for-*.tex/
|
||||||
|
|
||||||
|
# pdfcomment
|
||||||
|
*.upa
|
||||||
|
*.upb
|
||||||
|
|
||||||
|
# pythontex
|
||||||
|
*.pytxcode
|
||||||
|
pythontex-files-*/
|
||||||
|
|
||||||
|
# tcolorbox
|
||||||
|
*.listing
|
||||||
|
|
||||||
|
# thmtools
|
||||||
|
*.loe
|
||||||
|
|
||||||
|
# TikZ & PGF
|
||||||
|
*.dpth
|
||||||
|
*.md5
|
||||||
|
*.auxlock
|
||||||
|
|
||||||
|
# todonotes
|
||||||
|
*.tdo
|
||||||
|
|
||||||
|
# vhistory
|
||||||
|
*.hst
|
||||||
|
*.ver
|
||||||
|
|
||||||
|
# easy-todo
|
||||||
|
*.lod
|
||||||
|
|
||||||
|
# xcolor
|
||||||
|
*.xcp
|
||||||
|
|
||||||
|
# xmpincl
|
||||||
|
*.xmpi
|
||||||
|
|
||||||
|
# xindy
|
||||||
|
*.xdy
|
||||||
|
|
||||||
|
# xypic precompiled matrices
|
||||||
|
*.xyc
|
||||||
|
|
||||||
|
# endfloat
|
||||||
|
*.ttt
|
||||||
|
*.fff
|
||||||
|
|
||||||
|
# Latexian
|
||||||
|
TSWLatexianTemp*
|
||||||
|
|
||||||
|
## Editors:
|
||||||
|
# WinEdt
|
||||||
|
*.bak
|
||||||
|
*.sav
|
||||||
|
|
||||||
|
# Texpad
|
||||||
|
.texpadtmp
|
||||||
|
|
||||||
|
# LyX
|
||||||
|
*.lyx~
|
||||||
|
|
||||||
|
# Kile
|
||||||
|
*.backup
|
||||||
|
|
||||||
|
# KBibTeX
|
||||||
|
*~[0-9]*
|
||||||
|
|
||||||
|
# auto folder when using emacs and auctex
|
||||||
|
./auto/*
|
||||||
|
*.el
|
||||||
|
|
||||||
|
# expex forward references with \gathertags
|
||||||
|
*-tags.tex
|
||||||
|
|
||||||
|
# standalone packages
|
||||||
|
*.sta
|
||||||
|
|
||||||
|
### LaTeX Patch ###
|
||||||
|
# glossaries
|
||||||
|
*.glstex
|
||||||
|
|
||||||
|
# Version File
|
||||||
|
*.ver
|
||||||
|
*.commit
|
||||||
|
*.branch
|
||||||
|
# End of https://www.gitignore.io/api/latex
|
10
temp-profile-spec/Makefile
Normal file
10
temp-profile-spec/Makefile
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
target=specification
|
||||||
|
|
||||||
|
.PHONY: $(target).pdf all clean
|
||||||
|
|
||||||
|
all: $(target).pdf
|
||||||
|
|
||||||
|
$(target).pdf: $(target).tex
|
||||||
|
latexmk -pdf -pdflatex="pdflatex -interaction=nostopmode -shell-escape" -use-make $^
|
||||||
|
clean:
|
||||||
|
latexmk -CA
|
BIN
temp-profile-spec/img/shimatta-logo.pdf
Normal file
BIN
temp-profile-spec/img/shimatta-logo.pdf
Normal file
Binary file not shown.
172
temp-profile-spec/specification.tex
Normal file
172
temp-profile-spec/specification.tex
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
\documentclass[12pt,a4paper,oneside,notitlepage, numbers=noenddot,openany]{scrreprt}
|
||||||
|
\usepackage[a4paper]{geometry}
|
||||||
|
\geometry{verbose,tmargin=2.5cm,bmargin=4.5cm,lmargin=2.5cm,rmargin=2.5cm}
|
||||||
|
\setlength{\parindent}{0cm}
|
||||||
|
\usepackage{array}
|
||||||
|
\usepackage{textcomp}
|
||||||
|
\usepackage{float}
|
||||||
|
\usepackage{graphicx}
|
||||||
|
\usepackage{caption}
|
||||||
|
%\usepackage{subcaption}
|
||||||
|
%\usepackage{textgreek}
|
||||||
|
\usepackage{setspace}
|
||||||
|
\usepackage{nomencl}
|
||||||
|
\usepackage{listing}
|
||||||
|
\usepackage{tabularx}
|
||||||
|
\PassOptionsToPackage{hyphens}{url}
|
||||||
|
\usepackage[%
|
||||||
|
pdftitle={Temperature Profile File Specification},%
|
||||||
|
pdfauthor={Mario Huettel},%
|
||||||
|
pdfsubject={},%
|
||||||
|
pdfcreator={pdflatex, LaTeX with KOMA-Script},%
|
||||||
|
pdfpagemode=UseOutlines, % Beim Oeffnen Inhaltsverzeichnis anzeigen
|
||||||
|
pdfdisplaydoctitle=true, % Dokumenttitel statt Dateiname anzeigen.
|
||||||
|
pdflang=de, % Sprache des Dokuments.
|
||||||
|
%plainpages=false,
|
||||||
|
]{hyperref}
|
||||||
|
|
||||||
|
\immediate\write18{git describe --always --long --dirty > \jobname.ver}
|
||||||
|
\immediate\write18{git rev-parse --verify HEAD > \jobname.commit}
|
||||||
|
\immediate\write18{git rev-parse --abbrev-ref HEAD > \jobname.branch}
|
||||||
|
|
||||||
|
\usepackage[automark,headsepline,plainheadsepline,footsepline,plainfootsepline,autooneside=true]{scrlayer-scrpage}
|
||||||
|
\clearpairofpagestyles
|
||||||
|
|
||||||
|
|
||||||
|
\hypersetup{%
|
||||||
|
colorlinks=true, % Aktivieren von farbigen Links im Dokument
|
||||||
|
linkcolor=blue, % Farbe festlegen
|
||||||
|
citecolor=green,
|
||||||
|
%filecolor,
|
||||||
|
%menucolor=black,
|
||||||
|
%urlcolor=cyan,
|
||||||
|
bookmarksnumbered=true%, % Überschriftsnummerierung im PDF Inhalt anzeigen.
|
||||||
|
%hidelinks=false
|
||||||
|
}
|
||||||
|
|
||||||
|
\usepackage{CJKutf8}
|
||||||
|
\newenvironment{Japanese}{%
|
||||||
|
\CJKfamily{min}%
|
||||||
|
\CJKtilde
|
||||||
|
\CJKnospace}{}
|
||||||
|
|
||||||
|
\usepackage{booktabs}
|
||||||
|
|
||||||
|
\usepackage{color}
|
||||||
|
%\usepackage{cite}
|
||||||
|
\usepackage{blindtext}
|
||||||
|
\usepackage[utf8]{inputenc}
|
||||||
|
\usepackage{multicol}
|
||||||
|
\usepackage{lastpage}
|
||||||
|
\usepackage[american]{babel}
|
||||||
|
\usepackage{amssymb}
|
||||||
|
\usepackage{datetime}
|
||||||
|
\usepackage[withpage,printonlyused]{acronym}
|
||||||
|
\usepackage{amsmath}
|
||||||
|
\usepackage{mathtools}
|
||||||
|
\usepackage{forloop}
|
||||||
|
\usepackage{csvsimple}
|
||||||
|
\usepackage{xspace}
|
||||||
|
%\setcounter{secnumdepth}{3}
|
||||||
|
%\setcounter{tocdepth}{3}
|
||||||
|
%\usepackage{apacite}
|
||||||
|
%\usepackage{natbib}
|
||||||
|
%\usepackage[babel,german=quotes]{csquotes}
|
||||||
|
\usepackage{xspace}
|
||||||
|
\usepackage{nth}
|
||||||
|
%\usepackage[backend=biber, style=apa, natbib, bibencoding=utf8]{biblatex}
|
||||||
|
%
|
||||||
|
%
|
||||||
|
%
|
||||||
|
%\addbibresource{lit.bib}
|
||||||
|
%\DeclareLanguageMapping{ngerman}{ngerman-apa}
|
||||||
|
%
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
\usepackage{enumitem}
|
||||||
|
\newcounter{reqcount}
|
||||||
|
\newlist{requirements}{description}{1}
|
||||||
|
\setlist[requirements,1]{%
|
||||||
|
before={%
|
||||||
|
\renewcommand*\thereqcount{\arabic{reqcount}}},
|
||||||
|
font={\bfseries\stepcounter{reqcount}REQ-\thereqcount:}
|
||||||
|
}
|
||||||
|
|
||||||
|
\newcommand{\newreq}{\bfseries\stepcounter{reqcount}REQ-\thereqcount:~}
|
||||||
|
|
||||||
|
|
||||||
|
\usepackage{xargs} % Use more than one optional parameter in a new commands
|
||||||
|
\usepackage[colorinlistoftodos,prependcaption,textsize=tiny]{todonotes}
|
||||||
|
\newcommandx{\unsure}[2][1=]{\todo[noline,linecolor=red,backgroundcolor=red!25,bordercolor=red,#1]{#2}}
|
||||||
|
\newcommandx{\miscite}[1][1=]{\todo[noline,linecolor=black,backgroundcolor=black!25,bordercolor=black]{Missing citation! #1}}
|
||||||
|
\newcommandx{\change}[2][1=]{\todo[noline,linecolor=blue,backgroundcolor=blue!25,bordercolor=blue,#1]{#2}}
|
||||||
|
\newcommandx{\info}[2][1=]{\todo[noline,linecolor=OliveGreen,backgroundcolor=OliveGreen!25,bordercolor=OliveGreen,#1]{#2}}
|
||||||
|
\newcommandx{\improvement}[2][1=]{\todo[noline,linecolor=Plum,backgroundcolor=Plum!25,bordercolor=Plum,#1]{#2}}
|
||||||
|
\newcommandx{\thiswillnotshow}[2][1=]{\todo[disable,#1]{#2}}
|
||||||
|
|
||||||
|
|
||||||
|
%Figure, table and listing enumeration style
|
||||||
|
\captionsetup{labelfont=bf}
|
||||||
|
\usepackage{chngcntr}
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
\clubpenalty10000
|
||||||
|
\widowpenalty10000
|
||||||
|
\displaywidowpenalty10000
|
||||||
|
|
||||||
|
%\counterwithout{figure}{part}
|
||||||
|
|
||||||
|
\ihead[Spec]{Spec}
|
||||||
|
|
||||||
|
\chead[\input{\jobname.ver}]{\input{\jobname.ver}}
|
||||||
|
\ohead{\headmark}
|
||||||
|
\ofoot[\pagemark]{\pagemark}
|
||||||
|
\cfoot[\url{https://git.shimatta.de/mhu/reflow-oven-control-sw}]{\url{https://git.shimatta.de/mhu/reflow-oven-control-sw}}
|
||||||
|
\setheadsepline{.5pt}
|
||||||
|
\setfootsepline{.5pt}
|
||||||
|
\BeforeStartingTOC{\thispagestyle{scrheadings}}
|
||||||
|
\pagestyle{scrheadings}
|
||||||
|
\thispagestyle{scrheadings}
|
||||||
|
\raggedbottom
|
||||||
|
\begin{document}
|
||||||
|
\pagenumbering{roman}
|
||||||
|
\begin{titlepage}
|
||||||
|
\begin{center}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
\resizebox{5cm}{!}{
|
||||||
|
\includegraphics{img/shimatta-logo}}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\vspace{10em}
|
||||||
|
|
||||||
|
\begin{Huge}
|
||||||
|
\sffamily\textbf{Temperature Profile File Specification}
|
||||||
|
\end{Huge}
|
||||||
|
|
||||||
|
\vspace{1cm}
|
||||||
|
|
||||||
|
\textbf{Version: \input{\jobname.ver}}
|
||||||
|
|
||||||
|
\vspace{3em}
|
||||||
|
|
||||||
|
\small\texttt{\input{\jobname.commit}/ \input{\jobname.branch}}
|
||||||
|
|
||||||
|
|
||||||
|
\end{center}
|
||||||
|
|
||||||
|
|
||||||
|
\end{titlepage}
|
||||||
|
|
||||||
|
\tableofcontents
|
||||||
|
\newpage
|
||||||
|
\thispagestyle{scrheadings}
|
||||||
|
\pagenumbering{arabic}
|
||||||
|
|
||||||
|
\chapter{Test}
|
||||||
|
|
||||||
|
\end{document}
|
Loading…
x
Reference in New Issue
Block a user