diff --git a/stm-firmware/digio.c b/stm-firmware/digio.c index a8c67e9..f6d67b2 100644 --- a/stm-firmware/digio.c +++ b/stm-firmware/digio.c @@ -52,17 +52,10 @@ static void digio_setup_pin_int(uint8_t bit_no, uint8_t in_out, uint8_t alt_func } -void digio_setup_default_all(void) +void digio_init(void) { - unsigned int i; - rcc_manager_enable_clock(&RCC->AHB1ENR, BITMASK_TO_BITNO(DIGIO_RCC_MASK)); - - for (i = 0; i < COUNT_OF(digio_pins); i++) { - digio_setup_pin_int(digio_pins[i], digio_default_io[i], digio_default_altfunc[i]); - if (digio_default_io[i] == 1) - digio_set(i, 0); - } + digio_set_default_values(); } void digio_setup_pin(uint8_t num, uint8_t in_out, uint8_t alt_func) @@ -74,12 +67,22 @@ void digio_setup_pin(uint8_t num, uint8_t in_out, uint8_t alt_func) void digio_set(uint8_t num, int val) { + uint8_t pin; + if (num >= COUNT_OF(digio_pins)) return; + + pin = digio_pins[num]; + + /* Check if port is an output. If not, do noting. */ + if ((DIGIO_PORT->MODER & (0x3<ODR |= (1<ODR |= (1<ODR &= ~(1<ODR &= ~(1<= 0x80 && mode <= 0x87) { + /* Alternate function */ + pin_mode = 2; + alt_func = mode - 0x80; + } else { + return; + } + + digio_setup_pin(digio_num, pin_mode, alt_func); +} + +bool cmd_digio_wait(uint8_t digio_num, uint8_t digio_state) +{ + bool advance = false; + int res; + + res = digio_get(digio_num); + if (res < 0 || (uint8_t)res == digio_state) + advance = true; + + return advance; +} + int temp_profile_executer_handle(void) { struct pl_command *current_cmd; @@ -250,6 +280,17 @@ int temp_profile_executer_handle(void) cmd_ack_flags(); advance = true; break; + case PL_DIGIO_CONF: + advance = true; + cmd_digio_conf((uint8_t)current_cmd->params[0], (uint8_t)current_cmd->params[1]); + break; + case PL_DIGIO_SET: + digio_set((uint8_t)current_cmd->params[0], current_cmd->params[1] ? 1u : 0u); + advance = true; + break; + case PL_DIGIO_WAIT: + advance = cmd_digio_wait((uint8_t)current_cmd->params[0], current_cmd->params[1] ? 1u : 0u); + break; default: tpe_abort(); advance = true; @@ -290,7 +331,9 @@ int temp_profile_executer_stop(void) if (command_list) temp_profile_free_command_list(&command_list); + /* Reset loudspeaker and reset default state of DIGIO channels */ loudspeaker_set(0); + digio_set_default_values(); return 0; } diff --git a/stm-firmware/temp-profile/temp-profile-parser.c b/stm-firmware/temp-profile/temp-profile-parser.c index a87e9b2..a48def7 100644 --- a/stm-firmware/temp-profile/temp-profile-parser.c +++ b/stm-firmware/temp-profile/temp-profile-parser.c @@ -48,6 +48,9 @@ static const struct pl_command_list_map cmd_list_map[_PL_NUM_CMDS] = { {PL_LOUDSPEAKER_SET, "beep", 1u}, {PL_OFF, "temp_off", 0u}, {PL_CLEAR_FLAGS, "clear_flags", 0u}, + {PL_DIGIO_CONF, "digio_conf", 2u}, + {PL_DIGIO_SET, "digio_set", 2u}, + {PL_DIGIO_WAIT, "digio_wait", 2u}, }; /**