I-O DATA DEV2 / Mbed 2 deprecated ud-gs4-R_400G_SD_Log_No1

Dependencies:   mbed SDFileSystem_

Revision:
43:024421f7474c
Parent:
42:f42b74882970
Child:
44:48fa8beb3b00
--- a/main.cpp	Mon Sep 13 10:09:47 2021 +0000
+++ b/main.cpp	Wed Sep 15 05:10:59 2021 +0000
@@ -48,6 +48,7 @@
 //#define OFFSET_Z   0
 
 #define DATA_SIZE 512
+#define RETRY_COUNT 5
 
 HAL_StatusTypeDef writeEEPROMByte(uint32_t address, uint8_t data);
 uint8_t readEEPROMByte(uint32_t address);
@@ -79,20 +80,57 @@
 short oldcount = 0;
 short newcount = 0;
 long max_g=0;
-//long tmp_max=0;
-//long tmp_max2=0;
-short  update=0;
+long boot_count = 0;
+long reboot_count = 0;
 char buffer1[DATA_SIZE] = {};
 char buffer2[DATA_SIZE] = {};
 char stracc1[32] = {}, stracc2[32] = {};
  int lognum1 = 0, lognum2 = 0;
 char filename1[16]= {};
 char filename2[16]= {};
-int ret = 0,init=1;
-short end_flag = 0;
+int init=1;
+short clear_flag = 0;
+short writed_flag = 0;
+short error_flag = 0;
+//short reboot_flag = 0;
+short ledcount_write = 0;
+short ledcount_error = 0;
 
 Watchdog wdt;
 
