/** ****************************************************************************** * @file console.c * @author AMG Energy Solution Team * @version V1.0.0 * @date 07-Feb-2022 * @brief This file provides all the code of the debug console functions. ****************************************************************************** * @attention * * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. * *

© COPYRIGHT 2022 AMG

****************************************************************************** */ /** @addtogroup mBMS2 * @{ */ /* Includes ------------------------------------------------------------------*/ #ifdef CONSOLE_DEBUG #include "screen.h" #endif #include #include "console.h" #include "delay.h" #include "app_ver.h" #include "usart.h" #include "can.h" #include "relay.h" #include "brtc.h" #include "w25qxx.h" #include "flash_if.h" #include "asutil.h" #include "adc.h" #include "temp.h" #include "vi.h" #include "display_status.h" #include "dflash_sf1.h" #include "dflash_sbs.h" #include "dflash_chg_ctrl.h" #include "dflash_cal.h" #include "log.h" #include "afe_comm.h" #include "can_comm.h" #include "can_inv_data_process.h" #include "device_param.h" //#include "modbus.h" #include "io.h" #include "calc_soc.h" #include "task_manager.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ int8_t screenmode; uint8_t position; uint32_t BakOSCtxSwCtr; /* Counter of number of context switches */ uint32_t BakLocalTime; /* this variable is used to create a time reference incremented by 10ms */ uint8_t console_text[128]; uint8_t display_text[81]; /* Private prototype functions -----------------------------------------------*/ void DebugConsole(void); void Console(uint8_t *one); void Prompt(void); int8_t Process_Data(uint8_t *text, uint16_t size); int8_t Process_DataSet(uint8_t *text, uint16_t size); int8_t Process_CurrentDataSet(uint8_t *text, uint16_t size); int8_t Process_DataDiagnostic(uint8_t *text, uint16_t size); int8_t Process_DataNetSet(uint8_t *text, uint16_t size); int8_t Process_OSStatus(uint8_t *text, uint16_t size); int8_t Process_DataChgCtrlCfgSet(uint8_t *text, uint16_t size); extern void ff_process(void); void Console_Initial(void) { position = 0; screenmode = OP_MODE; } void AppTaskDebug(void) { InitTimer(); Console_Initial(); SOC_Init(); while (DEF_TRUE) { #ifdef CONSOLE_DEBUG DebugConsole(); #endif ProcessSOC(); if (device_status.battery_status.bit.INIT == true) { LoggingProcess(); SaveStoreSOC(); } /* Reload IWDG counter */ WDT_RefreshCounter(); delay_os_ms(1); } } #ifdef CONSOLE_DEBUG uint16_t debug_recv_data(uint8_t *data) { uint16_t len = 0; if (Debug_GetChar(data) == true) len = 1; return len; } void DebugConsole(void) { uint8_t one[20]; uint16_t i, len; len = debug_recv_data(one); for (i = 0; i < len; i++) { Console(&one[i]); } DisplayScreen(false); } void Console(uint8_t *one) { uint8_t i, ok; ok = 0; switch (one[0]) { case 0x0d: /* ENTER (CR) value */ if (position == 0) { ViewScreen(); Prompt(); /* Print prompt */ position = 0; for (i = 0; i < 80; i++) console_text[i] = 0x00; break; } switch (screenmode) { case OP_MODE: /* operating state */ ok = Process_Data(console_text, position); if (!ok) {UserMessage(" [Invalid Command]");} break; case SET_MODE: /* setting state */ ok = Process_DataSet(console_text, position); if (!ok) {UserMessage(" [Invalid Command]");} break; case OS_STATUS_MODE: /* OS Status */ ok = Process_OSStatus(console_text, position); if (!ok) {UserMessage(" [Invalid Command]");} break; case DIAG_MODE: /* diagnostic */ ok = Process_DataDiagnostic(console_text, position); if (!ok) {UserMessage(" [Invalid Command]");} break; case INVENTORY_MODE: ok = Process_InvDataSet(console_text, position); if (!ok) {UserMessage(" [Invalid Command]");} break; case SF1_MODE: ok = Process_DataSF1Set(console_text, position); if (!ok) {UserMessage(" [Invalid Command]");} break; case CHG_CTRL_CFG_MODE: ok = Process_DataChgCtrlCfgSet(console_text, position); if (!ok) {UserMessage(" [Invalid Command]");} break; case SBS_MODE: ok = Process_DataSBSSet(console_text, position); if (!ok) {UserMessage(" [Invalid Command]");} break; case CAL_MODE: ok = Process_DataCalSet(console_text, position); if (!ok) {UserMessage(" [Invalid Command]");} break; case CC_MODE: ok = Process_DataCcModeSet(console_text, position); if (!ok) {UserMessage(" [Invalid Command]");} break; case AFE_MODE: ok = Process_DataAfeModeSet(console_text, position); if (!ok) {UserMessage(" [Invalid Command]");} break; default: screenmode = OP_MODE; break; } Prompt(); position = 0; for (i = 0; i < 80; i++) { console_text[i] = 0x00; } break; case 0x08: /* BACKSPACE (BS) value */ case 0x7F: /* BACKSPACE (BS) value */ if (position > 0) { printf("%c %c", 0x08, 0x08); position--; } break; case 0x0A: /* enter */ break; default : if (one[0] >= 0x20) { printf("%c", one[0]); if (position < 80) { console_text[position++] = one[0]; console_text[position] = 0x00; } else { position = 0; Prompt(); for (i = 0; i < 80; i++) console_text[i] = 0x00; } } break; } } extern uint8_t relay_test_mode; extern uint8_t chg_relay_test; extern uint8_t dch_relay_test; extern uint8_t pre_relay_test; /* Command processing in OPERATING STATE */ int8_t Process_Data(uint8_t *text, uint16_t size) /* console_text[0]=0x00, size =0 (default) */ { int ret; if(size > 1) { if (text[1] != ' ') return(0); /* Invalid command if space is in first position */ } text[size] = 0x00; ret = 1; switch (text[0]) { case 's': screenmode = SET_MODE; ViewScreen(); break; case 'd': screenmode = DIAG_MODE; ViewScreen(); break; case 'a': screenmode = AFE_MODE; ViewScreen(); break; case '0': if (relay_test_mode) { relay_test_mode = false; } else { relay_test_mode = true; } break; case '1': if (chg_relay_test) { chg_relay_test = false; } else { chg_relay_test = true; } break; case '2': if (dch_relay_test) { dch_relay_test = false; } else { dch_relay_test = true; } break; case '3': if (pre_relay_test) { pre_relay_test = false; } else { pre_relay_test = true; } break; default: ret = 0; break; } return(ret); } /* Command processing in SETTING STATE */ int8_t Process_DataSet(uint8_t *text, uint16_t size) { uint16_t ret, i; /* Invalid command if space is in first position */ if (size > 1) if (text[1] != ' ') return(0); text[size] = 0x00; ret = 1; switch (text[0]) { case 'o': /* Switch to operating mode */ screenmode = OP_MODE; ViewScreen(); break; case 'd': /* Switch to diagnostic mode */ screenmode = DIAG_MODE; ViewScreen(); break; case 'z': screenmode = OS_STATUS_MODE; ViewScreen(); break; case '1': screenmode = SF1_MODE; ViewScreen(); break; case '2': screenmode = CHG_CTRL_CFG_MODE; ViewScreen(); break; case '3': screenmode = SBS_MODE; ViewScreen(); break; case '4': screenmode = CAL_MODE; ViewScreen(); break; case 'C': screenmode = CC_MODE; ViewScreen(); break; case '!': /* INIT */ Param_Init(true, false); Save_Param(); break; case 't': /* Date Time Set */ i = Set_Time(&text[2]); if (i == 0) UserMessage("COMMAND COMPLETE"); else if (i == 1) UserMessage("COMMAND FORMAT ERROR"); /* setting format error */ else UserMessage("COMMAND LIMIT ERROR"); /* setting limit error */ break; default : ret = 0; break; } return(ret); } // Command processing in OPERATING STATE int8_t Process_OSStatus(uint8_t *text, uint16_t size) // console_text[0]=0x00, size =0 (default) { int ret; if (size > 1) if (text[1] != ' ') return(0); /* Invalid command if space is in first position */ text[size] = 0x00; ret = 1; switch (text[0]) { case 'o': screenmode = OP_MODE; ViewScreen(); break; case 's': screenmode = SET_MODE; ViewScreen(); break; case 'd': screenmode = DIAG_MODE; ViewScreen(); break; default: ret = 0; break; } return(ret); } extern void RTC_TimeShow(void); /* Command processing in diagnostic mode */ int8_t Process_DataDiagnostic(uint8_t *text, uint16_t size) { int8_t ret; if (size > 1) { if (text[1] != ' ') { ret = 0; if (memcmp(text, "log start", 9) == 0) { LogEnable(5); ret = 1; } if (memcmp(text, "log stop", 8) == 0) { LogDisable(); ret = 1; } if (memcmp(text, "log print", 9) == 0) { LogPrint("0:/log/cyclelognow"); ret = 1; } if (memcmp(text, "log delete", 10) == 0) { LogDelete(); ret = 1; } return ret; } } text[size] = 0x00; ret = 1; uint32_t test = 0; switch (text[0]) { case 'o': /* Switch to operating mode */ screenmode = OP_MODE; ViewScreen(); break; case 's': /* Switch to setting status */ screenmode = SET_MODE; ViewScreen(); break; case 'I': screenmode = INVENTORY_MODE; ViewScreen(); break; case 'G' : /* Memory Dump */ if (size > 2) dump_mem(TextToAddr((uint8_t *)&text[2])); break; case '0': test = *(uint32_t *)(mBMS_FW_DN_ADDRESS + 4); printf(" mBMS_FW_DN_ADDRESS = %08X\r\n", test); break; // case '0': // case '1': // // PL455 COMM MONITOR // ret = DPl455CommCommand(text[0]); // break; case '2': case '3': // CAN COMM MONITOR ret = DCanCommCommand(text[0]); break; case 'a': // PrintTempAdData(6); DisplayAdc2DmaBufferValue(0); break; case 'b': // PrintTempAdData(7); DisplayAdc2DmaBufferValue(1); break; case 'c': printf("Relay Status1: %d\r\n", Relay_Status(DI_DISCHA_RELAY )); printf("Relay Status2: %d\r\n", Relay_Status(DI_CHARGE_RELAY )); printf("Relay Status3: %d\r\n", Relay_Status(DI_PRE_CHG_RELAY )); break; case 'f': ff_process(); break; case 'q': /* Exit Application */ UserMessage("Exit Application ? (Y or N)"); switch (WaitUserCMD((uint8_t *)"YyNn")) { case 1: case 2: UserMessage("System Reset !!"); delay_os_ms(500); NVIC_SystemReset(); while(1); case 3: case 4: UserMessage("Exit Application Cancel !!"); break; default: UserMessage("Command Timeout !!"); break; } break; default : ret = 0; break; } return(ret); } void Prompt() { uint8_t ver[4]; switch (screenmode) { case 0 : case 1 : case 2 : case 3 : case 4 : case 5 : case 6 : case 7 : case 8 : case 9 : case 10 : case 11 : case 12 : case 13 : case 14 : case 21 : case 22 : case 23 : case 24 : case 25 : case 26 : case 27 : case 28 : case 29 : case 30 : case 31 : case 32 : case 33 : case 34 : case 40 : case 41 : case 42 : case 100 : case 101 : GetAppVersion(ver); printf("%1c[%02d;%02dH", 0x1b, 23, 1); printf("%s %d.%d.%d.%d>" , BD_MODEL , ver[0] , ver[1] , ver[2] , ver[3] ); break; case GUI_MODE: break; default : GetAppVersion(ver); printf("%s %d.%d.%d.%d>" , BD_MODEL , ver[0] , ver[1] , ver[2] , ver[3] ); break; } } void DisplayScreen(uint8_t p) { switch(screenmode) { case OP_MODE: ODisplayAdcStatus(p); ODisplayDevice(p); ODisplayBalancingValue(p); ODisplayDateTime(p); break; case SET_MODE: SDisplayDateTime(p); break; case OS_STATUS_MODE: osDisplayTaskStatus(p); break; case DIAG_MODE: // DDisplay_Pl455Comm(p); DDisplay_CanComm(p); break; case SF1_MODE: SF1Display(p); break; case CHG_CTRL_CFG_MODE: ChgCfgDisplay(p); break; case SBS_MODE: SBSDisplay(p); break; case CAL_MODE: CalDisplay(p); SDisplayCurrentAdcRealValue(p); break; case CC_MODE: SDisplayCurrentStatus(p); break; case AFE_MODE: // AfeDisplayStatus(p); break; case INVENTORY_MODE: InvDataDisplay(p); break; } } void ViewScreen() /* Draw background screen according to Screen Mode */ { ClearConsol(); switch (screenmode) { case OP_MODE : /* View Status */ APPVerDisplay(); OmodeScreen(); break; case SET_MODE : /* View Setting Status */ SmodeScreen(); break; case OS_STATUS_MODE: /* View OS Task Status */ OSmodeScreen(); break; case DIAG_MODE: /* View Diagnostic Status */ DmodeScreen(); break; case SF1_MODE: SF1modeScreen(); break; case CHG_CTRL_CFG_MODE: ChgCtrlCfgmodeScreen(); break; case SBS_MODE: SBSmodeScreen(); break; case CAL_MODE: CalmodeScreen(); break; case CC_MODE: CcModeScreen(); break; case AFE_MODE: AfemodeScreen(); break; case INVENTORY_MODE: InvModeScreen(); break; default : printf("UNDEFINE SCREEN MODE"); screenmode = 0; break; } DisplayScreen(true); } #endif // #ifdef CONSOLE_DEBUG /*******************(C)COPYRIGHT 2022 AMG ********************END OF FILE******/