From ffef1590fc1b71a33dd339863b100d499ec8faa5 Mon Sep 17 00:00:00 2001 From: eddyem Date: Fri, 20 Sep 2019 12:46:08 +0300 Subject: [PATCH] Ver. 0.1.0. Storing data into flash. --- F1-nolib/chronometer/Makefile | 2 +- F1-nolib/chronometer/chrono.bin | Bin 14948 -> 15860 bytes F1-nolib/chronometer/flash.c | 51 +++++++---- F1-nolib/chronometer/flash.h | 10 ++- F1-nolib/chronometer/main.c | 2 +- F1-nolib/chronometer/stm32F103xB.ld | 14 ++- F1-nolib/chronometer/str.c | 134 +++++++++++++++++++++------- F1-nolib/chronometer/str.h | 8 +- F1-nolib/chronometer/usart.c | 62 +------------ F1-nolib/chronometer/usart.h | 2 - F1-nolib/chronometer/usb.c | 2 +- 11 files changed, 170 insertions(+), 117 deletions(-) diff --git a/F1-nolib/chronometer/Makefile b/F1-nolib/chronometer/Makefile index b63f564..2836837 100644 --- a/F1-nolib/chronometer/Makefile +++ b/F1-nolib/chronometer/Makefile @@ -9,7 +9,7 @@ MCU ?= F103x8 DENSITY ?= MD # change this linking script depending on particular MCU model, LDSCRIPT ?= stm32F103xB.ld -DEFS = -DVERSION=\"0.0.2\" +DEFS = -DVERSION=\"0.1.0\" # debug #DEFS += -DEBUG # proxy GPS output over USART1 diff --git a/F1-nolib/chronometer/chrono.bin b/F1-nolib/chronometer/chrono.bin index 6d71fc24cde7e89d753546b37fb2197c9aeec4dd..dd4dc4cf1cbb9f3d229c8943ee9d371d943a6d62 100755 GIT binary patch delta 6887 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 delta 5924 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 U7D5sfi}?MeX%w>apOsGdJ7^J*9RL6T diff --git a/F1-nolib/chronometer/flash.c b/F1-nolib/chronometer/flash.c index 3f1f096..cc3c18c 100644 --- a/F1-nolib/chronometer/flash.c +++ b/F1-nolib/chronometer/flash.c @@ -45,8 +45,8 @@ #include // memcpy // max amount of records stored: Config & Logs -static int maxCnum = FLASH_BLOCK_SIZE / sizeof(user_conf); -static int maxLnum = FLASH_BLOCK_SIZE / sizeof(user_conf); +int maxCnum = FLASH_BLOCK_SIZE / sizeof(user_conf); +int maxLnum = FLASH_BLOCK_SIZE / sizeof(user_conf); // common structure for all datatypes stored /*typedef struct { @@ -63,7 +63,8 @@ static int maxLnum = FLASH_BLOCK_SIZE / sizeof(user_conf); ,.ADC_min = ADC_MIN_VAL \ ,.ADC_max = ADC_MAX_VAL \ ,.USART_speed = USART1_DEFAULT_SPEED \ - ,.strendRN = 0 \ + ,.defflags = 0 \ + ,.NLfreeWarn = 100 \ } // change to placement @@ -131,9 +132,6 @@ void flashstorage_init(){ memcpy(&the_conf, &Flash_Data[currentconfidx], sizeof(user_conf)); } currentlogidx = binarySearch(0, maxLnum-2, (uint8_t*)logsstart, sizeof(event_log)); -SEND("\ncurrentconfidx="); printu(1, currentconfidx); -SEND("\ncurrentlogidx="); printu(1, currentlogidx); -newline(); } // store new configuration @@ -144,28 +142,42 @@ int store_userconf(){ if(currentconfidx > maxCnum - 3){ // there's no more place currentconfidx = 0; DBG("Need to erase flash!"); - if(erase_flash(Flash_Data, &__varsend)) return 1; + if(erase_flash(Flash_Data, logsstart)) return 1; }else ++currentconfidx; // take next data position (0 - within first run after firmware flashing) -SEND("store_userconf\n"); -SEND("\ncurrentconfidx="); printu(1, currentconfidx); -newline(); return write2flash(&Flash_Data[currentconfidx], &the_conf, sizeof(the_conf)); } /** * @brief store_log - save log record L into flash memory - * @param L - event log + * @param L - event log (or NULL to delete flash) * @return 0 if all OK */ int store_log(event_log *L){ + if(!L){ + currentlogidx = -1; + return erase_flash(logsstart, NULL); + } if(currentlogidx > maxLnum - 3){ // there's no more place - currentlogidx = 0; + /*currentlogidx = 0; DBG("Need to erase flash!"); - if(erase_flash(logsstart, NULL)) return 1; + if(erase_flash(logsstart, NULL)) return 1;*/ + // prevent automatic logs erasing! + USB_send("\n\nERROR!\nCan't save logs: delete old manually!!!\n"); + return 1; }else ++currentlogidx; // take next data position (0 - within first run after firmware flashing) -SEND("sore_log\n"); -SEND("\ncurrentlogidx="); printu(1, currentlogidx); -newline(); + // put warning if there's little space + if(currentlogidx + the_conf.NLfreeWarn > maxLnum - 3){ + uint32_t nfree = maxLnum - 2 - currentlogidx; + USB_send("\n\nWARNING!\nCan store only "); + USB_send(u2str(nfree)); + USB_send(" logs!\n\n"); + } +/* +USB_send("Stored #"); USB_send(u2str(currentlogidx)); +USB_send(", max="); USB_send(u2str(maxLnum)); +USB_send(", warn="); USB_send(u2str(the_conf.NLfreeWarn)); +USB_send("\n"); +*/ return write2flash(&logsstart[currentlogidx], L, sizeof(event_log)); } @@ -177,11 +189,14 @@ newline(); */ int dump_log(int start, int Nlogs){ if(currentlogidx < 0) return 1; - if(start < 0) start += currentlogidx; + if(start < 0){ + start += currentlogidx + 1; + if(start < 0) start = 0; + } if(start > currentlogidx) return 1; int nlast; if(Nlogs > 0){ - nlast = start + Nlogs; + nlast = start + Nlogs - 1; if(nlast > currentlogidx) nlast = currentlogidx; }else nlast = currentlogidx; ++nlast; diff --git a/F1-nolib/chronometer/flash.h b/F1-nolib/chronometer/flash.h index f14789b..7933eca 100644 --- a/F1-nolib/chronometer/flash.h +++ b/F1-nolib/chronometer/flash.h @@ -36,10 +36,10 @@ */ typedef struct __attribute__((packed, aligned(4))){ uint16_t userconf_sz; // "magick number" + uint16_t NLfreeWarn; // warn user when there's less free log records than NLfreeWarn int16_t ADC_min; // min&max values of ADC (shot when ADval > ADC_min && < ADC_max) int16_t ADC_max; // !!! BOTH ARE SIGNED! so you can include 0 & 4096 uint8_t trigstate; // level in `triggered` state - uint8_t strendRN; // strings ends with "\r\n" instead of normal "\n" uint8_t defflags; // default flags uint32_t dist_min; // minimal distance for LIDAR uint32_t dist_max; // maximal -//- @@ -48,7 +48,10 @@ typedef struct __attribute__((packed, aligned(4))){ } user_conf; // values for user_conf.defflags: +// save events in flash #define FLAG_SAVE_EVENTS (1 << 0) +// strings ends with "\r\n" instead of normal "\n" +#define FLAG_STRENDRN (1 << 1) /* * struct to save events logs @@ -64,7 +67,10 @@ typedef struct __attribute__((packed, aligned(4))){ extern user_conf the_conf; extern const user_conf *Flash_Data; extern const event_log *logsstart; -extern uint32_t _varslen, __varsstart, __varsend, __logsstart; +extern int maxCnum, maxLnum; +// data from ld-file +extern uint32_t _varslen, __varsstart, __logsstart; + void flashstorage_init(); int store_userconf(); diff --git a/F1-nolib/chronometer/main.c b/F1-nolib/chronometer/main.c index d528bea..22cd5af 100644 --- a/F1-nolib/chronometer/main.c +++ b/F1-nolib/chronometer/main.c @@ -183,7 +183,7 @@ static char *get_USB(){ USB_send(curptr); // echo //USB_send("ENDOINPUT\n"); //if(x == 1 && *curptr < 32){USB_send("\n"); USB_send(u2str(*curptr)); USB_send("\n");} - if(curptr[x-1] == '\n' || curptr[x-1] == '\r'){ + if(curptr[x-1] == '\n'){ // || curptr[x-1] == '\r'){ curptr = tmpbuf; rest = USBBUF; // omit empty lines diff --git a/F1-nolib/chronometer/stm32F103xB.ld b/F1-nolib/chronometer/stm32F103xB.ld index ad9d273..d5d0449 100644 --- a/F1-nolib/chronometer/stm32F103xB.ld +++ b/F1-nolib/chronometer/stm32F103xB.ld @@ -78,7 +78,18 @@ SECTIONS { .myvars : { . = ALIGN(1024); - KEEP(*(.myvars)) + __varsstart = ABSOLUTE(.); + KEEP(*(.myvars)); + . = . + 2000; + . = ALIGN(1024); + __varsend = ABSOLUTE(.); + } > rom + + .logs : + { + . = ALIGN(1024); + __logsstart = ABSOLUTE(.); + KEEP(*(.logs)) } > rom _ldata = LOADADDR(.data); @@ -95,3 +106,4 @@ SECTIONS { } PROVIDE(_stack = ORIGIN(ram) + LENGTH(ram)); +PROVIDE(_varslen = __varsend - __varsstart); diff --git a/F1-nolib/chronometer/str.c b/F1-nolib/chronometer/str.c index b1d8228..ff75f2a 100644 --- a/F1-nolib/chronometer/str.c +++ b/F1-nolib/chronometer/str.c @@ -86,12 +86,14 @@ static void showuserconf(){ USB_send("}"); USB_send("\nUSART1SPD="); sendu(the_conf.USART_speed); USB_send("\nSTREND="); - if(the_conf.strendRN) USB_send("RN"); + if(the_conf.defflags & FLAG_STRENDRN) USB_send("RN"); else USB_send("N"); uint8_t f = the_conf.defflags; USB_send("\nSAVE_EVENTS="); if(f & FLAG_SAVE_EVENTS) USB_send("1"); else USB_send("0"); + USB_send("\nNFREE="); + sendu(the_conf.NLfreeWarn); USB_send("\n"); } @@ -114,25 +116,27 @@ int parse_USBCMD(char *cmd){ CMD_ADCMIN " - min -//- (triggered when ADval>min & TRIGGERS_AMOUNT - 1) goto bad_number; - uint8_t state = *cmd -'0'; - if(state > 1) goto bad_number; - uint8_t oldval = the_conf.trig_pullups; - if(!state) the_conf.trig_pullups = oldval & ~(1< 0) N = 0; + if(dump_log(N, -1)) USB_send("Event log empty!\n"); + }else if(CMP(cmd, CMD_NFREE) == 0){ + GETNUM(CMD_NFREE); + if(N < 0 || N > 0xffff) goto bad_number; + the_conf.NLfreeWarn = (uint16_t)N; + succeed = 1; + }else if(CMP(cmd, CMD_DELLOGS) == 0){ + if(store_log(NULL)) USB_send("Error during erasing flash\n"); + else USB_send("All logs erased\n"); }else return 1; /*else if(CMP(cmd, CMD_) == 0){ ; @@ -433,3 +438,70 @@ char *strcp(char* dst, const char *src){ while((*dst++ = *src++)); return dst - 1; } + + +// read `buf` and get first integer `N` in it +// @return 0 if all OK or 1 if there's not a number; omit spaces and '=' +int getnum(const char *buf, int32_t *N){ + char c; + int positive = -1; + int32_t val = 0; + while((c = *buf++)){ + if(c == '\t' || c == ' ' || c == '='){ + if(positive < 0) continue; // beginning spaces + else break; // spaces after number + } + if(c == '-'){ + if(positive < 0){ + positive = 0; + continue; + }else break; // there already was `-` or number + } + if(c < '0' || c > '9') break; + if(positive < 0) positive = 1; + val = val * 10 + (int32_t)(c - '0'); + } + if(positive != -1){ + if(positive == 0){ + if(val == 0) return 1; // single '-' + val = -val; + } + *N = val; + }else return 1; + return 0; +} + +static char strbuf[11]; +// return string buffer (strbuf) with val +char *u2str(uint32_t val){ + char *bufptr = &strbuf[10]; + *bufptr = 0; + if(!val){ + *(--bufptr) = '0'; + }else{ + while(val){ + *(--bufptr) = val % 10 + '0'; + val /= 10; + } + } + return bufptr; +} + +// return strbuf filled with hex +char *u2hex(uint32_t val){ + char *bufptr = strbuf; + *bufptr++ = '0'; + *bufptr++ = 'x'; + uint8_t *ptr = (uint8_t*)&val + 3; + int i, j; + IWDG->KR = IWDG_REFRESH; + for(i = 0; i < 4; ++i, --ptr){ + for(j = 1; j > -1; --j){ + register uint8_t half = (*ptr >> (4*j)) & 0x0f; + if(half < 10) *bufptr++ = half + '0'; + else *bufptr++ = half - 10 + 'a'; + } + } + *bufptr = 0; + return strbuf; +} diff --git a/F1-nolib/chronometer/str.h b/F1-nolib/chronometer/str.h index 9855ada..7e9780f 100644 --- a/F1-nolib/chronometer/str.h +++ b/F1-nolib/chronometer/str.h @@ -47,11 +47,17 @@ #define CMD_RESET "reset" #define CMD_STREND "strend" #define CMD_FLASH "flash" -#define CMD_SAVEEVTS "saveevt" +#define CMD_SAVEEVTS "se" #define CMD_DUMP "dump" +#define CMD_NFREE "nfree" +#define CMD_DELLOGS "deletelogs" extern uint8_t showGPSstr; +int getnum(const char *buf, int32_t *N); +char *u2str(uint32_t val); +char *u2hex(uint32_t val); + int strln(const char *s); char *strcp(char* dst, const char *src); int cmpstr(const char *s1, const char *s2, int n); diff --git a/F1-nolib/chronometer/usart.c b/F1-nolib/chronometer/usart.c index 93c2e8a..101f657 100644 --- a/F1-nolib/chronometer/usart.c +++ b/F1-nolib/chronometer/usart.c @@ -19,8 +19,9 @@ #include "stm32f1.h" #include "flash.h" -#include "usart.h" #include "lidar.h" +#include "str.h" +#include "usart.h" extern volatile uint32_t Tms; static volatile int idatalen[4][2] = {0}; // received data line length (including '\n') @@ -252,22 +253,6 @@ void usart3_isr(){ } } -// return string buffer with val -char *u2str(uint32_t val){ - static char buf[11]; - char *bufptr = &buf[10]; - *bufptr = 0; - if(!val){ - *(--bufptr) = '0'; - }else{ - while(val){ - *(--bufptr) = val % 10 + '0'; - val /= 10; - } - } - return bufptr; -} - // print 32bit unsigned int void printu(int n, uint32_t val){ usart_send(n, u2str(val)); @@ -275,17 +260,7 @@ void printu(int n, uint32_t val){ // print 32bit unsigned int as hex void printuhex(int n, uint32_t val){ - usart_send(n, "0x"); - uint8_t *ptr = (uint8_t*)&val + 3; - int i, j; - IWDG->KR = IWDG_REFRESH; - for(i = 0; i < 4; ++i, --ptr){ - for(j = 1; j > -1; --j){ - register uint8_t half = (*ptr >> (4*j)) & 0x0f; - if(half < 10) usart_putchar(n, half + '0'); - else usart_putchar(n, half - 10 + 'a'); - } - } + usart_send(n, u2hex(val)); } #ifdef EBUG @@ -326,34 +301,3 @@ void dma1_channel2_isr(){ // USART3 txrdy[3] = 1; } } - -// read `buf` and get first integer `N` in it -// @return 0 if all OK or 1 if there's not a number; omit spaces and '=' -int getnum(const char *buf, int32_t *N){ - char c; - int positive = -1; - int32_t val = 0; - while((c = *buf++)){ - if(c == '\t' || c == ' ' || c == '='){ - if(positive < 0) continue; // beginning spaces - else break; // spaces after number - } - if(c == '-'){ - if(positive < 0){ - positive = 0; - continue; - }else break; // there already was `-` or number - } - if(c < '0' || c > '9') break; - if(positive < 0) positive = 1; - val = val * 10 + (int32_t)(c - '0'); - } - if(positive != -1){ - if(positive == 0){ - if(val == 0) return 1; // single '-' - val = -val; - } - *N = val; - }else return 1; - return 0; -} diff --git a/F1-nolib/chronometer/usart.h b/F1-nolib/chronometer/usart.h index 6189c63..82ab481 100644 --- a/F1-nolib/chronometer/usart.h +++ b/F1-nolib/chronometer/usart.h @@ -55,10 +55,8 @@ void usarts_setup(); int usart_getline(int n, char **line); void usart_send(int n, const char *str); void usart_putchar(int n, char ch); -char *u2str(uint32_t val); void printu(int n, uint32_t val); void printuhex(int n, uint32_t val); -int getnum(const char *buf, int32_t *N); #if defined EBUG || defined USART1PROXY void newline(); diff --git a/F1-nolib/chronometer/usb.c b/F1-nolib/chronometer/usb.c index 8a8f27d..48ccfce 100644 --- a/F1-nolib/chronometer/usb.c +++ b/F1-nolib/chronometer/usb.c @@ -115,7 +115,7 @@ void USB_send(const char *buf){ uint16_t proc = 0, s = (l > USB_TXBUFSZ - 1) ? USB_TXBUFSZ - 1: l; for(int i = 0; i < s; ++i, ++proc){ char c = buf[ctr+proc]; - if(c == '\n' && the_conf.strendRN){ // add '\r' before '\n' + if(c == '\n' && the_conf.defflags & FLAG_STRENDRN){ // add '\r' before '\n' tmpbuf[i++] = '\r'; if(i == s) ++s; }