Data logger: Sensors -> Barometer & temperature (BMP180), Humidity & temp. (RHT03), Sunshine (Cds): Display -> 20 chracters x 4 lines: Strage -> EEPROM (AT24C1024): Special functions -> Enter sleep mode to save current, reading the logging data via serial line

Dependencies:   AT24C1024 BMP180 M41T62 RHT03 TextLCD WakeUp mbed

Fork of LPC1114_barometer_with_data_logging by Kenji Arai

Please refer following Notebook.
http://mbed.org/users/kenjiArai/notebook/mbed-lpc1114fn28-data-logger/

Committer:
kenjiArai
Date:
Mon Aug 11 21:56:18 2014 +0000
Revision:
18:2a1d75bc8ebc
Parent:
16:f164f8912201
Data logger for enviromental information using BMP180, RHT03 and Cds // redesign a hardware circuit

Who changed what in which revision?

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