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/
dt_logger.cpp@7:cedbf234a089, 2019-12-19 (annotated)
- Committer:
- kenjiArai
- Date:
- Thu Dec 19 01:43:46 2019 +0000
- Revision:
- 7:cedbf234a089
- Parent:
- 6:a3238e93f694
small modification
Who changed what in which revision?
User | Revision | Line number | New 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(' '); }} |