| 1 | #include "log_and_debug.h"
|
|---|
| 2 | #include "usbd_cdc_if.h"
|
|---|
| 3 | #include "cmsis_os.h"
|
|---|
| 4 | #include "ff.h"
|
|---|
| 5 | #include <stdarg.h>
|
|---|
| 6 | #include <string.h>
|
|---|
| 7 | #include <stdio.h>
|
|---|
| 8 | #include "Time.h"
|
|---|
| 9 | #include "lwip.h"
|
|---|
| 10 |
|
|---|
| 11 | #define debug_transmit(b, l) CDC_Transmit_FS(b, l);
|
|---|
| 12 |
|
|---|
| 13 | TaskHandle_t xTaskDebugAndLog;
|
|---|
| 14 | xSemaphoreHandle xMutexAccessUSB;
|
|---|
| 15 | xQueueHandle QueueReceiveUSB;
|
|---|
| 16 | extern network_settings table_network[MAX_IP];
|
|---|
| 17 | extern RealTimeClock_typeDef RealTimeClock;
|
|---|
| 18 | extern USBD_HandleTypeDef hUsbDeviceFS;
|
|---|
| 19 | extern ETH_HandleTypeDef heth;
|
|---|
| 20 |
|
|---|
| 21 | uint32_t state_level = 0x0001;
|
|---|
| 22 | char debug_buffer[2048];
|
|---|
| 23 |
|
|---|
| 24 | static void vDebugTask(void *arg);
|
|---|
| 25 | int str2int(char *par);
|
|---|
| 26 |
|
|---|
| 27 | void dcmd_help(uint32_t param);
|
|---|
| 28 | void dcmd_debug(uint32_t param);
|
|---|
| 29 | void dcmd_reboot(uint32_t param);
|
|---|
| 30 | void dcmd_date(uint32_t param);
|
|---|
| 31 | void dcmd_ifconfig(uint32_t param);
|
|---|
| 32 |
|
|---|
| 33 |
|
|---|
| 34 | void dcmd_log_read(uint32_t param);
|
|---|
| 35 | void dcmd_filesystem(uint32_t param);
|
|---|
| 36 |
|
|---|
| 37 | void dcmd_t(uint32_t param);
|
|---|
| 38 |
|
|---|
| 39 | CMD_STRUCT cmds[] = {
|
|---|
| 40 | {"help", dcmd_help, PARAM_INT},
|
|---|
| 41 | {"debug", dcmd_debug, PARAM_INT},
|
|---|
| 42 | {"reboot", dcmd_reboot, PARAM_INT},
|
|---|
| 43 | {"date", dcmd_date, PARAM_INT},
|
|---|
| 44 | {"ifconfig", dcmd_ifconfig, PARAM_INT},
|
|---|
| 45 |
|
|---|
| 46 |
|
|---|
| 47 | {"logread", dcmd_log_read, PARAM_INT},
|
|---|
| 48 | {"filesystem", dcmd_filesystem, PARAM_INT},
|
|---|
| 49 | {"t", dcmd_t, PARAM_INT},
|
|---|
| 50 | {NULL, NULL, NULL}
|
|---|
| 51 | };
|
|---|
| 52 |
|
|---|
| 53 | void __debug_init(void)
|
|---|
| 54 | {
|
|---|
| 55 | xMutexAccessUSB = xSemaphoreCreateMutex();
|
|---|
| 56 | QueueReceiveUSB = xQueueCreate(256, sizeof(uint8_t));
|
|---|
| 57 | xTaskCreate(vDebugTask, "debug streams", 512, NULL, 0, &xTaskDebugAndLog);
|
|---|
| 58 | }
|
|---|
| 59 |
|
|---|
| 60 | uint8_t debug_wait_transmit(void)
|
|---|
| 61 | {
|
|---|
| 62 | uint32_t count = 0;
|
|---|
| 63 | USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;
|
|---|
| 64 | if(hcdc == NULL) return 0;
|
|---|
| 65 | while(hcdc->TxState != 0){
|
|---|
| 66 | osDelay(1);
|
|---|
| 67 | if(count++ == 500)return 0;
|
|---|
| 68 | }
|
|---|
| 69 | return 1;
|
|---|
| 70 | }
|
|---|
| 71 |
|
|---|
| 72 | uint8_t __debug(uint32_t level, const char *format, ...)
|
|---|
| 73 | {
|
|---|
| 74 | uint32_t msg_len;
|
|---|
| 75 | if(xTaskDebugAndLog == NULL) return 0;
|
|---|
| 76 |
|
|---|
| 77 | if(state_level & level){
|
|---|
| 78 | xSemaphoreTake(xMutexAccessUSB, portMAX_DELAY);
|
|---|
| 79 | va_list args;
|
|---|
| 80 | va_start (args, format);
|
|---|
| 81 | vsprintf (debug_buffer, format, args);
|
|---|
| 82 | va_end (args);
|
|---|
| 83 | msg_len = strlen(debug_buffer);
|
|---|
| 84 | if(msg_len <= 0) {
|
|---|
| 85 | xSemaphoreGive(xMutexAccessUSB);
|
|---|
| 86 | return 0;
|
|---|
| 87 | }
|
|---|
| 88 | if(debug_wait_transmit()) debug_transmit((uint8_t*)debug_buffer, msg_len);
|
|---|
| 89 | xSemaphoreGive(xMutexAccessUSB);
|
|---|
| 90 | }
|
|---|
| 91 | return 1;
|
|---|
| 92 | }
|
|---|
| 93 |
|
|---|
| 94 | /* ------------------- Receive ---------------------*/
|
|---|
| 95 | void debug_receive(uint8_t *Buf, uint32_t *Len)
|
|---|
| 96 | {
|
|---|
| 97 | portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
|
|---|
| 98 | for(uint32_t i = 0; i < *Len; i++) xQueueSendFromISR(QueueReceiveUSB, &Buf[i], &xHigherPriorityTaskWoken);
|
|---|
| 99 | }
|
|---|
| 100 |
|
|---|
| 101 | static void vDebugTask(void *arg)
|
|---|
| 102 | {
|
|---|
| 103 | CMD_STRUCT *desc;
|
|---|
| 104 | uint32_t i, spacepos, cmd_len = 0, lenparam = 0, paramn;
|
|---|
| 105 | char receive_symbol;
|
|---|
| 106 | char cmd[CMDLEN], param[CMDLEN];
|
|---|
| 107 |
|
|---|
| 108 | for(;;){
|
|---|
| 109 | if(xQueueReceive(QueueReceiveUSB, &receive_symbol, portMAX_DELAY) == pdTRUE) {
|
|---|
| 110 | if (cmd_len >= CMDLEN) cmd_len = CMDLEN-1;
|
|---|
| 111 | if ((receive_symbol != 0x0D) && (receive_symbol != 0x0A && (receive_symbol != 0x08))){
|
|---|
| 112 | cmd[cmd_len] = receive_symbol;
|
|---|
| 113 | cmd_len++;
|
|---|
| 114 | if (cmd_len >= CMDLEN) cmd_len--;
|
|---|
| 115 | else debug_transmit((uint8_t*)&receive_symbol, 1);
|
|---|
| 116 | }
|
|---|
| 117 |
|
|---|
| 118 | if (receive_symbol == 0x08) {
|
|---|
| 119 | if (cmd_len > 0) cmd_len-- ;
|
|---|
| 120 | debug_transmit((uint8_t*)"\b \b", 3);
|
|---|
| 121 | }
|
|---|
| 122 | if ((receive_symbol == 0x0A)||(receive_symbol == 0x0D)) {
|
|---|
| 123 | cmd[cmd_len] = 0;
|
|---|
| 124 | debug_transmit((uint8_t*)"\r\n", 2);
|
|---|
| 125 | spacepos = 0;
|
|---|
| 126 | for (i = 0; i <= cmd_len; i++){
|
|---|
| 127 | if (cmd[i] == ' '){
|
|---|
| 128 | spacepos = i;
|
|---|
| 129 | break;
|
|---|
| 130 | }
|
|---|
| 131 | }
|
|---|
| 132 |
|
|---|
| 133 | if (spacepos>0) {
|
|---|
| 134 | for (i = spacepos + 1; i <= cmd_len; i++){
|
|---|
| 135 | param[i-spacepos-1] = cmd[i];
|
|---|
| 136 | }
|
|---|
| 137 | cmd[spacepos]=0;
|
|---|
| 138 | lenparam = cmd_len - (spacepos - 1);
|
|---|
| 139 | }
|
|---|
| 140 | else param[0] = 0;
|
|---|
| 141 | paramn = str2int(param);
|
|---|
| 142 | cmd_len = 0;
|
|---|
| 143 |
|
|---|
| 144 |
|
|---|
| 145 | for(desc = cmds; desc->cmd; desc++){
|
|---|
| 146 | if ((strcmp((char*)cmd, desc->cmd)) == 0){
|
|---|
| 147 | if(desc->typepar == PARAM_INT) desc->pfunc(paramn);
|
|---|
| 148 | if(desc->typepar == PARAM_STR) desc->pfunc(param, lenparam);
|
|---|
| 149 | break;
|
|---|
| 150 | }
|
|---|
| 151 | }
|
|---|
| 152 | if(desc->cmd == NULL)__debug(DEBUG_SERVSE, "Unknown cmd: %s\r\n",cmd);
|
|---|
| 153 | __debug(DEBUG_SERVSE, "cmd >");
|
|---|
| 154 | }
|
|---|
| 155 | }
|
|---|
| 156 | }
|
|---|
| 157 | }
|
|---|
| 158 |
|
|---|
| 159 | int str2int(char *par){
|
|---|
| 160 | int i, j, r = 0, len, dig;
|
|---|
| 161 | len=strlen(par);
|
|---|
| 162 | for (j = 0; j < len; j++) {
|
|---|
| 163 | dig = ((int)(par[j]) - 0x30);
|
|---|
| 164 | for (i = 0; i < (len - j - 1); i++) dig = dig * 10;;
|
|---|
| 165 | r = r + dig;
|
|---|
| 166 | }
|
|---|
| 167 | return r;
|
|---|
| 168 | }
|
|---|
| 169 |
|
|---|
| 170 | /* ----------------------------------------------------------------------------------------- */
|
|---|
| 171 | /* ######################################################################################### */
|
|---|
| 172 | void dcmd_help(uint32_t param){
|
|---|
| 173 | CMD_STRUCT *desc;
|
|---|
| 174 | param = param;
|
|---|
| 175 | __debug(DEBUG_SERVSE, "______________________\n\rCompiled: %s %s\n\r___commands:___\n\r", __DATE__, __TIME__);
|
|---|
| 176 |
|
|---|
| 177 | for(desc = cmds; desc->cmd; desc++)__debug(DEBUG_SERVSE, "%s\n\r", desc->cmd);
|
|---|
| 178 | }
|
|---|
| 179 |
|
|---|
| 180 | void dcmd_debug(uint32_t param)
|
|---|
| 181 | {
|
|---|
| 182 | if(param == NUM_LEVEL_DEBUG)param = 0;
|
|---|
| 183 |
|
|---|
| 184 | if(param != 0){
|
|---|
| 185 | state_level ^= (1 << param);
|
|---|
| 186 | param = 0;
|
|---|
| 187 | }
|
|---|
| 188 | if(param == 0){
|
|---|
| 189 | __debug(DEBUG_SERVSE, "CMD:debug\r\n\
|
|---|
| 190 | 1 - ETH %s\r\n\
|
|---|
| 191 | 2 - PLC CROSS %s\r\n\
|
|---|
| 192 | 3 - PLC TRANSIT %s\r\n\
|
|---|
| 193 | 4 - WEB SERVER %s\r\n\
|
|---|
| 194 | 5 - TEMP %s\r\n",
|
|---|
| 195 | (state_level & DEBUG_ETH) ? "on" : "off",
|
|---|
| 196 | (state_level & DEBUG_PLC_CROSS) ? "on" : "off",
|
|---|
| 197 | (state_level & DEBUG_PLC_TRANSIT) ? "on" : "off",
|
|---|
| 198 | (state_level & DEBUG_WEB_SERVER) ? "on" : "off",
|
|---|
| 199 | (state_level & DEBUG_TEMP) ? "on" : "off");
|
|---|
| 200 | return;
|
|---|
| 201 | }
|
|---|
| 202 | }
|
|---|
| 203 |
|
|---|
| 204 | void dcmd_reboot(uint32_t param)
|
|---|
| 205 | {
|
|---|
| 206 | switch(param){
|
|---|
| 207 | case 1:
|
|---|
| 208 | __debug(DEBUG_SERVSE, "Reboot S-Port\r\n");
|
|---|
| 209 | vTaskDelay(500);
|
|---|
| 210 | NVIC_SystemReset();
|
|---|
| 211 | break;
|
|---|
| 212 | case 2:
|
|---|
| 213 | __debug(DEBUG_SERVSE, "Reboot PHY\r\n");
|
|---|
| 214 | HAL_GPIO_WritePin(PHY_nRST_GPIO_Port, PHY_nRST_Pin, GPIO_PIN_RESET);
|
|---|
| 215 | osDelay(50);
|
|---|
| 216 | HAL_GPIO_WritePin(PHY_nRST_GPIO_Port, PHY_nRST_Pin, GPIO_PIN_SET);
|
|---|
| 217 | HAL_ETH_WritePHYRegister(&heth, 0x1B, 0x500); // link interrupt enable
|
|---|
| 218 | break;
|
|---|
| 219 | default: __debug(DEBUG_SERVSE, "CMD:Reboot\r\n\
|
|---|
| 220 | 1 - Reboot S-Port\r\n\
|
|---|
| 221 | 2 - Reboot PHY\r\n");
|
|---|
| 222 | }
|
|---|
| 223 | }
|
|---|
| 224 |
|
|---|
| 225 | void dcmd_filesystem(uint32_t param)
|
|---|
| 226 | {
|
|---|
| 227 | PWR->CR |= PWR_CR_DBP;
|
|---|
| 228 | RTC->BKP0R |= 0x01;
|
|---|
| 229 | PWR->CR &= ~PWR_CR_DBP;
|
|---|
| 230 | dcmd_reboot(1);
|
|---|
| 231 | }
|
|---|
| 232 |
|
|---|
| 233 | void dcmd_ifconfig(uint32_t param)
|
|---|
| 234 | {
|
|---|
| 235 | uint32_t RX_frames = 0, RX_error = 0, TX_frames = 0;
|
|---|
| 236 | uint32_t cnt = 0;
|
|---|
| 237 | char Sbuffer[512] = {0};
|
|---|
| 238 |
|
|---|
| 239 | cnt += sprintf(&Sbuffer[cnt], "\r\n# ifconfig eth0 inet %s netmask %s\r\n", table_network[0].ipv4_addr, table_network[0].ipv4_nm);
|
|---|
| 240 | cnt += sprintf(&Sbuffer[cnt], "# ifconfig eth0 %s\r\n# ifconfig\r\n", (table_network[0].netif.flags & NETIF_FLAG_UP) ? "up" : "down");
|
|---|
| 241 | cnt += sprintf(&Sbuffer[cnt], "eth0\tLink encap:Ethernet HWaddr 02:AD:C8:%02X:%02X:%02X \r\n", table_network[0].netif.hwaddr[3], table_network[0].netif.hwaddr[4], table_network[0].netif.hwaddr[5]);
|
|---|
| 242 | cnt += sprintf(&Sbuffer[cnt], "\tinet addr:%s Bcast:192.168.0.255 Mask:%s \r\n", table_network[0].ipv4_addr, table_network[0].ipv4_nm);
|
|---|
| 243 | cnt += sprintf(&Sbuffer[cnt], "\t%s BROADCAST RUNNING MULTICAST MTU:%d Metric:1 \r\n", (table_network[0].netif.flags & NETIF_FLAG_UP) ? "UP" : "DOWN", table_network[0].netif.mtu);
|
|---|
| 244 |
|
|---|
| 245 | RX_frames = ETH->MMCRGUFCR;
|
|---|
| 246 | RX_error = ETH->MMCRFCECR;
|
|---|
| 247 | cnt += sprintf(&Sbuffer[cnt], "\tRX packets:%d errors CRC:%d\r\n", RX_frames, RX_error);
|
|---|
| 248 | TX_frames = ETH->MMCTGFCR;
|
|---|
| 249 | cnt += sprintf(&Sbuffer[cnt], "\tTX packets:%d\r\n#\r\n", TX_frames);
|
|---|
| 250 |
|
|---|
| 251 | __debug(DEBUG_SERVSE, "%s", Sbuffer);
|
|---|
| 252 | }
|
|---|
| 253 |
|
|---|
| 254 | void dcmd_log_read(uint32_t param)
|
|---|
| 255 | {
|
|---|
| 256 | // FIL FlashFile;
|
|---|
| 257 | // uint32_t ByteRead = 0, ByteWritten = 0;
|
|---|
| 258 | // uint8_t buff[256] = {0};
|
|---|
| 259 | //
|
|---|
| 260 | // if((f_open(&FlashFile, "log.txt", FA_READ)) == FR_OK){
|
|---|
| 261 | // while(f_eof(&FlashFile) == 0){
|
|---|
| 262 | // f_lseek(&FlashFile, ByteRead);
|
|---|
| 263 | // f_read(&FlashFile, buff, 256, (UINT*)&ByteWritten);
|
|---|
| 264 | // ByteRead += 256;
|
|---|
| 265 | // __debug(DEBUG_SERVSE, (char*)buff);
|
|---|
| 266 | // }
|
|---|
| 267 | // f_close(&FlashFile);
|
|---|
| 268 | // }
|
|---|
| 269 | }
|
|---|
| 270 |
|
|---|
| 271 | void dcmd_date(uint32_t param)
|
|---|
| 272 | {
|
|---|
| 273 | __debug(DEBUG_SERVSE, "RTC: Data: %02d.%02d.%04d, Time: %02d:%02d:%02d\r\nRTC: Current flags: WDT -> %s; BAT_LOW -> %s; TMR -> %s; OSC_FAIL -> %s\r\n",
|
|---|
| 274 | RealTimeClock.Data.Day, RealTimeClock.Data.Month, RealTimeClock.Data.Year, RealTimeClock.Time.Hour, RealTimeClock.Time.Min, RealTimeClock.Time.Sec,
|
|---|
| 275 | (RealTimeClock.Flags.WDT) ? "true" : "false", (RealTimeClock.Flags.BAT_LOW) ? "true" : "false", (RealTimeClock.Flags.TMR) ? "true" : "false", (RealTimeClock.Flags.OSC_FAIL) ? "true" : "false");
|
|---|
| 276 | }
|
|---|
| 277 |
|
|---|
| 278 | FIL FlashFile;
|
|---|
| 279 |
|
|---|
| 280 | void dcmd_t(uint32_t param)
|
|---|
| 281 | {
|
|---|
| 282 | FATFS *fs;
|
|---|
| 283 | uint32_t clust = 0;
|
|---|
| 284 | f_getfree("/", (DWORD*)&clust, &fs);
|
|---|
| 285 |
|
|---|
| 286 | __debug(DEBUG_SERVSE, "fre_clust: %lu \r\n", clust);
|
|---|
| 287 | __debug(DEBUG_SERVSE, "n_fatent: %lu \r\n", fs->n_fatent);
|
|---|
| 288 | __debug(DEBUG_SERVSE, "fs_csize: %lu \r\n", fs->csize);
|
|---|
| 289 |
|
|---|
| 290 | uint32_t tot_sect = (fs->n_fatent - 2) * fs->csize;
|
|---|
| 291 | __debug(DEBUG_SERVSE, "tot_sect: %lu \r\n", tot_sect);
|
|---|
| 292 |
|
|---|
| 293 | uint32_t fre_sect = clust * fs->csize;
|
|---|
| 294 | __debug(DEBUG_SERVSE, "fre_sect: %lu \r\n", fre_sect);
|
|---|
| 295 |
|
|---|
| 296 | __debug(DEBUG_SERVSE, "%lu KB total drive space. \r\n%lu KB available.\r\n", fre_sect/2, tot_sect/2);
|
|---|
| 297 | }
|
|---|
| 298 |
|
|---|
| 299 | /* ----------------------------------------------------------------------------------------- */
|
|---|
| 300 | /* ######################################################################################### */
|
|---|
| 301 | /* ÇÀÏÈÑÜ ËÎÃÀ ÍÀ ÔËÅØ --------------------------------------------------------------------- */
|
|---|
| 302 | extern xSemaphoreHandle MutexAccessFlash;
|
|---|
| 303 | char log_buffer[2048];
|
|---|
| 304 |
|
|---|
| 305 | void __logWrite(const char *format, ...) // çàïèñü â ëîã
|
|---|
| 306 | {
|
|---|
| 307 | uint32_t size = 0;
|
|---|
| 308 | xSemaphoreTake(MutexAccessFlash, portMAX_DELAY);// ïûòàåìñÿ âçÿòü ìüþòåêñ äëÿ çàïèñè ëîãà
|
|---|
| 309 | va_list args;
|
|---|
| 310 | va_start (args, format);
|
|---|
| 311 | vsprintf (log_buffer, format, args);
|
|---|
| 312 | va_end (args);
|
|---|
| 313 |
|
|---|
| 314 | if((f_open(&FlashFile, "log.txt", FA_OPEN_ALWAYS | FA_WRITE)) == FR_OK){
|
|---|
| 315 | size = f_size(&FlashFile);
|
|---|
| 316 | if(size >= 524288){ // áîëüøå èëè ðàâíî 512 ÊÁ
|
|---|
| 317 | f_close(&FlashFile);
|
|---|
| 318 | f_unlink("old_log.txt");
|
|---|
| 319 | f_rename("log.txt", "old_log.txt");
|
|---|
| 320 | if((f_open(&FlashFile, "log.txt", FA_OPEN_ALWAYS | FA_WRITE)) != FR_OK){
|
|---|
| 321 | xSemaphoreGive(MutexAccessFlash); // Îòäàåì ìüþòåêñ
|
|---|
| 322 | return;
|
|---|
| 323 | }
|
|---|
| 324 | else size = f_size(&FlashFile);
|
|---|
| 325 | }
|
|---|
| 326 | f_lseek(&FlashFile, size);
|
|---|
| 327 | f_printf(&FlashFile, "%02d.%02d.%02d/%02d:%02d:%02d %s",RealTimeClock.Data.Day, RealTimeClock.Data.Month,
|
|---|
| 328 | RealTimeClock.Data.Year, RealTimeClock.Time.Hour, RealTimeClock.Time.Min, RealTimeClock.Time.Sec, log_buffer);
|
|---|
| 329 | f_close(&FlashFile);
|
|---|
| 330 | }
|
|---|
| 331 | xSemaphoreGive(MutexAccessFlash); // Îòäàåì ìüþòåêñ
|
|---|
| 332 | }
|
|---|