1st working program

Dependencies:   mbed-os_TYBLE16 BME280_SPI RX8025NB nRF51_Vdd MB85RSxx_SPI

see /users/kenjiArai/notebook/tyble16-module-as-mbed-os-5-board-mbedlization/

Committer:
kenjiArai
Date:
Sun Dec 22 06:33:18 2019 +0000
Revision:
9:8c9e6e270b67
Parent:
7:cedbf234a089
reduce current consumption

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 6:a3238e93f694 1 /*
kenjiArai 6:a3238e93f694 2 * Mbed Application program / TYBLE-16 Data logger
kenjiArai 6:a3238e93f694 3 *
kenjiArai 6:a3238e93f694 4 * Copyright (c) 2019 Kenji Arai / JH1PJL
kenjiArai 6:a3238e93f694 5 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 6:a3238e93f694 6 * https://os.mbed.com/users/kenjiArai/
kenjiArai 6:a3238e93f694 7 * Created: December 14th, 2019
kenjiArai 7:cedbf234a089 8 * Revised: December 19th, 2019
kenjiArai 6:a3238e93f694 9 */
kenjiArai 6:a3238e93f694 10
kenjiArai 6:a3238e93f694 11 // Include --------------------------------------------------------------------
kenjiArai 6:a3238e93f694 12 #include "mbed.h"
kenjiArai 6:a3238e93f694 13 #include "dt_logger.h"
kenjiArai 6:a3238e93f694 14
kenjiArai 6:a3238e93f694 15 // Object ---------------------------------------------------------------------
kenjiArai 6:a3238e93f694 16 extern Serial pc;
kenjiArai 6:a3238e93f694 17
kenjiArai 6:a3238e93f694 18 // Definition -----------------------------------------------------------------
kenjiArai 6:a3238e93f694 19 #define BAUD(x) pc.baud(x)
kenjiArai 6:a3238e93f694 20 #define GETC(x) pc.getc(x)
kenjiArai 6:a3238e93f694 21 #define PUTC(x) pc.putc(x)
kenjiArai 6:a3238e93f694 22 #define PRINTF(...) pc.printf(__VA_ARGS__)
kenjiArai 6:a3238e93f694 23 #define READABLE(x) pc.readable(x)
kenjiArai 6:a3238e93f694 24
kenjiArai 6:a3238e93f694 25 // FRAM
kenjiArai 7:cedbf234a089 26 #define FRAM_TOP 0x0
kenjiArai 6:a3238e93f694 27
kenjiArai 6:a3238e93f694 28 // RAM ------------------------------------------------------------------------
kenjiArai 6:a3238e93f694 29 char linebuf[64];
kenjiArai 6:a3238e93f694 30 int buf_size = sizeof(linebuf);
kenjiArai 6:a3238e93f694 31
kenjiArai 6:a3238e93f694 32 // for FRAM control
kenjiArai 6:a3238e93f694 33 int16_t read_pointer;
kenjiArai 6:a3238e93f694 34
kenjiArai 6:a3238e93f694 35 typedef struct {
kenjiArai 6:a3238e93f694 36 uint16_t head;
kenjiArai 6:a3238e93f694 37 uint16_t tail;
kenjiArai 6:a3238e93f694 38 } ring_t;
kenjiArai 6:a3238e93f694 39
kenjiArai 6:a3238e93f694 40 union _inf{
kenjiArai 6:a3238e93f694 41 uint8_t buf_pointer[PTR_SIZE];
kenjiArai 6:a3238e93f694 42 ring_t log_inf;
kenjiArai 6:a3238e93f694 43 }inf;
kenjiArai 6:a3238e93f694 44
kenjiArai 6:a3238e93f694 45 typedef struct {
kenjiArai 6:a3238e93f694 46 uint32_t time; // 4byte
kenjiArai 6:a3238e93f694 47 uint16_t vcc; // 2
kenjiArai 6:a3238e93f694 48 uint16_t baro; // 2
kenjiArai 6:a3238e93f694 49 int16_t temp; // 2
kenjiArai 6:a3238e93f694 50 uint16_t humi; // 2
kenjiArai 6:a3238e93f694 51 uint32_t dmy; // 4
kenjiArai 6:a3238e93f694 52 }one_log; // 16 bytes total
kenjiArai 6:a3238e93f694 53
kenjiArai 6:a3238e93f694 54 union _one{
kenjiArai 6:a3238e93f694 55 uint8_t bf[PKT_SIZE];
kenjiArai 6:a3238e93f694 56 one_log lg;
kenjiArai 6:a3238e93f694 57 }one;
kenjiArai 6:a3238e93f694 58
kenjiArai 6:a3238e93f694 59 extern time_t log_sec;
kenjiArai 6:a3238e93f694 60 extern float vcc_voltage;
kenjiArai 6:a3238e93f694 61 extern float barometer;
kenjiArai 6:a3238e93f694 62 extern float temperature;
kenjiArai 6:a3238e93f694 63 extern float humidity;
kenjiArai 6:a3238e93f694 64
kenjiArai 6:a3238e93f694 65 // ROM / Constant data --------------------------------------------------------
kenjiArai 6:a3238e93f694 66 const char *const mon_msg =
kenjiArai 6:a3238e93f694 67 "Monitor for TYBLE16 Data logger, created on " __DATE__"";
kenjiArai 6:a3238e93f694 68 // $,2019/12/21,12:43:16,3.29,1004.5,+29.3,45.8,*
kenjiArai 6:a3238e93f694 69 const char *const log_head = "$,YYYY/MM/DD,HH:MM:SS,Vcc ,Press , Temp,Humi,*";
kenjiArai 6:a3238e93f694 70 const char *const msg_emty = "Data empty";
kenjiArai 6:a3238e93f694 71 const char *const msg_end = "\r\nreach to end";
kenjiArai 6:a3238e93f694 72
kenjiArai 6:a3238e93f694 73 // Function prototypes --------------------------------------------------------
kenjiArai 6:a3238e93f694 74 extern time_t w_check_rtc_time(RX8025 &ex_rtc);
kenjiArai 6:a3238e93f694 75
kenjiArai 6:a3238e93f694 76 static void data_logger(MB85RSxx_SPI &fram, char *ptr);
kenjiArai 6:a3238e93f694 77 static void msg_hlp (void);
kenjiArai 6:a3238e93f694 78 static void time_enter_mode(RX8025 &ex_rtc, char *ptr);
kenjiArai 6:a3238e93f694 79 static void chk_and_set_time(RX8025 &ex_rtc, char *ptr);
kenjiArai 6:a3238e93f694 80 static int xatoi (char **str, unsigned long *res);
kenjiArai 6:a3238e93f694 81 static void get_line(char *buff, int len);
kenjiArai 6:a3238e93f694 82 static void put_rn(void);
kenjiArai 6:a3238e93f694 83 static void put_r(void);
kenjiArai 6:a3238e93f694 84 static void put_lin(void);
kenjiArai 6:a3238e93f694 85 static void put_spc(uint8_t n);
kenjiArai 6:a3238e93f694 86
kenjiArai 6:a3238e93f694 87 //------------------------------------------------------------------------------
kenjiArai 6:a3238e93f694 88 // Control Program
kenjiArai 6:a3238e93f694 89 //------------------------------------------------------------------------------
kenjiArai 6:a3238e93f694 90 // ---------- Program starts here! ---------------------------------------------
kenjiArai 7:cedbf234a089 91 void mon(RX8025 &ex_rtc, MB85RSxx_SPI &fram)
kenjiArai 6:a3238e93f694 92 {
kenjiArai 6:a3238e93f694 93 char *ptr;
kenjiArai 6:a3238e93f694 94
kenjiArai 6:a3238e93f694 95 if (READABLE()){ char c = GETC();} // dummy read
kenjiArai 6:a3238e93f694 96 put_rn();
kenjiArai 6:a3238e93f694 97 PRINTF("%s [Help:'?' key]", mon_msg);
kenjiArai 6:a3238e93f694 98 put_rn();
kenjiArai 6:a3238e93f694 99 for (;;) {
kenjiArai 6:a3238e93f694 100 put_r();
kenjiArai 6:a3238e93f694 101 PUTC('>');
kenjiArai 6:a3238e93f694 102 ptr = linebuf;
kenjiArai 6:a3238e93f694 103 get_line(ptr, sizeof(linebuf));
kenjiArai 6:a3238e93f694 104 switch (*ptr++) {
kenjiArai 6:a3238e93f694 105 //--------------------------------------------------------------------------
kenjiArai 6:a3238e93f694 106 // check and set RTC
kenjiArai 6:a3238e93f694 107 //--------------------------------------------------------------------------
kenjiArai 6:a3238e93f694 108 case 't' :
kenjiArai 6:a3238e93f694 109 put_r();
kenjiArai 6:a3238e93f694 110 time_enter_mode(ex_rtc, ptr);
kenjiArai 6:a3238e93f694 111 break;
kenjiArai 6:a3238e93f694 112 //--------------------------------------------------------------------------
kenjiArai 6:a3238e93f694 113 // check FRAM status
kenjiArai 6:a3238e93f694 114 //--------------------------------------------------------------------------
kenjiArai 6:a3238e93f694 115 case 'd' :
kenjiArai 6:a3238e93f694 116 put_r();
kenjiArai 6:a3238e93f694 117 data_logger(fram, ptr);
kenjiArai 6:a3238e93f694 118 break;
kenjiArai 6:a3238e93f694 119 //--------------------------------------------------------------------------
kenjiArai 6:a3238e93f694 120 // help
kenjiArai 6:a3238e93f694 121 //--------------------------------------------------------------------------
kenjiArai 6:a3238e93f694 122 case '?' :
kenjiArai 6:a3238e93f694 123 put_r();
kenjiArai 6:a3238e93f694 124 msg_hlp();
kenjiArai 6:a3238e93f694 125 break;
kenjiArai 6:a3238e93f694 126 //--------------------------------------------------------------------------
kenjiArai 6:a3238e93f694 127 // Go back to main()
kenjiArai 6:a3238e93f694 128 //--------------------------------------------------------------------------
kenjiArai 6:a3238e93f694 129 case 'q' : // Quit
kenjiArai 6:a3238e93f694 130 PRINTF("\rReturn to main\r\n");
kenjiArai 6:a3238e93f694 131 PRINTF("cannot control anymore from here\r\n");
kenjiArai 7:cedbf234a089 132 return;
kenjiArai 6:a3238e93f694 133 }
kenjiArai 6:a3238e93f694 134 }
kenjiArai 6:a3238e93f694 135 }
kenjiArai 6:a3238e93f694 136 //------------------------------------------------------------------------------
kenjiArai 6:a3238e93f694 137 // Data Logging / Save into FRAM
kenjiArai 6:a3238e93f694 138 //------------------------------------------------------------------------------
kenjiArai 6:a3238e93f694 139 /*
kenjiArai 6:a3238e93f694 140 head = H, tail =T
kenjiArai 6:a3238e93f694 141 state1: H=1(RING_TOP),T=1(RING_TOP) -> just after Clear command
kenjiArai 6:a3238e93f694 142 state2: H=1,T=n -> n = 2 to RING_TAIL-1 (not filled yet)
kenjiArai 6:a3238e93f694 143 state3: H=1,T=RING_TAIL -> need to check!!!! (just filled)
kenjiArai 6:a3238e93f694 144 state4: H=2,T=1(RING_TOP) -> start ringed state
kenjiArai 6:a3238e93f694 145 state5: H=n,T=n-1 -> n = 2 to RING_TAIL-1 (ringed)
kenjiArai 6:a3238e93f694 146 state6: H=RING_TAIL,T=RING_TAIL-1 -> need to check!!!!!
kenjiArai 6:a3238e93f694 147 state7: H=1(RING_TOP),T=RING_TAIL -> need to check!!!!!
kenjiArai 6:a3238e93f694 148 state8: same as "state5"
kenjiArai 6:a3238e93f694 149 -> Need to check state3,6,7
kenjiArai 6:a3238e93f694 150 */
kenjiArai 6:a3238e93f694 151 // Make one data packet data structure
kenjiArai 6:a3238e93f694 152 void dtlog_data_pack(void)
kenjiArai 6:a3238e93f694 153 {
kenjiArai 6:a3238e93f694 154 one.lg.time = log_sec - DATE_COUNT_START;
kenjiArai 6:a3238e93f694 155 one.lg.vcc = (uint16_t)(vcc_voltage * 100);
kenjiArai 6:a3238e93f694 156 one.lg.baro = (uint16_t)(barometer * 10);
kenjiArai 6:a3238e93f694 157 one.lg.temp = (int16_t) (temperature * 10);
kenjiArai 6:a3238e93f694 158 one.lg.humi = (uint16_t)(humidity * 10);
kenjiArai 6:a3238e93f694 159 one.lg.dmy = 0xffff;
kenjiArai 6:a3238e93f694 160 }
kenjiArai 6:a3238e93f694 161
kenjiArai 6:a3238e93f694 162 // Print one packet as normalized data
kenjiArai 6:a3238e93f694 163 void print_one_block_data(void)
kenjiArai 6:a3238e93f694 164 {
kenjiArai 6:a3238e93f694 165 struct tm *t;
kenjiArai 6:a3238e93f694 166 time_t seconds;
kenjiArai 6:a3238e93f694 167 uint16_t dt0;
kenjiArai 6:a3238e93f694 168 int16_t dt1;
kenjiArai 6:a3238e93f694 169
kenjiArai 6:a3238e93f694 170 put_rn();
kenjiArai 6:a3238e93f694 171 //--- Header
kenjiArai 6:a3238e93f694 172 PUTC('$');
kenjiArai 6:a3238e93f694 173 //--- Time
kenjiArai 6:a3238e93f694 174 seconds = one.lg.time + DATE_COUNT_START;
kenjiArai 6:a3238e93f694 175 t = localtime(&seconds);
kenjiArai 6:a3238e93f694 176 PRINTF(",%04d/%02d/%02d,%02d:%02d:%02d,",
kenjiArai 6:a3238e93f694 177 t->tm_year + 1900, t->tm_mon + 1,
kenjiArai 6:a3238e93f694 178 t->tm_mday, t->tm_hour,
kenjiArai 6:a3238e93f694 179 t->tm_min, t->tm_sec
kenjiArai 6:a3238e93f694 180 );
kenjiArai 6:a3238e93f694 181 //--- Vcc
kenjiArai 6:a3238e93f694 182 dt0 = one.lg.vcc;
kenjiArai 6:a3238e93f694 183 PRINTF("%01d.%02d,", dt0/100, dt0%100);
kenjiArai 6:a3238e93f694 184 //--- Pressure/Barometer
kenjiArai 6:a3238e93f694 185 dt0 = one.lg.baro;
kenjiArai 6:a3238e93f694 186 PRINTF("%04d.%01d,", dt0/10, dt0%10 );
kenjiArai 6:a3238e93f694 187 //--- Temperature
kenjiArai 6:a3238e93f694 188 dt1 = one.lg.temp;
kenjiArai 6:a3238e93f694 189 PRINTF("%+03d.%01d,", dt1/10, abs(dt1)%10 );
kenjiArai 6:a3238e93f694 190 //--- Humidity
kenjiArai 6:a3238e93f694 191 dt0 = one.lg.humi;
kenjiArai 6:a3238e93f694 192 PRINTF("%02d.%01d,", dt0/10, dt0%10 );
kenjiArai 6:a3238e93f694 193 //---- Tail
kenjiArai 6:a3238e93f694 194 PUTC('*');
kenjiArai 6:a3238e93f694 195 }
kenjiArai 6:a3238e93f694 196
kenjiArai 6:a3238e93f694 197 // Read buffer pointer
kenjiArai 6:a3238e93f694 198 static void dtlog_pointer_read(MB85RSxx_SPI &fram)
kenjiArai 6:a3238e93f694 199 {
kenjiArai 6:a3238e93f694 200 uint8_t i;
kenjiArai 6:a3238e93f694 201 uint8_t *addr;
kenjiArai 6:a3238e93f694 202
kenjiArai 6:a3238e93f694 203 // Read FRAM and save to buf_pointer[]
kenjiArai 6:a3238e93f694 204 addr = (uint8_t *)FRAM_TOP;
kenjiArai 6:a3238e93f694 205 fram.read((int)addr, inf.buf_pointer, PTR_SIZE);
kenjiArai 6:a3238e93f694 206 PRINTF("Head=%d,Tail=%d\r\n", inf.log_inf.head, inf.log_inf.tail);
kenjiArai 6:a3238e93f694 207 }
kenjiArai 6:a3238e93f694 208
kenjiArai 6:a3238e93f694 209 // Write one packet
kenjiArai 6:a3238e93f694 210 void dtlog_one_write(MB85RSxx_SPI &fram)
kenjiArai 6:a3238e93f694 211 {
kenjiArai 6:a3238e93f694 212 uint8_t *addr;
kenjiArai 6:a3238e93f694 213
kenjiArai 6:a3238e93f694 214 // Read FRAM buffer pointer to RAM
kenjiArai 6:a3238e93f694 215 addr = (uint8_t *)FRAM_TOP;
kenjiArai 6:a3238e93f694 216 fram.read((int)addr, inf.buf_pointer, PTR_SIZE);
kenjiArai 6:a3238e93f694 217 PRINTF("Befre:Head=%d,Tail=%d -> ", inf.log_inf.head, inf.log_inf.tail);
kenjiArai 6:a3238e93f694 218 // Write data_pack[] into FRAM
kenjiArai 6:a3238e93f694 219 addr = (uint8_t *)(FRAM_TOP + (inf.log_inf.tail * PTR_SIZE));
kenjiArai 6:a3238e93f694 220 fram.write_enable();
kenjiArai 6:a3238e93f694 221 fram.write((int)addr, one.bf, PTR_SIZE);
kenjiArai 6:a3238e93f694 222 fram.write_disable();
kenjiArai 6:a3238e93f694 223 // Increment buffer pointer in RAM
kenjiArai 6:a3238e93f694 224 if (inf.log_inf.head == RING_TOP){ // check state1,2,3
kenjiArai 6:a3238e93f694 225 if (inf.log_inf.tail == RING_TAIL){ // check state3
kenjiArai 6:a3238e93f694 226 inf.log_inf.tail = RING_TOP; // set state4
kenjiArai 6:a3238e93f694 227 inf.log_inf.head = 2; // missing one oldest data
kenjiArai 6:a3238e93f694 228 } else {
kenjiArai 6:a3238e93f694 229 inf.log_inf.tail++; // set state2
kenjiArai 6:a3238e93f694 230 }
kenjiArai 6:a3238e93f694 231 } else { // check state 4,5,6,7
kenjiArai 6:a3238e93f694 232 if (inf.log_inf.head == RING_TAIL){ // check state6
kenjiArai 6:a3238e93f694 233 inf.log_inf.head = RING_TOP; // set state7
kenjiArai 6:a3238e93f694 234 inf.log_inf.tail = RING_TAIL;
kenjiArai 6:a3238e93f694 235 } else if (inf.log_inf.tail == inf.log_inf.head - 1){ // check state4,5
kenjiArai 6:a3238e93f694 236 ++inf.log_inf.tail; // continue state5
kenjiArai 6:a3238e93f694 237 ++inf.log_inf.head;
kenjiArai 6:a3238e93f694 238 }
kenjiArai 6:a3238e93f694 239 }
kenjiArai 6:a3238e93f694 240 // Write buffer pointer into FRAM
kenjiArai 6:a3238e93f694 241 addr = (uint8_t *)FRAM_TOP;
kenjiArai 6:a3238e93f694 242 fram.write_enable();
kenjiArai 6:a3238e93f694 243 fram.write((int)addr, inf.buf_pointer, PTR_SIZE);
kenjiArai 6:a3238e93f694 244 fram.write_disable();
kenjiArai 6:a3238e93f694 245 PRINTF("After:Head=%d,Tail=%d\r\n", inf.log_inf.head, inf.log_inf.tail);
kenjiArai 6:a3238e93f694 246 }
kenjiArai 6:a3238e93f694 247
kenjiArai 6:a3238e93f694 248 // Read some block from buffer
kenjiArai 6:a3238e93f694 249 void dtlog_block_read(MB85RSxx_SPI &fram, int16_t *pt, uint16_t n)
kenjiArai 6:a3238e93f694 250 {
kenjiArai 6:a3238e93f694 251 uint8_t *addr;
kenjiArai 6:a3238e93f694 252 uint16_t num;
kenjiArai 6:a3238e93f694 253
kenjiArai 6:a3238e93f694 254 dtlog_pointer_read(fram);
kenjiArai 6:a3238e93f694 255 if (inf.log_inf.tail == inf.log_inf.head){ // Check pointer
kenjiArai 6:a3238e93f694 256 PRINTF("%s", msg_emty);
kenjiArai 6:a3238e93f694 257 put_rn();
kenjiArai 6:a3238e93f694 258 return;
kenjiArai 6:a3238e93f694 259 }
kenjiArai 6:a3238e93f694 260 PRINTF("Head:%d,Tail:%d, Start pointer:%d, Number of data:%d\r\n",
kenjiArai 6:a3238e93f694 261 inf.log_inf.head, inf.log_inf.tail, *pt, n);
kenjiArai 6:a3238e93f694 262 PRINTF("%s", log_head);
kenjiArai 6:a3238e93f694 263 for (num = 0; num < n; num++){
kenjiArai 6:a3238e93f694 264 // Read FRAM and save to data_pack[]
kenjiArai 6:a3238e93f694 265 addr = (uint8_t *)(FRAM_TOP + (*pt * PTR_SIZE));
kenjiArai 6:a3238e93f694 266 fram.read((int)addr, one.bf, PTR_SIZE);
kenjiArai 6:a3238e93f694 267 print_one_block_data();
kenjiArai 6:a3238e93f694 268 if (READABLE()){ GETC(); break;}
kenjiArai 6:a3238e93f694 269 if (inf.log_inf.head == RING_TOP){ // check state 1,2,3
kenjiArai 6:a3238e93f694 270 *pt += 1;
kenjiArai 6:a3238e93f694 271 if (*pt >= inf.log_inf.tail){ // check state 2,3
kenjiArai 6:a3238e93f694 272 PRINTF("%s", msg_end);
kenjiArai 6:a3238e93f694 273 break;
kenjiArai 6:a3238e93f694 274 }
kenjiArai 6:a3238e93f694 275 } else { // state 4,5,6,7
kenjiArai 6:a3238e93f694 276 if (inf.log_inf.head == RING_TAIL){ // check state 6
kenjiArai 6:a3238e93f694 277 if (inf.log_inf.tail == RING_TAIL -1){ // check state 6
kenjiArai 6:a3238e93f694 278 if (*pt == RING_TAIL){ // same as :pt += 1
kenjiArai 6:a3238e93f694 279 *pt = RING_TOP;
kenjiArai 6:a3238e93f694 280 } else { // next read
kenjiArai 6:a3238e93f694 281 *pt += 1;
kenjiArai 6:a3238e93f694 282 if (*pt >= inf.log_inf.tail){
kenjiArai 6:a3238e93f694 283 PRINTF("%s", msg_end);
kenjiArai 6:a3238e93f694 284 break;
kenjiArai 6:a3238e93f694 285 }
kenjiArai 6:a3238e93f694 286 }
kenjiArai 6:a3238e93f694 287 }
kenjiArai 6:a3238e93f694 288 } else if (inf.log_inf.tail == inf.log_inf.head - 1){// check state5
kenjiArai 6:a3238e93f694 289 *pt += 1;
kenjiArai 6:a3238e93f694 290 if (*pt > RING_TAIL){ // same as :pt += 1
kenjiArai 6:a3238e93f694 291 *pt = RING_TOP;
kenjiArai 6:a3238e93f694 292 } else if (*pt == inf.log_inf.tail){ // reach to end
kenjiArai 6:a3238e93f694 293 PRINTF("%s", msg_end);
kenjiArai 6:a3238e93f694 294 break;
kenjiArai 6:a3238e93f694 295 }
kenjiArai 6:a3238e93f694 296 }
kenjiArai 6:a3238e93f694 297 }
kenjiArai 6:a3238e93f694 298 }
kenjiArai 6:a3238e93f694 299 put_rn();
kenjiArai 6:a3238e93f694 300 }
kenjiArai 6:a3238e93f694 301
kenjiArai 6:a3238e93f694 302 // Clear all buffer
kenjiArai 6:a3238e93f694 303 void dtlog_clear_all_buff(MB85RSxx_SPI &fram)
kenjiArai 6:a3238e93f694 304 {
kenjiArai 6:a3238e93f694 305 uint8_t *addr;
kenjiArai 6:a3238e93f694 306
kenjiArai 6:a3238e93f694 307 // Set initial data
kenjiArai 6:a3238e93f694 308 inf.log_inf.head = inf.log_inf.tail = RING_TOP;
kenjiArai 6:a3238e93f694 309 // Write buffer pointer
kenjiArai 6:a3238e93f694 310 addr = (uint8_t *)FRAM_TOP;
kenjiArai 6:a3238e93f694 311 fram.write_enable();
kenjiArai 6:a3238e93f694 312 fram.write((int)addr, inf.buf_pointer, PTR_SIZE);
kenjiArai 6:a3238e93f694 313 fram.write_disable();
kenjiArai 6:a3238e93f694 314 }
kenjiArai 6:a3238e93f694 315
kenjiArai 6:a3238e93f694 316 // FRAM buffer occupation
kenjiArai 6:a3238e93f694 317 uint16_t dtlog_buf_occupation(MB85RSxx_SPI &fram)
kenjiArai 6:a3238e93f694 318 {
kenjiArai 6:a3238e93f694 319 uint16_t dt = 0;
kenjiArai 6:a3238e93f694 320 uint8_t *addr;
kenjiArai 6:a3238e93f694 321
kenjiArai 6:a3238e93f694 322 // Read FRAM buffer pointer to RAM
kenjiArai 6:a3238e93f694 323 addr = (uint8_t *)FRAM_TOP;
kenjiArai 6:a3238e93f694 324 fram.read((int)addr, inf.buf_pointer, PTR_SIZE);
kenjiArai 6:a3238e93f694 325 // check buffer pointer
kenjiArai 6:a3238e93f694 326 if (inf.log_inf.head == inf.log_inf.tail){
kenjiArai 6:a3238e93f694 327 PRINTF("%s", msg_emty);
kenjiArai 6:a3238e93f694 328 put_rn();
kenjiArai 6:a3238e93f694 329 return 0;
kenjiArai 6:a3238e93f694 330 }
kenjiArai 6:a3238e93f694 331 if (inf.log_inf.head == RING_TOP){ // check state1,2,3
kenjiArai 6:a3238e93f694 332 dt = inf.log_inf.tail - inf.log_inf.head;
kenjiArai 6:a3238e93f694 333 } else { // state 4,5,6,7
kenjiArai 6:a3238e93f694 334 if (inf.log_inf.head == RING_TAIL){ // check state6
kenjiArai 6:a3238e93f694 335 if (inf.log_inf.tail == RING_TAIL - 1){ // check state6
kenjiArai 6:a3238e93f694 336 dt = inf.log_inf.tail - RING_TOP + 1;
kenjiArai 6:a3238e93f694 337 }
kenjiArai 6:a3238e93f694 338 } else if (inf.log_inf.tail == inf.log_inf.head - 1){ // check state4,5
kenjiArai 6:a3238e93f694 339 dt = RING_TAIL;
kenjiArai 6:a3238e93f694 340 } else { // error
kenjiArai 6:a3238e93f694 341 dt = 0;
kenjiArai 6:a3238e93f694 342 }
kenjiArai 6:a3238e93f694 343 }
kenjiArai 6:a3238e93f694 344 return dt;
kenjiArai 6:a3238e93f694 345 }
kenjiArai 6:a3238e93f694 346
kenjiArai 6:a3238e93f694 347 // Read block number
kenjiArai 6:a3238e93f694 348 void dtlog_num_of_block(MB85RSxx_SPI &fram)
kenjiArai 6:a3238e93f694 349 {
kenjiArai 6:a3238e93f694 350 uint16_t dt;
kenjiArai 6:a3238e93f694 351
kenjiArai 6:a3238e93f694 352 dt = dtlog_buf_occupation(fram);
kenjiArai 6:a3238e93f694 353 if (dt == 0){
kenjiArai 6:a3238e93f694 354 PRINTF("%s", msg_emty);
kenjiArai 6:a3238e93f694 355 } else {
kenjiArai 6:a3238e93f694 356 PRINTF("Number of data = %d", dt);
kenjiArai 6:a3238e93f694 357 put_rn();
kenjiArai 6:a3238e93f694 358 dt = (uint16_t)(((uint32_t)dt * 1000 )/ (BLK_NO - 2));
kenjiArai 6:a3238e93f694 359 PRINTF("FRAM Occupation = %d.%01d%%", dt / 10, dt % 10);
kenjiArai 6:a3238e93f694 360 }
kenjiArai 6:a3238e93f694 361 put_rn();
kenjiArai 6:a3238e93f694 362 }
kenjiArai 6:a3238e93f694 363
kenjiArai 6:a3238e93f694 364 //------------------------------------------------------------------------------
kenjiArai 6:a3238e93f694 365 // Monitor
kenjiArai 6:a3238e93f694 366 //------------------------------------------------------------------------------
kenjiArai 6:a3238e93f694 367 // Help Massage
kenjiArai 6:a3238e93f694 368 void msg_hlp (void)
kenjiArai 6:a3238e93f694 369 {
kenjiArai 6:a3238e93f694 370 PRINTF("%s", mon_msg); put_rn();
kenjiArai 6:a3238e93f694 371 PRINTF("d - Data logger"); put_rn();
kenjiArai 6:a3238e93f694 372 PRINTF("t - Check and set RTC"); put_rn();
kenjiArai 6:a3238e93f694 373 PRINTF("q - Return to main"); put_rn();
kenjiArai 6:a3238e93f694 374 }
kenjiArai 6:a3238e93f694 375
kenjiArai 6:a3238e93f694 376 // Data Logger / Check status and Output data
kenjiArai 6:a3238e93f694 377 static void data_logger(MB85RSxx_SPI &fram, char *ptr)
kenjiArai 6:a3238e93f694 378 {
kenjiArai 6:a3238e93f694 379 char c;
kenjiArai 6:a3238e93f694 380 unsigned long dt;
kenjiArai 6:a3238e93f694 381 uint16_t n;
kenjiArai 6:a3238e93f694 382 const char *const Msg = "Data Logger Mode, ?[Help]";
kenjiArai 6:a3238e93f694 383
kenjiArai 6:a3238e93f694 384 PRINTF("%s", Msg);
kenjiArai 6:a3238e93f694 385 put_rn();
kenjiArai 6:a3238e93f694 386 // Get FRAM resource
kenjiArai 6:a3238e93f694 387 dtlog_pointer_read(fram);
kenjiArai 6:a3238e93f694 388 dt = inf.log_inf.head;
kenjiArai 6:a3238e93f694 389 while (1){
kenjiArai 6:a3238e93f694 390 // Get FRAM resource
kenjiArai 6:a3238e93f694 391 dtlog_pointer_read(fram);
kenjiArai 6:a3238e93f694 392 PRINTF("DL>");
kenjiArai 6:a3238e93f694 393 ptr = linebuf;
kenjiArai 6:a3238e93f694 394 get_line(ptr, buf_size);
kenjiArai 6:a3238e93f694 395 switch (*ptr++) {
kenjiArai 6:a3238e93f694 396 case 'a' :
kenjiArai 6:a3238e93f694 397 put_r();
kenjiArai 6:a3238e93f694 398 read_pointer = inf.log_inf.head;
kenjiArai 6:a3238e93f694 399 n = dtlog_buf_occupation(fram);
kenjiArai 6:a3238e93f694 400 dtlog_block_read(fram, &read_pointer, n);
kenjiArai 6:a3238e93f694 401 break;
kenjiArai 6:a3238e93f694 402 case 'c' : // Clear data
kenjiArai 6:a3238e93f694 403 put_r();
kenjiArai 6:a3238e93f694 404 PRINTF("Delete all data?");
kenjiArai 6:a3238e93f694 405 put_rn();
kenjiArai 6:a3238e93f694 406 PRINTF("Enter y/n (n-cancel)");
kenjiArai 6:a3238e93f694 407 put_rn();
kenjiArai 6:a3238e93f694 408 c = GETC();
kenjiArai 6:a3238e93f694 409 PUTC(c);
kenjiArai 6:a3238e93f694 410 put_rn();
kenjiArai 6:a3238e93f694 411 if (c == 'y'){
kenjiArai 6:a3238e93f694 412 PRINTF("Cleared all logging data");
kenjiArai 6:a3238e93f694 413 dtlog_clear_all_buff(fram);
kenjiArai 6:a3238e93f694 414 } else {
kenjiArai 6:a3238e93f694 415 PRINTF("Canceled");
kenjiArai 6:a3238e93f694 416 }
kenjiArai 6:a3238e93f694 417 put_rn();
kenjiArai 6:a3238e93f694 418 break;
kenjiArai 6:a3238e93f694 419 case 'd' : // d <pointer> [<count>] - Dump buffer
kenjiArai 6:a3238e93f694 420 put_r();
kenjiArai 6:a3238e93f694 421 if (xatoi(&ptr, &dt)){ read_pointer = (uint16_t)dt;
kenjiArai 6:a3238e93f694 422 } else { read_pointer = inf.log_inf.head; }
kenjiArai 6:a3238e93f694 423 if (xatoi(&ptr, &dt)){ n = (uint8_t)dt;
kenjiArai 6:a3238e93f694 424 } else { n = BLK_SIZE; }
kenjiArai 6:a3238e93f694 425 if (read_pointer == 0){ read_pointer = 1;}
kenjiArai 6:a3238e93f694 426 dtlog_block_read(fram, &read_pointer, n);
kenjiArai 6:a3238e93f694 427 break;
kenjiArai 6:a3238e93f694 428 case 0x0d : // CR
kenjiArai 6:a3238e93f694 429 put_r();
kenjiArai 6:a3238e93f694 430 dtlog_block_read(fram, &read_pointer, BLK_SIZE);
kenjiArai 6:a3238e93f694 431 break;
kenjiArai 6:a3238e93f694 432 case 'b' : // Back
kenjiArai 6:a3238e93f694 433 put_r();
kenjiArai 6:a3238e93f694 434 read_pointer -= (BLK_SIZE * 2);
kenjiArai 6:a3238e93f694 435 if (read_pointer <= 0){ read_pointer = 1;}
kenjiArai 6:a3238e93f694 436 dtlog_block_read(fram, &read_pointer, n);
kenjiArai 6:a3238e93f694 437 break;
kenjiArai 6:a3238e93f694 438 case 'n' :
kenjiArai 6:a3238e93f694 439 case 's' : // Status
kenjiArai 6:a3238e93f694 440 put_r();
kenjiArai 6:a3238e93f694 441 dtlog_num_of_block(fram);
kenjiArai 6:a3238e93f694 442 break;
kenjiArai 6:a3238e93f694 443 case 'q' : // exit
kenjiArai 6:a3238e93f694 444 linebuf[0] = 0;
kenjiArai 6:a3238e93f694 445 return;
kenjiArai 6:a3238e93f694 446 case '?' :
kenjiArai 6:a3238e93f694 447 put_r();
kenjiArai 6:a3238e93f694 448 PRINTF("d - <pointer> [<count>] Dump one block data"); put_rn();
kenjiArai 6:a3238e93f694 449 PRINTF("a - Dump all log data"); put_rn();
kenjiArai 6:a3238e93f694 450 PRINTF("c - Clear log data"); put_rn();
kenjiArai 6:a3238e93f694 451 PRINTF("s - Logger status"); put_rn();
kenjiArai 6:a3238e93f694 452 PRINTF("q - Exit DL mode"); put_rn();
kenjiArai 6:a3238e93f694 453 break;
kenjiArai 6:a3238e93f694 454 default:
kenjiArai 6:a3238e93f694 455 PUTC('?');
kenjiArai 6:a3238e93f694 456 put_rn();
kenjiArai 6:a3238e93f694 457 break;
kenjiArai 6:a3238e93f694 458 }
kenjiArai 6:a3238e93f694 459 }
kenjiArai 6:a3238e93f694 460 }
kenjiArai 6:a3238e93f694 461
kenjiArai 6:a3238e93f694 462 void time_enter_mode(RX8025 &ex_rtc, char *pointer)
kenjiArai 6:a3238e93f694 463 {
kenjiArai 6:a3238e93f694 464 char *ptr;
kenjiArai 6:a3238e93f694 465 char linebuf[64];
kenjiArai 6:a3238e93f694 466 time_t seconds;
kenjiArai 6:a3238e93f694 467
kenjiArai 6:a3238e93f694 468 pc.printf("Set time into RTC\r\n");
kenjiArai 7:cedbf234a089 469 pc.printf(" e.g. ->19 12 19 10 11 12 -> December 19th,'19, 10:11:12\r\n");
kenjiArai 6:a3238e93f694 470 seconds = w_check_rtc_time(ex_rtc);
kenjiArai 6:a3238e93f694 471 strftime(linebuf, 50, "Current time: %Y/%m/%d,%H:%M:%S\r\n",
kenjiArai 6:a3238e93f694 472 localtime(&seconds));
kenjiArai 6:a3238e93f694 473 pc.printf("%s", linebuf);
kenjiArai 6:a3238e93f694 474 pc.printf(" If time is fine, just hit enter\r\n");
kenjiArai 6:a3238e93f694 475 pc.puts("->");
kenjiArai 6:a3238e93f694 476 if (pointer == 0) {
kenjiArai 6:a3238e93f694 477 ptr = linebuf;
kenjiArai 6:a3238e93f694 478 } else {
kenjiArai 6:a3238e93f694 479 ptr = pointer;
kenjiArai 6:a3238e93f694 480 }
kenjiArai 6:a3238e93f694 481 get_line(ptr, sizeof(linebuf));
kenjiArai 6:a3238e93f694 482 pc.printf("\r");
kenjiArai 6:a3238e93f694 483 chk_and_set_time(ex_rtc, ptr);
kenjiArai 6:a3238e93f694 484 }
kenjiArai 6:a3238e93f694 485
kenjiArai 6:a3238e93f694 486 void chk_and_set_time(RX8025 &ex_rtc, char *ptr)
kenjiArai 6:a3238e93f694 487 {
kenjiArai 6:a3238e93f694 488 unsigned long p1;
kenjiArai 6:a3238e93f694 489 struct tm t;
kenjiArai 6:a3238e93f694 490 time_t seconds;
kenjiArai 6:a3238e93f694 491
kenjiArai 6:a3238e93f694 492 if (xatoi(&ptr, &p1)) {
kenjiArai 6:a3238e93f694 493 t.tm_year = (uint8_t)p1 + 100;
kenjiArai 6:a3238e93f694 494 pc.printf("Year:%d ", (int)p1);
kenjiArai 6:a3238e93f694 495 xatoi( &ptr, &p1 );
kenjiArai 6:a3238e93f694 496 t.tm_mon = (uint8_t)p1 - 1;
kenjiArai 6:a3238e93f694 497 pc.printf("Month:%d ", (int)p1);
kenjiArai 6:a3238e93f694 498 xatoi( &ptr, &p1 );
kenjiArai 6:a3238e93f694 499 t.tm_mday = (uint8_t)p1;
kenjiArai 6:a3238e93f694 500 pc.printf("Day:%d ", (int)p1);
kenjiArai 6:a3238e93f694 501 xatoi( &ptr, &p1 );
kenjiArai 6:a3238e93f694 502 t.tm_hour = (uint8_t)p1;
kenjiArai 6:a3238e93f694 503 pc.printf("Hour:%d ", (int)p1);
kenjiArai 6:a3238e93f694 504 xatoi( &ptr, &p1 );
kenjiArai 6:a3238e93f694 505 t.tm_min = (uint8_t)p1;
kenjiArai 6:a3238e93f694 506 pc.printf("Min:%d ", (int)p1);
kenjiArai 6:a3238e93f694 507 xatoi( &ptr, &p1 );
kenjiArai 6:a3238e93f694 508 t.tm_sec = (uint8_t)p1;
kenjiArai 6:a3238e93f694 509 pc.printf("Sec: %d \r\n", (int)p1);
kenjiArai 6:a3238e93f694 510 } else {
kenjiArai 6:a3238e93f694 511 return;
kenjiArai 6:a3238e93f694 512 }
kenjiArai 6:a3238e93f694 513 seconds = mktime(&t);
kenjiArai 6:a3238e93f694 514 set_time(seconds);
kenjiArai 6:a3238e93f694 515 struct tm *time_ajd = localtime(&seconds);
kenjiArai 6:a3238e93f694 516 ex_rtc.set_time_rtc(time_ajd);
kenjiArai 6:a3238e93f694 517 pc.printf(
kenjiArai 6:a3238e93f694 518 "Date: %04d/%02d/%02d, %02d:%02d:%02d\r\n",
kenjiArai 6:a3238e93f694 519 t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec
kenjiArai 6:a3238e93f694 520 );
kenjiArai 6:a3238e93f694 521 }
kenjiArai 6:a3238e93f694 522
kenjiArai 6:a3238e93f694 523 // Get key input data
kenjiArai 6:a3238e93f694 524 void get_line (char *buff, int len)
kenjiArai 6:a3238e93f694 525 {
kenjiArai 6:a3238e93f694 526 char c;
kenjiArai 6:a3238e93f694 527 int idx = 0;
kenjiArai 6:a3238e93f694 528
kenjiArai 6:a3238e93f694 529 for (;;) {
kenjiArai 6:a3238e93f694 530 c = pc.getc();
kenjiArai 6:a3238e93f694 531 if (c == '\r') {
kenjiArai 6:a3238e93f694 532 buff[idx++] = c;
kenjiArai 6:a3238e93f694 533 break;
kenjiArai 6:a3238e93f694 534 }
kenjiArai 6:a3238e93f694 535 if ((c == '\b') && idx) {
kenjiArai 6:a3238e93f694 536 idx--;
kenjiArai 6:a3238e93f694 537 pc.putc(c);
kenjiArai 6:a3238e93f694 538 pc.putc(' ');
kenjiArai 6:a3238e93f694 539 pc.putc(c);
kenjiArai 6:a3238e93f694 540 }
kenjiArai 6:a3238e93f694 541 if (((uint8_t)c >= ' ') && (idx < len - 1)) {
kenjiArai 6:a3238e93f694 542 buff[idx++] = c;
kenjiArai 6:a3238e93f694 543 pc.putc(c);
kenjiArai 6:a3238e93f694 544 }
kenjiArai 6:a3238e93f694 545 }
kenjiArai 6:a3238e93f694 546 buff[idx] = 0;
kenjiArai 6:a3238e93f694 547 pc.putc('\n');
kenjiArai 6:a3238e93f694 548 }
kenjiArai 6:a3238e93f694 549
kenjiArai 6:a3238e93f694 550 // Change string -> integer
kenjiArai 6:a3238e93f694 551 int xatoi (char **str, unsigned long *res)
kenjiArai 6:a3238e93f694 552 {
kenjiArai 6:a3238e93f694 553 unsigned long val;
kenjiArai 6:a3238e93f694 554 unsigned char c, radix, s = 0;
kenjiArai 6:a3238e93f694 555
kenjiArai 6:a3238e93f694 556 while ((c = **str) == ' ') {
kenjiArai 6:a3238e93f694 557 (*str)++;
kenjiArai 6:a3238e93f694 558 }
kenjiArai 6:a3238e93f694 559 if (c == '-') {
kenjiArai 6:a3238e93f694 560 s = 1;
kenjiArai 6:a3238e93f694 561 c = *(++(*str));
kenjiArai 6:a3238e93f694 562 }
kenjiArai 6:a3238e93f694 563 if (c == '0') {
kenjiArai 6:a3238e93f694 564 c = *(++(*str));
kenjiArai 6:a3238e93f694 565 if (c <= ' ') {
kenjiArai 6:a3238e93f694 566 *res = 0;
kenjiArai 6:a3238e93f694 567 return 1;
kenjiArai 6:a3238e93f694 568 }
kenjiArai 6:a3238e93f694 569 if (c == 'x') {
kenjiArai 6:a3238e93f694 570 radix = 16;
kenjiArai 6:a3238e93f694 571 c = *(++(*str));
kenjiArai 6:a3238e93f694 572 } else {
kenjiArai 6:a3238e93f694 573 if (c == 'b') {
kenjiArai 6:a3238e93f694 574 radix = 2;
kenjiArai 6:a3238e93f694 575 c = *(++(*str));
kenjiArai 6:a3238e93f694 576 } else {
kenjiArai 6:a3238e93f694 577 if ((c >= '0')&&(c <= '9')) {
kenjiArai 6:a3238e93f694 578 radix = 8;
kenjiArai 6:a3238e93f694 579 } else {
kenjiArai 6:a3238e93f694 580 return 0;
kenjiArai 6:a3238e93f694 581 }
kenjiArai 6:a3238e93f694 582 }
kenjiArai 6:a3238e93f694 583 }
kenjiArai 6:a3238e93f694 584 } else {
kenjiArai 6:a3238e93f694 585 if ((c < '1')||(c > '9')) {
kenjiArai 6:a3238e93f694 586 return 0;
kenjiArai 6:a3238e93f694 587 }
kenjiArai 6:a3238e93f694 588 radix = 10;
kenjiArai 6:a3238e93f694 589 }
kenjiArai 6:a3238e93f694 590 val = 0;
kenjiArai 6:a3238e93f694 591 while (c > ' ') {
kenjiArai 6:a3238e93f694 592 if (c >= 'a') {
kenjiArai 6:a3238e93f694 593 c -= 0x20;
kenjiArai 6:a3238e93f694 594 }
kenjiArai 6:a3238e93f694 595 c -= '0';
kenjiArai 6:a3238e93f694 596 if (c >= 17) {
kenjiArai 6:a3238e93f694 597 c -= 7;
kenjiArai 6:a3238e93f694 598 if (c <= 9) {
kenjiArai 6:a3238e93f694 599 return 0;
kenjiArai 6:a3238e93f694 600 }
kenjiArai 6:a3238e93f694 601 }
kenjiArai 6:a3238e93f694 602 if (c >= radix) {
kenjiArai 6:a3238e93f694 603 return 0;
kenjiArai 6:a3238e93f694 604 }
kenjiArai 6:a3238e93f694 605 val = val * radix + c;
kenjiArai 6:a3238e93f694 606 c = *(++(*str));
kenjiArai 6:a3238e93f694 607 }
kenjiArai 6:a3238e93f694 608 if (s) {
kenjiArai 6:a3238e93f694 609 val = -val;
kenjiArai 6:a3238e93f694 610 }
kenjiArai 6:a3238e93f694 611 *res = val;
kenjiArai 6:a3238e93f694 612 return 1;
kenjiArai 6:a3238e93f694 613 }
kenjiArai 6:a3238e93f694 614
kenjiArai 6:a3238e93f694 615 // Put \r\n
kenjiArai 6:a3238e93f694 616 void put_rn(void){ PUTC('\r'); PUTC('\n');}
kenjiArai 6:a3238e93f694 617
kenjiArai 6:a3238e93f694 618 // Put \r
kenjiArai 6:a3238e93f694 619 void put_r(void){ PUTC('\r');}
kenjiArai 6:a3238e93f694 620
kenjiArai 6:a3238e93f694 621 // Put ", "
kenjiArai 6:a3238e93f694 622 void put_lin(void){ PRINTF(", ");}
kenjiArai 6:a3238e93f694 623
kenjiArai 6:a3238e93f694 624 // Put space n
kenjiArai 6:a3238e93f694 625 void put_spc(uint8_t n){ for(;n > 0; n--){ PUTC(' '); }}