EEPROMのデータをSDカードにコピーし,バイナリデータからテキストデータに変換するプログラム.SDカードスロットの接続が必要.SDカードにあらかじめformat.txtが必要.

Dependencies:   mbed SDFileSystem EEPROM_lib

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "SDFileSystem.h"
00003 #include "EEPROM_lib.h"
00004 
00005 Serial pc(USBTX, USBRX, 115200);
00006 I2C i2c_bus(p28, p27);
00007 
00008 EEPROM_lib EEPROM(i2c_bus, 4);
00009 SDFileSystem sd(p5, p6, p7, p8, "sd");
00010 
00011 const int DATA_INT = 1, DATA_FLOAT = 2, DATA_DOUBLE = 3, DATA_BOOL = 4, DATA_CHAR = 5, DATA_SHORT = 6, DATA_LONGLONG = 7;
00012 
00013 FILE *file_bin, *file_format, *file_out;
00014 
00015 int main() {
00016     wait(1.0f);
00017     
00018     //プログラムの説明
00019     pc.printf("\r\n");
00020     pc.printf("EEPROM's Binary Data Encode for Text Data\r\n");
00021     pc.printf("Please Input 'D' (large D) to Start : ");
00022     while(1){
00023         if(pc.getc() == 'D'){
00024             pc.printf("START\r\n\n");
00025             break;
00026         }
00027     }
00028     
00029     //フォーマットファイルの探索
00030     printf("Searching file [format.txt] in SD...\r\n");
00031     file_format = fopen("/sd/format.txt", "r");
00032     if(file_format == NULL){
00033         pc.printf("[format.txt] not found.\r\n");
00034         pc.printf("Please Add file [format.txt] in SD\r\n");
00035         while(1);
00036     }
00037     else{
00038         pc.printf("[format.txt] OK!!\r\n");
00039     }
00040     
00041     
00042     //フォーマットファイルの読み取り
00043     char data_line[16], data_format[16];
00044     int format_length[128], format_length_n = 0;
00045     
00046     pc.printf("Read [format.txt].\r\n");
00047     while(fgets(data_line, 16, file_format) != NULL){
00048         sscanf(data_line, "%s", data_format);
00049         if(strcmp(data_format, "int") == 0){
00050             format_length[format_length_n++] = DATA_INT;
00051             pc.printf("%d : int\r\n", format_length_n - 1);
00052         }
00053         else if(strcmp(data_format, "float") == 0){
00054             format_length[format_length_n++] = DATA_FLOAT;
00055             pc.printf("%d : float\r\n", format_length_n - 1);
00056         }
00057         else if(strcmp(data_format, "double") == 0){
00058             format_length[format_length_n++] = DATA_DOUBLE;
00059             pc.printf("%d : double\r\n", format_length_n - 1);
00060         }
00061         else if(strcmp(data_format, "bool") == 0){
00062             format_length[format_length_n++] = DATA_BOOL;
00063             pc.printf("%d : bool\r\n", format_length_n - 1);
00064         }
00065         else if(strcmp(data_format, "short") == 0){
00066             format_length[format_length_n++] = DATA_SHORT;
00067             pc.printf("%d : short\r\n", format_length_n - 1);
00068         }
00069         else if(strcmp(data_format, "longlong") == 0){
00070             format_length[format_length_n++] = DATA_LONGLONG;
00071             pc.printf("%d : long long\r\n", format_length_n - 1);
00072         }
00073         else{
00074             pc.printf("ERROR : format error!!!!!\r\n");
00075         }
00076     }
00077     
00078     fclose(file_format);
00079     pc.printf("OK!!\r\n");
00080     
00081     
00082     //EEPROMの中身をSDに移植
00083     char ADDR_H, ADDR_L;
00084     int num, block;
00085     char data_eeprom[128];
00086     
00087     ADDR_H = ADDR_L = 0x00;
00088     num = 1;
00089     block = 0;
00090     
00091     file_bin = fopen("/sd/EEPROM_data.bin", "wb");
00092     
00093     pc.printf("Data Copy [EEPROM -> SD].");
00094     
00095     for(int i = 0; i < 4096; i ++){
00096         switch(i){
00097             case 512:
00098             num = 1;
00099             block = 1;
00100             break;
00101             
00102             case 1024:
00103             num = 2;
00104             block = 0;
00105             break;
00106             
00107             case 1536:
00108             num = 2;
00109             block = 1;
00110             break;
00111             
00112             case 2048:
00113             num = 3;
00114             block = 0;
00115             break;
00116             
00117             case 2560:
00118             num = 3;
00119             block = 1;
00120             break;
00121             
00122             case 3072:
00123             num = 4;
00124             block = 0;
00125             break;
00126             
00127             case 3584:
00128             num = 4;
00129             block = 1;
00130             break;
00131         }
00132         
00133         EEPROM.readMultiByte(num, block, ADDR_H, ADDR_L, data_eeprom, 128);
00134         //pc.printf("%d %01d %02x %02x\r\n", num, block, ADDR_H, ADDR_L);
00135         pc.printf(".");
00136         fwrite(data_eeprom, sizeof(char), 128, file_bin);
00137         
00138         if(ADDR_L == 0x00){
00139             ADDR_L = 0x80;
00140         }
00141         else{
00142             ADDR_L = 0x00;
00143             ADDR_H ++;
00144         }
00145     }
00146     
00147     fclose(file_bin);
00148     pc.printf("OK!!\r\n");
00149     
00150     
00151     //バイナリファイルのオープン(読み取り用に)
00152     pc.printf("Binary File Open : ");
00153     file_bin = fopen("/sd/EEPROM_data.bin", "rb");
00154     if(file_bin == NULL){
00155         pc.printf("NG...\r\n");
00156         pc.printf("Please Check Connection and Settings\r\n");
00157         while(1);
00158     }
00159     else{
00160         pc.printf("OK!!\r\n");
00161     }
00162     
00163     
00164     //書き込むファイルのオープン
00165     pc.printf("Text File Open : ");
00166     file_out = fopen("/sd/EEPROM_encode_data.txt", "w");
00167     if(file_out == NULL){
00168         pc.printf("NG...\r\n");
00169         pc.printf("Please Check Connection and Settings\r\n");
00170         while(1);
00171     }
00172     else{
00173         pc.printf("OK!!\r\n");
00174     }
00175     
00176     
00177     //データ取得&テキストデータとして書き込み
00178     int data_int;
00179     float data_float;
00180     double data_double;
00181     bool data_bool;
00182     char data_char;
00183     short data_short;
00184     long long data_longlong;
00185     
00186     int data_count, data_size, data_print = 0;
00187     
00188     pc.printf("Data Encoding [Binary -> Text].");
00189     
00190     while(1){
00191         for(data_count = 0; data_count < format_length_n; data_count ++){
00192             switch(format_length[data_count]){
00193                 case DATA_INT:
00194                 data_size = fread(&data_int, sizeof(int), 1, file_bin);
00195                 if(data_size != 0){
00196                     fprintf(file_out, "%d\t", data_int);
00197                 }
00198                 break;
00199                 
00200                 case DATA_FLOAT:
00201                 data_size = fread(&data_float, sizeof(float), 1, file_bin);
00202                 if(data_size != 0){
00203                     fprintf(file_out, "%f\t", data_float);
00204                 }
00205                 break;
00206                 
00207                 case DATA_DOUBLE:
00208                 data_size = fread(&data_double, sizeof(double), 1, file_bin);
00209                 if(data_size != 0){
00210                     fprintf(file_out, "%lf\t", data_double);
00211                 }
00212                 break;
00213                 
00214                 case DATA_BOOL:
00215                 data_size = fread(&data_bool, sizeof(bool), 1, file_bin);
00216                 if(data_size != 0){
00217                     fprintf(file_out, "%d\t", data_bool);
00218                 }
00219                 break;
00220                 
00221                 case DATA_CHAR:
00222                 data_size = fread(&data_char, sizeof(char), 1, file_bin);
00223                 if(data_size != 0){
00224                     fprintf(file_out, "%c\t", data_char);
00225                 }
00226                 break;
00227                 
00228                 case DATA_SHORT:
00229                 data_size = fread(&data_short, sizeof(short), 1, file_bin);
00230                 if(data_size != 0){
00231                     fprintf(file_out, "%hd\t", data_short);
00232                 }
00233                 break;
00234                 
00235                 case DATA_LONGLONG:
00236                 data_size = fread(&data_longlong, sizeof(long long), 1, file_bin);
00237                 if(data_size != 0){
00238                     fprintf(file_out, "%lld\t", data_longlong);
00239                 }
00240                 break;
00241             }
00242         }
00243         
00244         if(data_print ++ == 1000){
00245             pc.printf(".");
00246             data_print = 0;
00247         }
00248         
00249         fprintf(file_out, "\r\n");
00250         if(data_size == 0){
00251             break;
00252         }
00253     }
00254     
00255     pc.printf("Complete!!\r\n");
00256     
00257     
00258     //終了
00259     fclose(file_bin);
00260     fclose(file_out);
00261     
00262     pc.printf("Program Finish!!\r\n");
00263     
00264     while(1) {
00265     }
00266 }