Barometer program : Data Logger function includes Barometer & temperature (BMP180), Humidity & temp. (RHT03), Sunshine (Cds), RTC(M41T62) data. : Logging data saves into EEPROM (AT24C1024) using ring buffer function.

Dependencies:   AT24C1024 RHT03 TextLCD BMP180 M41T62

Fork of mbed_blinky by Mbed

Please see https://mbed.org/users/kenjiArai/notebook/mbed-lpc1114fn28-barometer-with-data-logging/#

Committer:
kenjiArai
Date:
Sun Jun 29 06:58:00 2014 +0000
Revision:
15:065fbeddc305
Child:
16:f164f8912201
Barometer program / Step by step approach -> final step,; Barometer, Humidity, Sunshine, RTC data into EEPROM (logging)

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