ME11B Sample Code in Maxim Integrated Team
Dependencies: BMI160 max32630hsp3 MemoryLCD USBDevice
Fork of Host_Software_MAX32664GWEB_HR_EXTENDED by
Diff: cmdUI/cmdInterface.cpp
- Revision:
- 0:ac4dea3e2894
diff -r 000000000000 -r ac4dea3e2894 cmdUI/cmdInterface.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cmdUI/cmdInterface.cpp Mon Mar 18 10:21:53 2019 +0300 @@ -0,0 +1,277 @@ +/* + * cmdInterface.cpp + * + * Created on: Jan 30, 2019 + * Author: Yagmur.Gok + */ + +#include <mbed.h> +#include "cmdInterface.h" +#include "SH_Max8614x_BareMetal.h" +#include "bootldrAPI.h" +#include "SHComm.h" +#include "demoDefinitions.h" + +static uint8_t hostOperatingMode = HOSTMODEAPPLICATION; +static uint8_t hostCommEchoMode = HOSTCOMMMODE_ECHO_OFF; + +/* @brief function to get the current operating mode of HOST: "APPMODE" or "BOOTLOADERMODE" + * associated with command: "get_host_opmode". + * + * @param[in] arg : NULL string, just to match the form of command table function pointer type + * + * */ +static int get_host_operating_mode(const char* arg){ + + int status = 0x00; + SERIALOUT("\r\n%s host_operating_mode=%s\r\n", "get_host_mode", (hostOperatingMode ==HOSTMODEAPPLICATION)? "APPMODE":"BOOTLOADERMODE" ); + return status; +} + +/* @brief function to set the current operating mode of HOST: "APPMODE" or "BOOTLOADERMODE" + * associated with command: "set_host_opmode". + * + * @param[in] arg: whole command string with argument included: "set_host_opmode X", X: 1 or 0 + * 0 : APPMODE + * 1 : BOOTLOADERMODE + * + * */ +static int set_host_operating_mode(const char* arg){ + + int status = -1; + uint32_t val; + if( sscanf(arg, "%*s %x", &val) == 1 ){ + hostOperatingMode = ( val > 0 )? HOSTMODEBOOTLOADER:HOSTMODEAPPLICATION; + + status = 0x00; + } + SERIALOUT("\r\n%s err=%d\r\n", "set_host_opmode", status); + return status; + +} + + +/* @brief function to get the current firmware version of Sensor Hub". + * + * @param[in] arg : NULL string, just to match the form of command table function pointer type + * + * */ +static int get_hub_firmware_version(const char* arg){ + + int idx; + int status = -1; + static const int MAXFWDESCSIZE = 5; + uint8_t descArray[MAXFWDESCSIZE]; + uint8_t descSz; + + status = sh_get_ss_fw_version( &descArray[0] , &descSz); + if(status == 0x00 && descSz > 0 && descSz < MAXFWDESCSIZE){ + SERIALOUT("\r\n Firmware Version of Sensor Hub is = "); + for(idx = 0 ; idx != descSz ; idx++) + SERIALOUT("%d.", descArray[idx]); + SERIALOUT("\r\n"); + } + + +} + +static int set_host_comm_echomode(const char* arg){ + + int status = -1; + uint32_t val; + if( sscanf(arg, "%*s %x", &val) == 1 ){ + hostCommEchoMode = ( val > 0 )? HOSTCOMMMODE_ECHO_ON:HOSTCOMMMODE_ECHO_OFF; + + status = 0x00; + } + SERIALOUT("\r\n%s err=%d\r\n", "set_host_comm_echomode", status); + return status; + +} + +/* +static int get_hub_operating_mode(const char* arg){ + + uint8_t hubMode; + int status = sh_get_sensorhub_operating_mode(&hubMode); + if( status == 0x00) + SERIALOUT("\r\n hub_operating_mode=%s\r\n", (hubMode == 0x00)? "APPMODE":"BOOTLOADERMODE" ); + else + SERIALOUT("\r\n%s err=%d\r\n", "get_sensorhub_opmode", status); + + return status; +}*/ + +//__attribute__((__always_inline__)) +uint8_t get_internal_operating_mode(void) { + + return hostOperatingMode; +} + + +/* HOST MCU related mode functions inoredr to keep application&bootloader side modular: + * + * 1. in app mode Host accepts commnands related to algo/ppg applications ( command table in SH_Max8614x_BareMetal.h) + * and does not check/relpy to bootloder related commnads + * + * 2. in bootloader mode Host accepts commands related to bootloader ( command table in bootldrAPI.h) only. + * + * */ +cmd_interface_t setCommEchoModeCMD = {"set_host_echomode" , set_host_comm_echomode , "enables/disables echoing of command console commands"}; +cmd_interface_t setHostModeCMD = {"set_host_opmode" , set_host_operating_mode , "sets mode of host to app or bootloader"}; +cmd_interface_t getHostModeCMD = {"get_host_opmode" , get_host_operating_mode , "gets mode of host app or bootloader"}; +cmd_interface_t getHubFwVersionCMD = {"get_hub_fwversion" , get_hub_firmware_version , "gets mode of host app or bootloader"}; +//cmd_interface_t getHubModeCMD = {"get_sensorhub_opmode", get_hub_operating_mode , "gets mode of host app or bootloader"}; + +/* @brief Compares two string to check whether they match. + * + * @param[in] str1, str2 : strings to compare + * + * */ + +static bool starts_with(const char* str1, const char* str2) +{ + while (*str1 && *str2) { + if (*str1 != *str2) + return false; + str1++; + str2++; + } + + if (*str2) + return false; + + return true; +} + + + +/** +* @brief Command parser and executer for user input commands +* @details Gets the command string from command builder, compares with the commands of defined command tables of 8614x and bootloader +* if found calls the function associated with the command, passsing the whole command string with arguments to the called +* function +* +* @param[in] cmd_str Input commnad from user. +*/ + +int parse_execute_command( const char *cmd_str) +{ + + int found = 0; + int tableIdx; + + if( starts_with(&cmd_str[0], setCommEchoModeCMD.cmdStr)) { + int status = setCommEchoModeCMD.execute(cmd_str); + if( status != 0x00){ + SERIALOUT("\r\n%s err=%d\r\n", "set_host_mode", COMM_INVALID_PARAM); + hostCommEchoMode = HOSTCOMMMODE_ECHO_OFF; + } + found = 1; + } + + if( starts_with(&cmd_str[0], setHostModeCMD.cmdStr)) { + int status = setHostModeCMD.execute(cmd_str); + if( status != 0x00){ + SERIALOUT("\r\n%s err=%d\r\n", "set_host_mode", COMM_INVALID_PARAM); + hostOperatingMode = HOSTMODEAPPLICATION; + } + found = 1; + } + + if( starts_with(&cmd_str[0], getHostModeCMD.cmdStr)) { + int status = getHostModeCMD.execute(cmd_str); + found = 1; + } + + if( starts_with(&cmd_str[0], getHubFwVersionCMD.cmdStr)) { + int status = getHubFwVersionCMD.execute(cmd_str); + found = 1; + } + + /* if( starts_with(&cmd_str[0], getHubModeCMD.cmdStr)) { + int status = getHubModeCMD.execute(cmd_str); + found = 1; + }*/ + + if( hostOperatingMode == HOSTMODEAPPLICATION) { + + tableIdx = NUMCMDS8614X; + do{ + tableIdx -= 1; + if (starts_with(&cmd_str[0], CMDTABLE8614x[tableIdx].cmdStr)){ + + CMDTABLE8614x[tableIdx].execute(cmd_str); + /*MYG DEBUG8*/// SERIALPRINT("___SELECTED COMMAND IDX IS: %d \r\n", tableIdx); + SERIALOUT(" \r\n"); // Here is needed due to a bug on mbed serial! + found = 1; + } + + }while(tableIdx && found == 0 ); + + } + + if( hostOperatingMode == HOSTMODEBOOTLOADER) { + + + tableIdx = NUMCMDSBOOTLDRAPI; + do{ + tableIdx -= 1; + if (starts_with(&cmd_str[0], CMDTABLEBOOTLDR[tableIdx].cmdStr)){ + + CMDTABLEBOOTLDR[tableIdx].execute(cmd_str); + /*MYG DEBUG8*/// SERIALPRINT("___SELECTED COMMAND IDX IS: %d \r\n", tableIdx); + SERIALOUT(" \r\n"); // Here is needed due to a bug on mbed serial! + found = 1; + } + + }while(tableIdx && found == 0 ); + } + + return found; +} + + +/** +* @brief Command builder from serial i/o device. +* @details Reads character and builds commands for application. +* +* @param[in] ch Input character from i/o device. +*/ +//__attribute__((__always_inline__)) +void cmdIntf_build_command(char ch) +{ + static char cmd_str[1024]; + static int cmd_idx = 0; + int status; + + if(hostCommEchoMode == HOSTCOMMMODE_ECHO_ON) + SERIALOUT("%c", ch); + + if (ch == 0x00) { + return; + } + + if ((ch == '\n') || (ch == '\r')) { + if (cmd_idx < 1024) + cmd_str[cmd_idx++] = '\0'; + status = parse_execute_command(cmd_str); + + //Clear cmd_str + while (cmd_idx > 0) + cmd_str[--cmd_idx] = '\0'; + + } else if ((ch == 0x08 || ch == 0x7F) && cmd_idx > 0) { + //Backspace character + if (cmd_idx > 0) + cmd_str[--cmd_idx] = '\0'; + } else { + + if (cmd_idx < 1024) + cmd_str[cmd_idx++] = ch; + } + +} + + +