/**
******************************************************************************
* @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******/