Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed SDFileSystem_
Diff: main.cpp
- Revision:
- 43:024421f7474c
- Parent:
- 42:f42b74882970
- Child:
- 44:48fa8beb3b00
diff -r f42b74882970 -r 024421f7474c main.cpp
--- 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;
}