First Release Demo Application.

Dependencies:   MB85RSxx_SPI SDFileSystem mbed

Fork of SDFile_Logger by APS Lab

Revision:
0:43f8f8860bdc
Child:
2:39448ebc76ba
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Aug 18 05:17:20 2017 +0000
@@ -0,0 +1,202 @@
+#include "mbed.h"
+#include "SDFileSystem.h"
+#include "MB85RSxx_SPI.h"
+#include "pinmap.h"
+
+// FRAM Address 
+#define FLAG_ADDR 0x0000
+#define SYNC_ADDR 0x0010
+#define DATA_ADDR 0x0100
+
+// System Status Flag
+#define POWER_OK   0xAA
+#define POWER_FAIL 0xBB
+#define SYNC_OK    0xCC
+#define SYNC_FAIL  0xDD
+
+// FileSystem Status
+#define FILE_OPEN       0x11
+#define FILE_PRE_WRITE  0x22
+#define FILE_POST_WRITE 0x33
+#define FILE_CLOSE      0x44
+#define FILE_SYNC       0x55
+#define FILE_READ       0x66  // Unused 
+
+
+//SPI ch1 for SD FileSystem
+SDFileSystem sd(D11, D12, D13, D10, "sd", D8, SDFileSystem::SWITCH_NONE, 25000000);
+//SPI ch3 for FRAM 
+// CLK 10MHz MODE 8.0
+MB85RSxx_SPI fram(PC_12, PC_11, PC_10, PD_2);
+
+// Application
+char buffer[32];  // Write Buffer
+char valbuf[20];  // Samplig Data Buffer
+AnalogIn analog_value(A0); // Analog Input Port if use
+time_t seconds = time(NULL); // Time stamp if use
+
+int addr=FLAG_ADDR; // for FRAM Address Pointer
+
+//Serial pc(USBTX, USBRX) 
+// Printf is output for COM port with 9600bps.
+// You can use SerialPC for debug console instead of above it.
+
+// FRAM Pointer Get
+int fram_get_addr(void)
+{
+    return addr;
+}
+
+// FRAM Pointer Set
+void fram_set_addr(int adr)
+{
+    addr=adr;
+}
+
+// Status Flag Set
+void sys_set_status(int adr, char flg)
+{
+    fram_set_addr(adr);
+    fram.write(fram_get_addr(), flg);
+}
+
+// Status Flag Get
+char sys_get_status(int adr)
+{
+    fram_set_addr(adr);
+    return fram.read(fram_get_addr());
+}
+
+// RAW Data save for FRAM, and write SD 
+void sys_write(FileHandle* file, char *buf, int size)
+{
+    int tmp = fram_get_addr();   // Get Current FRAM Address Pointer
+    //tmp+=fram_addr;              // Set Current FRAM Address Pointer 
+    
+    fram_set_addr(tmp);          // Fram Write Address Pointer Set
+    sys_set_status(SYNC_ADDR, FILE_PRE_WRITE);  // Flag Set for Pre write
+    fram.write(fram_get_addr(), buf, size);     // Save Data
+    file->write(buf, size);                     // Write File
+    sys_set_status(SYNC_ADDR, FILE_POST_WRITE); // Flag Set for Post write
+    fram_set_addr(tmp+size);     // Save Current FRAM Address Pointer
+}
+    
+// Application 
+void write_datas(char *filename)
+{
+    float adc_avr_val=0.0;
+    int cnt1, cnt2, tmp_sz;
+    set_time(1498465898+32400);
+    memset(buffer, 0, sizeof(buffer));
+    
+    sys_set_status(FLAG_ADDR, SYNC_FAIL); // Set SYNC Flag as Fail
+    sys_set_status(FLAG_ADDR+8, SYNC_OK); // Set Acctual SYNC Flag as OK
+    FileHandle* file = sd.open(filename, O_WRONLY | O_CREAT | O_TRUNC);
+    sys_set_status(SYNC_ADDR, FILE_OPEN);
+    
+    sprintf(buffer, "{\r\n\"adc log data\":[");
+    
+    fram_set_addr(DATA_ADDR);  
+    sys_write(file, &buffer[0], 19);
+    
+    sprintf(&buffer[0], "\"time\":%d ,", seconds);
+    
+    sys_write(file, &buffer[0], 19);    
+    
+    for(cnt1=0;cnt1 < 100;cnt1++) {
+        memset(buffer, 0, sizeof(buffer));
+        sprintf(&buffer[0], "\r\n{\"Samples\":%d ,", cnt1);
+        sys_write(file, &buffer[0], 18);        
+        for(cnt2=0;cnt2 < 10; cnt2++) {
+            //adc_avr_val+=analog_value.read();
+            adc_avr_val+=analog_value.read();
+            ctime(&seconds);
+        }
+        //adc_avr_val=adc_avr_val/10;
+        //sprintf(&buffer[0], "\"time\":%d ,", seconds);
+        //file->write(&buffer[0], 19);
+        sprintf(&valbuf[0], "\"averages\":%.f}", adc_avr_val*3300);
+        sys_write(file, &valbuf[0], sizeof(valbuf));
+        if(cnt1 < 99)
+        {
+            sprintf(&buffer[0], ",");
+            sys_write(file, &buffer[0], 1);
+            memset(valbuf, 0, sizeof(valbuf));
+            
+        }
+        else
+        {
+            sprintf(&buffer[0], "\n");
+            sys_write(file, &buffer[0], 1);
+        }
+    }
+    sprintf(&buffer[0], "]}\n");
+    sys_write(file, &buffer[0],2);
+    
+    sys_set_status(SYNC_ADDR, FILE_CLOSE);
+    file->close();
+    sys_set_status(SYNC_ADDR, FILE_SYNC);
+    sys_set_status(FLAG_ADDR, SYNC_OK); // Sync Flag Set as Good
+
+}
+
+void System_Resume(void)
+{
+
+}
+
+int main()
+{
+    int num=0, f=1;
+    char fname[14];
+     //Configure CRC, large frames, and write validation
+    sd.crc(true);
+    sd.large_frames(true);
+    sd.write_validation(true);
+    
+    // FRAM Initialize
+    fram.Init();
+    
+    //for(int i=0; i < 512; i++)
+    //{
+    //    fram.write(i, 0x00, 1);
+    //}
+    
+    sys_set_status(FLAG_ADDR+4, POWER_OK);  // Cu
+    //fram_set_powerflag(0);
+    
+    // Check FRAM Power Status
+    if(sys_get_status(FLAG_ADDR) == POWER_FAIL) {
+        printf("Power Down Occured!\n");
+        
+        // Power Down Recovery
+        System_Resume();
+        
+    } else {
+        printf("No Trouble Found for Power.\n");
+        // FRAM Address Set
+        //fram_set_addr(0);
+    }
+    
+    sys_set_status(FLAG_ADDR, POWER_FAIL); //Set Flag as Power Fail
+    printf("Log Start!\n");
+    while(f) {
+        sprintf(fname, "d_log%03d.json", num);
+        //Try to mount the SD card
+        //printf("\nMounting SD card...");
+        if (sd.mount() != 0) {
+            printf("SD Mount failed!\n");
+            continue;
+        }
+
+        printf("log %d : start!\n", num);        
+        //Start Logging
+        write_datas(fname);
+        //printf("log %d : success!\n", num);        
+        
+        if(num > 32) f=0;
+        else num++;
+    }
+    printf("Log Done!\n");
+    sys_set_status(FLAG_ADDR, POWER_OK); //Set Flag as Power OK
+}