/** ********************************************************************* * * @file testmode.c * @brief * * @date 2024-04-14 13:31:47 * @author CT * * @details Provides control of GPIO and communication bus's to evaluate board design * Commands available: * Enable/Disable PWR_HOLDUP output * Enable/Disable SD_PWR_EN output * Enable/Disable Radio_Wake output * Enable/Disable LED output * Enable/Disable RAM_CE output * Enable/Disable SD_CE output * Read BAT_V analog counts * Read temperature from SHT40 * Read relative humidity from SHT40 * Write arbitrary byte to external RAM * Read arbitrary address from external RAM * ************************************************************************* **/ #include #include #include #include "data_table.h" #include "testmode.h" /* * Interface: * Command line style * COMMAND: single byte * FLAGS: dash then single byte space separated modifiers * ARGUMENTS: variable length additional data for specific command * Example: Set LED high * W -1 3 */ /* * Command parser * Expects to be passed a single line stripped of EOL chars and null terminated */ void command_parser(char* input, uint32_t len) { uint32_t flags[8] = {0}; uint32_t flag_index = 0; uint32_t args[64] = {0}; uint32_t args_index = 0; bool next_is_flag = false; bool next_is_arg = false; if(0x00 == input[0]) { return; } uint8_t command = input[0]; for(uint32_t i = 1; i < len; i++) { if('-' == input[i]) { next_is_flag = true; } else if(next_is_flag) { flags[flag_index++] = input[i]; next_is_flag = false; } else if(' ' == input[i]) { next_is_arg = true; } else if(next_is_arg) { args[args_index++] = input[i]; next_is_arg = false; } } command_executor(command, flags, args); } /* * Executor * Takes the command, flags, and arguments and executes the command * Uses first flag and first arg only * TODO: expand to take multiple args */ void command_executor(uint8_t cmd, uint32_t* flags, uint32_t* args) { switch (cmd) { case TESTMODE_READ: // Read ignores flags switch (args[0]) { case TESTMODE_PWR_HOLDEUP: report(app_get_pwr_holdup()); break; default: break; } break; case TESTMODE_WRITE: break; default: break; } } /* Reports back the output of the last command */ void report(uint32_t val) { }