+void LED_Control_Write(short cnt){
+    //Blinks every 0.5 seconds. 3 times.
+    if(cnt == 0){
+        myled = 0;
+    }
+    else if((cnt % 200) == 0 ){
+        if(myled == 0){
+            myled = 1;
+        }
+        else if(myled == 1){
+            myled = 0;
+        }    
+    }
+    
+    if(cnt > 1000){
+        myled = 1;
+        writed_flag = 0;
+    }
+}
+
+void LED_Control_Error(){
+    //Blinks every 0.25 seconds. 
+    short cnt = 0;
+    while(cnt < 20){
+        myled = 0;
+        wait(0.25);
+        myled = 1;
+        wait(0.25);
+        cnt++;
+    }
+    myled = 1;
+}
+
 void sub(){
     static short tx=0,ty=0,tz=0;
     static short tx2=0,ty2=0,tz2=0;
@@ -101,6 +139,8 @@
     static long ax,ay,az,as;
     static long ax2,ay2,az2,as2;
     static long tmp_max = 0, tmp_max2 = 0;
+    short retry = 0;
+    short ret = 0;
     
     read3axes331(&tx,&ty,&tz);
     //キャリブレーションの補正
@@ -148,11 +188,29 @@
         if((strlen(buffer1)+strlen(stracc1)) > DATA_SIZE) {
             pc.printf("try write fp1:%d,%d\r\n",strlen(buffer1),strlen(stracc1));
             //ret = fprintf(fp1,"%s",buffer1);
-            ret = fwrite(buffer1,sizeof(char),strlen(buffer1),fp1);
-            if(ret < strlen(buffer1)){
-                pc.printf("fp1 write failed:%d. errno:%d. Reboot!!!\r\n",ret,errno);
-                NVIC_SystemReset();
-            }  
+            //ret = fwrite(buffer1,sizeof(char),strlen(buffer1),fp1);
+            while((fwrite(buffer1,sizeof(char),strlen(buffer1),fp1) != strlen(buffer1)) && (retry < RETRY_COUNT)){
+                if(retry < RETRY_COUNT -1) {
+                    pc.printf("fp1 fwrite failed:%d. retry=%d\r\n",ret,retry);
+                }
+                else if(retry == RETRY_COUNT -1){
+                    pc.printf("fp1 fwrite failed:%d. Reboot!\r\n",ret);
+                    reboot_count++;
+                    for(int i = 0; i < 4; i++){
+                        writeEEPROMByte(i+8, 0x00);
+                        writeEEPROMByte(i+8, (reboot_count >> 8*i) & 0xFF);
+                    }
+                    LED_Control_Error();
+                    NVIC_SystemReset();
+                }
+                retry++;
+                wait_ms(1);
+            }
+            pc.printf("fp1 fwrite success:%d\r\n",ret);
+            retry = 0;
+            writed_flag = 1;
+            ledcount_write = 0;
+            
             memset(buffer1,0,sizeof(buffer1));
             sprintf(buffer1,"%s",stracc1);
         } else {
@@ -164,6 +222,12 @@
         tmp_max = 0;
     }
     
+    //LED Control
+    if(writed_flag){
+        LED_Control_Write(ledcount_write);
+        ledcount_write++;
+    }
+    
     if( (oldcount % 10) == 0){
         //LIS3DH
         read3axes(&tx2,&ty2,&tz2);
@@ -186,13 +250,26 @@
             sprintf(stracc2,"%d,%d,%2.2f,%2.2f\r\n",timecount,time(NULL),asc2*0.005,(float)tmp_max2*0.005);
             
             if( (strlen(buffer2)+ strlen(stracc2)) > DATA_SIZE) {
-                pc.printf("try write fp2:%d,%d\r\n",strlen(buffer2),strlen(stracc2));
-                ret = fwrite(buffer2,sizeof(char),strlen(buffer2),fp2);
-                if(ret < strlen(buffer2)){
-                    pc.printf("fp2 write failed:%d. errno:%d. Reboot!!!\r\n",ret,errno);
-                    NVIC_SystemReset();
+                pc.printf("try write fp2:%d,%d\r\n",strlen(buffer2),strlen(stracc2));   
+                while( (fwrite(buffer2,sizeof(char),strlen(buffer2),fp2) != strlen(buffer2)) && (retry < RETRY_COUNT)){
+                    if(retry < RETRY_COUNT -1) {
+                        pc.printf("fp2 fwrite failed:%d. retry=%d\r\n",ret,retry);
+                    }
+                    else if(retry == RETRY_COUNT -1){
+                        pc.printf("fp2 fwrite failed:%d. Reboot!\r\n",ret);
+                        reboot_count++;
+                        for(int i = 0; i < 4; i++){
+                            writeEEPROMByte(i+8,0x00);
+                            writeEEPROMByte(i+8, (reboot_count >> 8*i) & 0xFF);
+                        }
+                        LED_Control_Error();
+                        NVIC_SystemReset();
+                    }
+                    retry++;
+                    wait_ms(1);
                 }
-               
+                pc.printf("fp2 fwrite success:%d\r\n",ret);
+                retry = 0;
                 memset(buffer2,0,sizeof(buffer2));
                 sprintf(buffer2,"%s",stracc2);
             } else {
@@ -207,23 +284,106 @@
     
     if((time(NULL) % 300) == 0){
         //5 minutes passed. Save File.
+        //pc.printf("5minutes passed. Save File.\r\n");
         if(fp1){
-            fclose(fp1);
+            while(fclose(fp1) != 0 && retry < RETRY_COUNT){
+                if(retry < RETRY_COUNT -1){
+                    pc.printf("fp1 fclose failed:%d. retry=%d\r\n",ret,retry);
+                }
+                else if(retry == RETRY_COUNT -1){
+                    pc.printf("fp1 fclose failed:%d. Reboot!\r\n",ret);
+                    reboot_count++;
+                    for(int i = 0; i < 4; i++){
+                        writeEEPROMByte(i+8, 0x00);
+                        writeEEPROMByte(i+8, (reboot_count >> 8*i) & 0xFF);
+                    }
+                    LED_Control_Error();
+                    NVIC_SystemReset();
+                }
+                retry++;
+                wait_ms(1);
+            }
+            retry = 0;
             fp1 = NULL;
         }
         if(fp2){
-            fclose(fp2);
+            while(fclose(fp2) != 0 && retry < RETRY_COUNT){
+                if(retry < RETRY_COUNT -1){
+                    pc.printf("fp2 fclose failed:%d. retry=%d\r\n",ret,retry);
+                }
+                else if(retry == RETRY_COUNT -1){
+                    pc.printf("fp2 fclose failed:%d. Reboot!\r\n",ret);
+                        reboot_count++;
+                        for(int i = 0; i < 4; i++){
+                            writeEEPROMByte(i+8, 0x00);
+                            writeEEPROMByte(i+8, (reboot_count >> 8*i) & 0xFF);
+                        }
+                        LED_Control_Error();
+                        NVIC_SystemReset();
+                }
+                retry++;
+                wait_ms(1);
+            }
+            retry = 0;
             fp2 = NULL;
         }
+        
         fp1 = fopen(filename1,"ab");
         if(!fp1){
-            pc.printf("fp1 create file failed:%d\r\n",errno);
-            NVIC_SystemReset();
+            while(!fp1 && retry < RETRY_COUNT){
+                pc.printf("fp1 fopen failed:%d\r\n",errno);
+                wait_ms(1);
+                fp1 = fopen(filename1,"ab");
+                if(fp1){
+                    pc.printf("fp1 fopen success.\r\n");
+                    retry = 0;
+                    break;
+                }
+                else if(retry < RETRY_COUNT -1){
+                    pc.printf("fp1 fopen failed. retyr=%d\r\n",retry);
+                }
+                else if(retry == RETRY_COUNT -1){
+                    pc.printf("fp1 fopen failed. Reboot! %d\r\n",reboot_count+1);
+                    reboot_count++;
+                    
+                    for(int i = 0; i < 4; i++){
+                        pc.printf("writeEEPROM(reboot) 0x%x\r\n",(reboot_count >> 8*i) & 0xFF);
+                        writeEEPROMByte(i+8, 0x00);
+                        HAL_StatusTypeDef status = writeEEPROMByte(i+8, (reboot_count >> 8*i) & 0xFF);
+                        pc.printf("writed:0x%x,%d\r\n",readEEPROMByte(i+8),status);
+                    }
+                    LED_Control_Error();
+                    NVIC_SystemReset();
+                }
+                retry++;
+            }
         }
         fp2 = fopen(filename2,"ab");
         if(!fp2){
-            pc.printf("fp2 create file failed:%d\r\n",errno);
-            NVIC_SystemReset();
+            while(!fp2 && retry < RETRY_COUNT){
+                pc.printf("fp2 fopen failed:%d\r\n",errno);
+                wait_ms(1);
+                fp2 = fopen(filename2,"ab");
+                if(fp2){
+                    pc.printf("fp2 fopen success.\r\n");
+                    retry = 0;
+                    break;
+                }
+                else if(retry < RETRY_COUNT -1){
+                    pc.printf("fp1 fopen failed. retyr=%d\r\n",retry);
+                }
+                else if(retry == RETRY_COUNT -1){
+                    pc.printf("fp1 fopen failed. Reboot!\r\n");
+                    reboot_count++;
+                    for(int i = 0; i < 4; i++){
+                        writeEEPROMByte(i+8, 0x00);
+                        writeEEPROMByte(i+8, (reboot_count >> 8*i) & 0xFF);
+                    }
+                    LED_Control_Error();
+                    NVIC_SystemReset();
+                }
+                retry++;
+            }
         }
     }
 
@@ -232,13 +392,45 @@
             set_time(NULL);
             timecount = 0;
             if(fp1){
-                fclose(fp1);
-                //free(fp1);
+                while(fclose(fp1) != 0 && retry < RETRY_COUNT){
+                    if(retry < RETRY_COUNT -1){
+                        pc.printf("fp1 fclose failed:%d. retry=%d\r\n",ret,retry);
+                    }
+                    else if(retry == RETRY_COUNT -1){
+                        pc.printf("fp1 fclose failed:%d. Reboot!\r\n",ret);
+                        reboot_count++;
+                        for(int i = 0; i < 4; i++){
+                            writeEEPROMByte(i+8, 0x00);
+                            writeEEPROMByte(i+8, (reboot_count >> 8*i) & 0xFF);
+                        }
+                        LED_Control_Error();
+                        NVIC_SystemReset();
+                    }
+                    retry++;
+                    wait_ms(1);
+                }
+                retry = 0;
                 fp1 = NULL;
             }
             if(fp2){
-                fclose(fp2);
-                //free(fp2);
+                while(fclose(fp2) != 0 && retry < RETRY_COUNT){
+                    if(retry < RETRY_COUNT -1){
+                        pc.printf("fp12 fclose failed:%d. retry=%d\r\n",ret,retry);
+                    }
+                    else if(retry == RETRY_COUNT -1){
+                        pc.printf("fp2 fclose failed:%d. Reboot!\r\n",ret);
+                        reboot_count++;
+                        for(int i = 0; i < 4; i++){
+                            writeEEPROMByte(i+8, 0x00);
+                            writeEEPROMByte(i+8, (reboot_count >> 8*i) & 0xFF);
+                        }
+                        LED_Control_Error();
+                        NVIC_SystemReset();
+                    }
+                    retry++;
+                    wait_ms(1);
+                }
+                retry = 0;
                 fp2 = NULL;
             }
             lognum1++;
@@ -246,14 +438,54 @@
             sprintf(filename1,"/sd/new_%d",lognum1);
             sprintf(filename2,"/sd/old_%d",lognum2);
             fp1 = fopen(filename1,"ab");
-            if(!fp1){
-                pc.printf("fp1 create file failed:%d\r\n",errno);
-                NVIC_SystemReset();
+            while(!fp1 && retry < RETRY_COUNT){
+                pc.printf("fp1 fopen failed:%d\r\n",errno);
+                wait_ms(1);
+                fp1 = fopen(filename1,"ab");
+                if(fp1){
+                    pc.printf("fp1 fopen success.\r\n");
+                    retry = 0;
+                    break;
+                }
+                else if(retry < RETRY_COUNT -1){
+                    pc.printf("fp1 fopen failed. retyr=%d\r\n",retry);
+                }
+                else if(retry == RETRY_COUNT -1){
+                    pc.printf("fp1 fopen failed. Reboot!\r\n");
+                    reboot_count++;
+                    for(int i = 0; i < 4; i++){
+                        writeEEPROMByte(i+8, 0x00);
+                        writeEEPROMByte(i+8, (reboot_count >> 8*i) & 0xFF);
+                    }
+                    LED_Control_Error();
+                    NVIC_SystemReset();
+                }
+                retry++;
             }
             fp2 = fopen(filename2,"ab");
-            if(!fp2){
-                pc.printf("fp2 create file failed:%d\r\n",errno);
-                NVIC_SystemReset();
+            while(!fp2 && retry < RETRY_COUNT){
+                pc.printf("fp2 fopen failed:%d\r\n",errno);
+                wait_ms(1);
+                fp1 = fopen(filename2,"ab");
+                if(fp2){
+                    pc.printf("fp2 fopen success.\r\n");
+                    retry = 0;
+                    break;
+                }
+                else if(retry < RETRY_COUNT -1){
+                    pc.printf("fp2 fopen failed. retyr=%d\r\n",retry);
+                }
+                else if(retry == RETRY_COUNT -1){
+                    pc.printf("fp2 fopen failed. Reboot!\r\n");
+                    reboot_count++;
+                    for(int i = 0; i < 4; i++){
+                        writeEEPROMByte(i+8, 0x00);
+                        writeEEPROMByte(i+8, (reboot_count >> 8*i) & 0xFF);
+                    }
+                    LED_Control_Error();
+                    NVIC_SystemReset();
+                }
+                retry++;
             }
         
             pc.printf("Create New File:%d,%d",timecount,time(NULL));
@@ -268,8 +500,13 @@
             btn_flag = 0;
         }
         
-        if(btn_flag > 200){
-            //pc.printf("Button Pressed. Close fp\r\n");
+        if(btn_flag > 1000 && !clear_flag){
+            //ROM Crear
+            pc.printf("Button pressed. ROM clear\r\n");
+            for(int i = 0; i < 16; i++){
+                writeEEPROMByte(i, 0x00);
+            }
+            
             if(fp1){
                 fclose(fp1);
                 fp1 = NULL;
@@ -279,28 +516,57 @@
                 fp2 = NULL;
             }
             btn_flag = 0;
-            myled = 0;
-            end_flag = 1;
-            wait(1);        
+            clear_flag = 1;
+            boot_count = 0;
+            reboot_count = 0;       
         }
 }
 
 int main()
 {
+    short retry = 0;
+    pc.printf("UD-GS5 Start acceleration measurement\r\n");
+    set_time(NULL);
+    
+    myled = 0;
+    wait(3);
+    myled = 1;
+    
+    //Read Boot/Reboot count
+    for(int i = 0; i < 4; i++){
+        boot_count |= readEEPROMByte(i+4) << 8*i;
+    }
+    boot_count++;
+    for(int i = 0; i < 4; i++){
+        writeEEPROMByte(i+4, (boot_count >> 8*i) & 0xFF);
+    }
+    for(int i = 0; i < 4; i++){
+        //pc.printf("reboot_count:0x%x\r\n",readEEPROMByte(i+8));
+        reboot_count |= readEEPROMByte(i+8) << 8*i;
+    }
+    pc.printf("boot=%d, reboot=%d\r\n",boot_count,reboot_count);
+    
+    //Read Max G
+    for(int i = 0; i < 4; i++){
+            //pc.printf("readEEPROM:0x%x\r\n",readEEPROMByte(i));
+            max_g |=  readEEPROMByte(i) << 8*i;
+    }
+    pc.printf("read max_g from eeprom:%2.2f\r\n",(float)max_g*0.005);
+    
     i2c.frequency(400000);
-    short retry = 0;
+
     sprintf(filename1,"/sd/new_%d",lognum1);
     sprintf(filename2,"/sd/old_%d",lognum2);
     
     if (wdt.WatchdogCausedReset())
         pc.printf("WatchDog Reset.\r\n");
     
-    wdt.Configure(30);
+    wdt.Configure(23);
 
     while(!fp1 && retry < 5){
         fp1 = fopen(filename1,"ab");
         if(!fp1) {
-            pc.printf("fp1(%s) open failed errno:%d\r\n",filename1,errno);
+            pc.printf("fp1(%s) fopen failed errno:%d\r\n",filename1,errno);
             //NVIC_SystemReset();
         }
         else{
@@ -310,10 +576,11 @@
         wait_ms(100);
     }
     retry = 0;
+    
     while(!fp2 && retry < 5){
         fp2 = fopen(filename2,"ab");
         if(!fp2) {
-            pc.printf("fp2(%s) open failed errno:%d\r\n",filename2,errno);
+            pc.printf("fp2(%s) fopen failed errno:%d\r\n",filename2,errno);
             //NVIC_SystemReset();
         }
         else{
@@ -322,14 +589,8 @@
         retry++;
         wait_ms(100);
     }
+    retry = 0;
     
-    //Read Max G
-    for(int i = 0; i < 4; i++){
-            //pc.printf("readEEPROM:0x%x\r\n",readEEPROMByte(i));
-            max_g |=  readEEPROMByte(i) << 8*i;
-    }
-    pc.printf("read max_g from eeprom:%2.2f\r\n",(float)max_g*0.005);
-
     while(init) {
         init = initLIS331();
         initLIS3DH();
@@ -337,7 +598,8 @@
         wait_ms(100);
     }
     //interrupt.attach_us(&timer,20000);//20ms
-    while(!end_flag)
+    
+    while(1)
     {
         wdt.Service();
         timecount++;
@@ -346,7 +608,8 @@
         sub();
         wait_us(2500);
     }
-    pc.printf("Program End.\r\n");
+
+    //pc.printf("Program End.\r\n");
     return 0;
 }
 /*********** porting **************/
@@ -374,9 +637,19 @@
  {
     HAL_StatusTypeDef  status;
     address = address + 0x08080000;
-    HAL_FLASHEx_DATAEEPROM_Unlock();  //Unprotect the EEPROM to allow writing
+    
+    if (!IS_FLASH_DATA_ADDRESS(address)) {
+        pc.printf("writeEEPROMByte address outofrange\r\n");
+        return HAL_ERROR;
+    }
+    
+    HAL_FLASHEx_DATAEEPROM_Unlock();
+    //pc.printf("writeEEPROMByte HAL_FLASH_DATAEEPROM_Unlock:%d\r\n",status);
     status = HAL_FLASHEx_DATAEEPROM_Program(TYPEPROGRAMDATA_BYTE, address, data);
-    HAL_FLASHEx_DATAEEPROM_Lock();  // Reprotect the EEPROM
+    //pc.printf("writeEEPROMByte HAL_FLASH_DATAEEPROM_Program:%d\r\n",status);
+    HAL_FLASHEx_DATAEEPROM_Lock();
+    //pc.printf("writeEEPROMByte HAL_FLASH_DATAEEPROM_lock:%d\r\n",status);
+    
     return status;
 }