main program

Dependencies:   PQMPU9250 PQINA226 mbed PQAEGPS PQEEPROM PQADXL375 SDFileSystem PQLPS22HB PQES920LR

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 
00004 #include "PQADXL375.h"
00005 #include "PQAEGPS.h"
00006 #include "PQEEPROM.h"
00007 #include "PQES920LR.h"
00008 #include "PQINA226.h"
00009 #include "PQLPS22HB.h"
00010 #include "PQMPU9250.h"
00011 
00012 #define BURN_TIME  3.0f
00013 #define T_SEP      7.0f
00014 #define T_RECOVERY 14.0f
00015 
00016 #define DEBUG_RATE    1
00017 #define DATA_RATE     20
00018 #define LOG_RATE      1
00019 #define DOWNLINK_RATE 1
00020 
00021 #define LOG_HEADER      0x11
00022 #define DOWNLINK_HEADER 0x12
00023 #define UPLINK_HEADER   0x13
00024 
00025 #define TIME_LSB    54.931640625
00026 #define VOLTAGE_LSB 1.25
00027 #define CURRENT_LSB 1.0986328125
00028 #define PRESS_LSB   0.0384521484375
00029 #define TEMP_LSB    0.002593994140625
00030 #define ACCEL_LSB   0.00048828125
00031 #define GYRO_LSB    0.06103515625
00032 #define MAG_LSB     0.146484375
00033 
00034 Serial pc(USBTX, USBRX, 115200);
00035 
00036 Serial gps_serial(p9, p10, 115200);
00037 Serial es_serial(p13, p14, 115200);
00038 
00039 I2C i2c(p28, p27);
00040 
00041 SDFileSystem sd_file_system(p5, p6, p7, p8, "sd");
00042 
00043 ES920LR es(es_serial);
00044 
00045 AEGPS gps(gps_serial);
00046 
00047 ADXL375 adxl(i2c, ADXL375::ALT_ADDRESS_HIGH);
00048 INA226 ina_in(i2c, INA226::A0_VS, INA226::A1_VS);
00049 INA226 ina_ex(i2c, INA226::A0_GND, INA226::A1_GND);
00050 LPS22HB lps(i2c, LPS22HB::SA0_HIGH);
00051 MPU9250 mpu(i2c, MPU9250::AD0_HIGH);
00052 
00053 EEPROM eeprom(i2c);
00054 
00055 Timer mission_timer;
00056 Timer flight_timer;
00057 Timer sd_timer;
00058 
00059 Ticker downlink_ticker;
00060 Ticker log_ticker;
00061 Ticker debug_ticker;
00062 
00063 DigitalIn debug_pin(p17);
00064 DigitalIn liftoff_pin(p18);
00065 DigitalIn ems_pin(p19);
00066 DigitalIn flight_pin(p20);
00067 
00068 DigitalOut sep(p21);
00069 DigitalOut buzzer(p23);
00070 DigitalOut sig(p24);
00071 
00072 BusOut led(LED1, LED2, LED3, LED4);
00073 
00074 void init();
00075 void read();
00076 void command_handler(char *command);
00077 void downlink();
00078 void log();
00079 void debug();
00080 
00081 FILE *sd;
00082 
00083 char file_name[64];
00084 
00085 bool launched = false;
00086 bool burning = false;
00087 bool apogee = false;
00088 int t = 0;
00089 
00090 int addr;
00091 
00092 char mission_timer_reset;
00093 int mission_time;
00094 int flight_time;
00095 char f_sd;
00096 char f_gps;
00097 char f_adxl;
00098 char f_ina_in;
00099 char f_ina_ex;
00100 char f_lps;
00101 char f_mpu;
00102 char f_mpu_ak;
00103 enum {
00104     SAFETY,
00105     READY,
00106     FLIGHT,
00107     SEP,
00108     EMERGENCY,
00109     RECOVERY
00110 } phase;
00111 int utc_hour;
00112 int utc_min;
00113 float utc_sec;
00114 float lat;
00115 float lon;
00116 int sat;
00117 int fix;
00118 float hdop;
00119 float alt;
00120 float geoid;
00121 float high_accel[3];
00122 float voltage_in;
00123 float current_in;
00124 float voltage_ex;
00125 float current_ex;
00126 float press;
00127 float temp;
00128 float accel[3];
00129 float gyro[3];
00130 float mag[3];
00131 
00132 float coef = 0.01;
00133 float press_prev_LPF;
00134 float press_LPF;
00135 float press_LPF_prev;
00136 float press_LPF_diff;
00137 
00138 short mission_time_bits;
00139 short flight_time_bits;
00140 char flags;
00141 short voltage_in_bits;
00142 short current_in_bits;
00143 short voltage_ex_bits;
00144 short current_ex_bits;
00145 short press_bits;
00146 short temp_bits;
00147 short accel_bits[3];
00148 short gyro_bits[3];
00149 short mag_bits[3];
00150 
00151 int main()
00152 {
00153     mission_timer.start();
00154     init();
00155 
00156     while(1) {
00157         read();
00158         led = phase;
00159         if(ems_pin) phase = EMERGENCY;
00160         switch(phase) {
00161             case SAFETY:
00162                 break;
00163             case READY:
00164                 if(flight_pin || liftoff_pin) phase = FLIGHT;
00165                 break;
00166             case FLIGHT:
00167                 if(!launched) {
00168                     flight_timer.reset();
00169                     flight_timer.start();
00170                     launched = true;
00171                     burning = true;
00172                 }
00173                 if(flight_timer.read() > BURN_TIME) {
00174                     if(burning) {
00175                         burning = false;
00176                         press_LPF_prev = press_LPF;
00177                     }
00178                     if((flight_timer.read_ms() - t) > 500) {
00179                         press_LPF_diff = press_LPF - press_LPF_prev;
00180                         press_LPF_prev = press_LPF;
00181                         if(press_LPF_diff > 0.0f) {
00182                             apogee = true;
00183                         } else {
00184                             t = flight_timer.read_ms();
00185                         }
00186                     }
00187                     if(!burning && (apogee || flight_timer.read() > T_SEP)) {
00188                         phase = SEP;
00189                     }
00190                 }
00191                 break;
00192             case SEP:
00193                 buzzer = 1;
00194                 sep = 1;
00195                 if(flight_timer.read() > T_RECOVERY) phase = RECOVERY;
00196                 break;
00197             case EMERGENCY:
00198                 buzzer = 0;
00199                 sep = 0;
00200                 break;
00201             case RECOVERY:
00202                 buzzer = 1;
00203                 sep = 0;
00204                 break;
00205         }
00206     }
00207 }
00208 
00209 void init()
00210 {
00211     char file_name_format[] = "/sd/IZU2020_AVIONICS_%d.dat";
00212     int file_number = 1;
00213     while(1) {
00214         sprintf(file_name, file_name_format, file_number);
00215         sd = fopen(file_name, "r");
00216         if(sd != NULL) {
00217             fclose(sd);
00218             file_number++;
00219         } else {
00220             sprintf(file_name, "/sd/IZU2020_AVIONICS_%d.dat", file_number);
00221             break;
00222         }
00223     }
00224     sd = fopen(file_name, "w");
00225     sd_timer.start();
00226 
00227     if(sd) {
00228         fprintf(sd, "mission_timer_reset,");
00229         fprintf(sd, "mission_time,");
00230         fprintf(sd, "flight_time,");
00231         fprintf(sd, "phase,");
00232         fprintf(sd, "f_sd,");
00233         fprintf(sd, "f_gps,");
00234         fprintf(sd, "f_adxl,");
00235         fprintf(sd, "f_ina_in,");
00236         fprintf(sd, "f_ina_ex,");
00237         fprintf(sd, "f_lps,");
00238         fprintf(sd, "f_mpu,");
00239         fprintf(sd, "f_mpu_ak,");
00240         fprintf(sd, "lat,");
00241         fprintf(sd, "lon,");
00242         fprintf(sd, "sat,");
00243         fprintf(sd, "fix,");
00244         fprintf(sd, "hdop,");
00245         fprintf(sd, "alt,");
00246         fprintf(sd, "geoid,");
00247         fprintf(sd, "high_accel_x,");
00248         fprintf(sd, "high_accel_y,");
00249         fprintf(sd, "high_accel_z,");
00250         fprintf(sd, "voltage_in,");
00251         fprintf(sd, "current_in,");
00252         fprintf(sd, "voltage_ex,");
00253         fprintf(sd, "current_ex,");
00254         fprintf(sd, "press,");
00255         fprintf(sd, "temp,");
00256         fprintf(sd, "accel_x,");
00257         fprintf(sd, "accel_y,");
00258         fprintf(sd, "accel_z,");
00259         fprintf(sd, "gyro_x,");
00260         fprintf(sd, "gyro_y,");
00261         fprintf(sd, "gyro_z,");
00262         fprintf(sd, "mag_x,");
00263         fprintf(sd, "mag_y,");
00264         fprintf(sd, "mag_z,");
00265         fprintf(sd, "\r\n");
00266     }
00267 
00268     debug_pin.mode(PullUp);
00269     liftoff_pin.mode(PullDown);
00270     ems_pin.mode(PullDown);
00271     flight_pin.mode(PullUp);
00272 
00273     debug_ticker.attach(debug, 1.0f / DEBUG_RATE);
00274     log_ticker.attach(log, 1.0f / LOG_RATE);
00275     downlink_ticker.attach(downlink, 1.0f / DOWNLINK_RATE);
00276 
00277     es.attach(command_handler);
00278 
00279     adxl.begin();
00280     ina_in.begin();
00281     ina_ex.begin();
00282     lps.begin();
00283     mpu.begin();
00284 }
00285 
00286 void read()
00287 {
00288     if(mission_timer.read_ms() >= 30*60*1000) {
00289         mission_timer.reset();
00290         mission_timer_reset++;
00291     }
00292     mission_time = mission_timer.read_ms();
00293     flight_time = flight_timer.read_ms();
00294 
00295     utc_hour  = gps.get_hour();
00296     utc_min   = gps.get_min();
00297     utc_sec   = gps.get_sec();
00298     lat   = gps.get_lat();
00299     lon   = gps.get_lon();
00300     sat   = gps.get_sat();
00301     fix   = gps.get_fix();
00302     hdop  = gps.get_hdop();
00303     alt   = gps.get_alt();
00304     geoid = gps.get_geoid();
00305 
00306     f_sd = (bool)sd;
00307 
00308     f_gps = (bool)fix;
00309 
00310     f_adxl = adxl.test();
00311     if(f_adxl) {
00312         adxl.read(high_accel);
00313     }
00314 
00315     f_ina_in = ina_in.test();
00316     if(f_ina_in) {
00317         ina_in.read_voltage(&voltage_in);
00318         ina_in.read_current(&current_in);
00319     }
00320 
00321     f_ina_ex = ina_ex.test();
00322     if(f_ina_ex) {
00323         ina_ex.read_voltage(&voltage_ex);
00324         ina_ex.read_current(&current_ex);
00325     }
00326 
00327     f_lps = lps.test();
00328     if(f_lps) {
00329         lps.read_press(&press);
00330         lps.read_temp(&temp);
00331 
00332         press_LPF = press * coef + press_prev_LPF * (1 - coef);
00333         press_prev_LPF = press_LPF;
00334     }
00335 
00336     f_mpu = mpu.test();
00337     if(f_mpu) {
00338         mpu.read_accel(accel);
00339         mpu.read_gyro(gyro);
00340     }
00341 
00342     f_mpu_ak = mpu.test_AK8963();
00343     if(f_mpu_ak) {
00344         mpu.read_mag(mag);
00345     }
00346 }
00347 
00348 void command_handler(char *command)
00349 {
00350     switch(command[0]) {
00351         case 0x80:
00352             break;
00353         case 0x81:
00354             break;
00355         case 0x82:
00356             break;
00357         case 0x83:
00358             break;
00359         case 0x84:
00360             break;
00361         case 0x85:
00362             break;
00363         case 0x86:
00364             break;
00365         case 0x87:
00366             break;
00367         case 0x88:
00368             break;
00369         case 0x89:
00370             break;
00371         case 0x8A:
00372             break;
00373         case 0x8B:
00374             break;
00375         case 0x8C:
00376             break;
00377         case 0x8D:
00378             break;
00379         case 0x8E:
00380             break;
00381         case 0x8F:
00382             break;
00383         case 0x90:
00384             break;
00385         case 0x91:
00386             break;
00387         case 0x92:
00388             break;
00389         case 0x93:
00390             break;
00391         case 0x94:
00392             break;
00393         case 0x95:
00394             break;
00395         case 0x96:
00396             break;
00397         case 0x97:
00398             break;
00399         case 0x98:
00400             break;
00401         case 0x99:
00402             break;
00403         case 0x9A:
00404             break;
00405         case 0x9B:
00406             break;
00407         case 0x9C:
00408             break;
00409         case 0x9D:
00410             break;
00411         case 0x9E:
00412             break;
00413         case 0x9F:
00414             break;
00415         case 0xA0:
00416             break;
00417         case 0xA1:
00418             break;
00419         case 0xA2:
00420             break;
00421         case 0xA3:
00422             break;
00423         case 0xA4:
00424             break;
00425         case 0xA5:
00426             break;
00427         case 0xA6:
00428             break;
00429         case 0xA7:
00430             break;
00431         case 0xA8:
00432             break;
00433         case 0xA9:
00434             break;
00435         case 0xAA:
00436             break;
00437         case 0xAB:
00438             break;
00439         case 0xAC:
00440             break;
00441         case 0xAD:
00442             break;
00443         case 0xAE:
00444             break;
00445         case 0xAF:
00446             break;
00447         case 0xB0:
00448             if(phase == READY) phase = SAFETY;
00449             break;
00450         case 0xB1:
00451             if(phase == SAFETY) phase = READY;
00452             break;
00453         case 0xB2:
00454             if(phase == READY) phase = FLIGHT;
00455             break;
00456         case 0xB3:
00457             if(!burning & phase == FLIGHT) phase = SEP;
00458             break;
00459         case 0xB4:
00460             if(phase >= FLIGHT & phase <= SEP) phase = EMERGENCY;
00461             break;
00462         case 0xB5:
00463             if(phase == SEP) phase = RECOVERY;
00464             break;
00465         case 0xB6:
00466             break;
00467         case 0xB7:
00468             break;
00469         case 0xB8:
00470             break;
00471         case 0xB9:
00472             break;
00473         case 0xBA:
00474             break;
00475         case 0xBB:
00476             break;
00477         case 0xBC:
00478             break;
00479         case 0xBD:
00480             break;
00481         case 0xBE:
00482             break;
00483         case 0xBF:
00484             break;
00485         case 0xC0:
00486             break;
00487         case 0xC1:
00488             break;
00489         case 0xC2:
00490             break;
00491         case 0xC3:
00492             break;
00493         case 0xC4:
00494             break;
00495         case 0xC5:
00496             break;
00497         case 0xC6:
00498             break;
00499         case 0xC7:
00500             break;
00501         case 0xC8:
00502             break;
00503         case 0xC9:
00504             break;
00505         case 0xCA:
00506             break;
00507         case 0xCB:
00508             break;
00509         case 0xCC:
00510             break;
00511         case 0xCD:
00512             break;
00513         case 0xCE:
00514             break;
00515         case 0xCF:
00516             break;
00517         case 0xD0:
00518             break;
00519         case 0xD1:
00520             break;
00521         case 0xD2:
00522             break;
00523         case 0xD3:
00524             break;
00525         case 0xD4:
00526             break;
00527         case 0xD5:
00528             break;
00529         case 0xD6:
00530             break;
00531         case 0xD7:
00532             break;
00533         case 0xD8:
00534             break;
00535         case 0xD9:
00536             break;
00537         case 0xDA:
00538             break;
00539         case 0xDB:
00540             break;
00541         case 0xDC:
00542             break;
00543         case 0xDD:
00544             break;
00545         case 0xDE:
00546             break;
00547         case 0xDF:
00548             break;
00549         case 0xE0:
00550             break;
00551         case 0xE1:
00552             adxl.begin();
00553             break;
00554         case 0xE2:
00555             break;
00556         case 0xE3:
00557             break;
00558         case 0xE4:
00559             break;
00560         case 0xE5:
00561             ina_ex.begin();
00562             break;
00563         case 0xE6:
00564             break;
00565         case 0xE7:
00566             break;
00567         case 0xE8:
00568             break;
00569         case 0xE9:
00570             ina_in.begin();
00571             break;
00572         case 0xEA:
00573             break;
00574         case 0xEB:
00575             break;
00576         case 0xEC:
00577             lps.begin();
00578             break;
00579         case 0xED:
00580             mpu.begin();
00581             break;
00582         case 0xEE:
00583             break;
00584         case 0xEF:
00585             break;
00586         case 0xF0:
00587             break;
00588         case 0xF1:
00589             break;
00590         case 0xF2:
00591             break;
00592         case 0xF3:
00593             break;
00594         case 0xF4:
00595             break;
00596         case 0xF5:
00597             break;
00598         case 0xF6:
00599             break;
00600         case 0xF7:
00601             break;
00602         case 0xF8:
00603             break;
00604         case 0xF9:
00605             break;
00606         case 0xFA:
00607             break;
00608         case 0xFB:
00609             break;
00610         case 0xFC:
00611             break;
00612         case 0xFD:
00613             break;
00614         case 0xFE:
00615             break;
00616         case 0xFF:
00617             NVIC_SystemReset();
00618             break;
00619     }
00620 }
00621 
00622 void downlink()
00623 {
00624     mission_time_bits = (short)(mission_time / TIME_LSB);
00625     flight_time_bits = (short)(flight_time / TIME_LSB);
00626     flags = 0;
00627     flags |= f_sd      << 7;
00628     flags |= f_gps     << 6;
00629     flags |= f_adxl    << 5;
00630     flags |= f_ina_in  << 4;
00631     flags |= f_ina_ex  << 3;
00632     flags |= f_lps     << 2;
00633     flags |= f_mpu     << 1;
00634     flags |= f_mpu_ak;
00635     voltage_in_bits = (short)(voltage_in / VOLTAGE_LSB);
00636     current_in_bits = (short)(current_in / CURRENT_LSB);
00637     voltage_ex_bits = (short)(voltage_ex / VOLTAGE_LSB);
00638     current_ex_bits = (short)(current_ex / CURRENT_LSB);
00639     press_bits = (short)(press / PRESS_LSB);
00640     temp_bits = (short)(temp / TEMP_LSB);
00641     for(int i = 0; i < 3; i++) {
00642         accel_bits[i] = (short)(accel[i] / ACCEL_LSB);
00643     }
00644     for(int i = 0; i < 3; i++) {
00645         gyro_bits[i] = (short)(gyro[i] / GYRO_LSB);
00646     }
00647     for(int i = 0; i < 3; i++) {
00648         mag_bits[i] = (short)(mag[i] / MAG_LSB);
00649     }
00650 
00651     char data[50];
00652     data[0] = DOWNLINK_HEADER;
00653     data[1] = mission_timer_reset;
00654     data[2] = ((char*)&mission_time_bits)[0];
00655     data[3] = ((char*)&mission_time_bits)[1];
00656     data[4] = ((char*)&flight_time_bits)[0];
00657     data[5] = ((char*)&flight_time_bits)[1];
00658     data[6] = flags;
00659     data[7] = phase;
00660     data[8] = ((char*)&lat)[0];
00661     data[9] = ((char*)&lat)[1];
00662     data[10] = ((char*)&lat)[2];
00663     data[11] = ((char*)&lat)[3];
00664     data[12] = ((char*)&lon)[0];
00665     data[13] = ((char*)&lon)[1];
00666     data[14] = ((char*)&lon)[2];
00667     data[15] = ((char*)&lon)[3];
00668     data[16] = ((char*)&alt)[0];
00669     data[17] = ((char*)&alt)[1];
00670     data[18] = ((char*)&alt)[2];
00671     data[19] = ((char*)&alt)[3];
00672     data[20] = ((char*)&voltage_in_bits)[0];
00673     data[21] = ((char*)&voltage_in_bits)[1];
00674     data[22] = ((char*)&current_in_bits)[0];
00675     data[23] = ((char*)&current_in_bits)[1];
00676     data[24] = ((char*)&voltage_ex_bits)[0];
00677     data[25] = ((char*)&voltage_ex_bits)[1];
00678     data[26] = ((char*)&current_ex_bits)[0];
00679     data[27] = ((char*)&current_ex_bits)[1];
00680     data[28] = ((char*)&press_bits)[0];
00681     data[29] = ((char*)&press_bits)[1];
00682     data[30] = ((char*)&temp_bits)[0];
00683     data[31] = ((char*)&temp_bits)[1];
00684     data[32] = ((char*)&accel_bits[0])[0];
00685     data[33] = ((char*)&accel_bits[0])[1];
00686     data[34] = ((char*)&accel_bits[1])[0];
00687     data[35] = ((char*)&accel_bits[1])[1];
00688     data[36] = ((char*)&accel_bits[2])[0];
00689     data[37] = ((char*)&accel_bits[2])[1];
00690     data[38] = ((char*)&gyro_bits[0])[0];
00691     data[39] = ((char*)&gyro_bits[0])[1];
00692     data[40] = ((char*)&gyro_bits[1])[0];
00693     data[41] = ((char*)&gyro_bits[1])[1];
00694     data[42] = ((char*)&gyro_bits[2])[0];
00695     data[43] = ((char*)&gyro_bits[2])[1];
00696     data[44] = ((char*)&mag_bits[0])[0];
00697     data[45] = ((char*)&mag_bits[0])[1];
00698     data[46] = ((char*)&mag_bits[1])[0];
00699     data[47] = ((char*)&mag_bits[1])[1];
00700     data[48] = ((char*)&mag_bits[2])[0];
00701     data[49] = ((char*)&mag_bits[2])[1];
00702 
00703     es.send(data, 50);
00704 }
00705 
00706 void log()
00707 {
00708     if(phase >= FLIGHT && phase <= SEP) {
00709         char data[128];
00710         data[0] = LOG_HEADER;
00711         data[1] = ((char*)&mission_timer_reset)[0];
00712         data[2] = ((char*)&mission_time)[0];
00713         data[3] = ((char*)&mission_time)[1];
00714         data[4] = ((char*)&mission_time)[2];
00715         data[5] = ((char*)&mission_time)[3];
00716         data[6] = ((char*)&flight_time)[0];
00717         data[7] = ((char*)&flight_time)[1];
00718         data[8] = ((char*)&flight_time)[2];
00719         data[9] = ((char*)&flight_time)[3];
00720         data[10] = ((char*)&f_sd)[0];
00721         data[11] = ((char*)&f_gps)[0];
00722         data[12] = ((char*)&f_adxl)[0];
00723         data[13] = ((char*)&f_ina_in)[0];
00724         data[14] = ((char*)&f_ina_ex)[0];
00725         data[15] = ((char*)&f_lps)[0];
00726         data[16] = ((char*)&f_mpu)[0];
00727         data[17] = ((char*)&f_mpu_ak)[0];
00728         data[18] = ((char*)&phase)[0];
00729         data[19] = ((char*)&lat)[0];
00730         data[20] = ((char*)&lat)[1];
00731         data[21] = ((char*)&lat)[2];
00732         data[22] = ((char*)&lat)[3];
00733         data[23] = ((char*)&lon)[0];
00734         data[24] = ((char*)&lon)[1];
00735         data[25] = ((char*)&lon)[2];
00736         data[26] = ((char*)&lon)[3];
00737         data[27] = ((char*)&sat)[0];
00738         data[28] = ((char*)&sat)[1];
00739         data[29] = ((char*)&sat)[2];
00740         data[30] = ((char*)&sat)[3];
00741         data[31] = ((char*)&fix)[0];
00742         data[32] = ((char*)&fix)[1];
00743         data[33] = ((char*)&fix)[2];
00744         data[34] = ((char*)&fix)[3];
00745         data[35] = ((char*)&hdop)[0];
00746         data[36] = ((char*)&hdop)[1];
00747         data[37] = ((char*)&hdop)[2];
00748         data[38] = ((char*)&hdop)[3];
00749         data[39] = ((char*)&alt)[0];
00750         data[40] = ((char*)&alt)[1];
00751         data[41] = ((char*)&alt)[2];
00752         data[42] = ((char*)&alt)[3];
00753         data[43] = ((char*)&geoid)[0];
00754         data[44] = ((char*)&geoid)[1];
00755         data[45] = ((char*)&geoid)[2];
00756         data[46] = ((char*)&geoid)[3];
00757         data[47] = ((char*)&high_accel[0])[0];
00758         data[48] = ((char*)&high_accel[0])[1];
00759         data[49] = ((char*)&high_accel[0])[2];
00760         data[50] = ((char*)&high_accel[0])[3];
00761         data[51] = ((char*)&high_accel[1])[0];
00762         data[52] = ((char*)&high_accel[1])[1];
00763         data[53] = ((char*)&high_accel[1])[2];
00764         data[54] = ((char*)&high_accel[1])[3];
00765         data[55] = ((char*)&high_accel[2])[0];
00766         data[56] = ((char*)&high_accel[2])[1];
00767         data[57] = ((char*)&high_accel[2])[2];
00768         data[58] = ((char*)&high_accel[2])[3];
00769         data[59] = ((char*)&voltage_in)[0];
00770         data[60] = ((char*)&voltage_in)[1];
00771         data[61] = ((char*)&voltage_in)[2];
00772         data[62] = ((char*)&voltage_in)[3];
00773         data[63] = ((char*)&current_in)[0];
00774         data[64] = ((char*)&current_in)[1];
00775         data[65] = ((char*)&current_in)[2];
00776         data[66] = ((char*)&current_in)[3];
00777         data[67] = ((char*)&voltage_ex)[0];
00778         data[68] = ((char*)&voltage_ex)[1];
00779         data[69] = ((char*)&voltage_ex)[2];
00780         data[70] = ((char*)&voltage_ex)[3];
00781         data[71] = ((char*)&current_ex)[0];
00782         data[72] = ((char*)&current_ex)[1];
00783         data[73] = ((char*)&current_ex)[2];
00784         data[74] = ((char*)&current_ex)[3];
00785         data[75] = ((char*)&press)[0];
00786         data[76] = ((char*)&press)[1];
00787         data[77] = ((char*)&press)[2];
00788         data[78] = ((char*)&press)[3];
00789         data[79] = ((char*)&temp)[0];
00790         data[80] = ((char*)&temp)[1];
00791         data[81] = ((char*)&temp)[2];
00792         data[82] = ((char*)&temp)[3];
00793         data[83] = ((char*)&accel[0])[0];
00794         data[84] = ((char*)&accel[0])[1];
00795         data[85] = ((char*)&accel[0])[2];
00796         data[86] = ((char*)&accel[0])[3];
00797         data[87] = ((char*)&accel[1])[0];
00798         data[88] = ((char*)&accel[1])[1];
00799         data[89] = ((char*)&accel[1])[2];
00800         data[90] = ((char*)&accel[1])[3];
00801         data[91] = ((char*)&accel[2])[0];
00802         data[92] = ((char*)&accel[2])[1];
00803         data[93] = ((char*)&accel[2])[2];
00804         data[94] = ((char*)&accel[2])[3];
00805         data[95] = ((char*)&gyro[0])[0];
00806         data[96] = ((char*)&gyro[0])[1];
00807         data[97] = ((char*)&gyro[0])[2];
00808         data[98] = ((char*)&gyro[0])[3];
00809         data[99] = ((char*)&gyro[1])[0];
00810         data[100] = ((char*)&gyro[1])[1];
00811         data[101] = ((char*)&gyro[1])[2];
00812         data[102] = ((char*)&gyro[1])[3];
00813         data[103] = ((char*)&gyro[2])[0];
00814         data[104] = ((char*)&gyro[2])[1];
00815         data[105] = ((char*)&gyro[2])[2];
00816         data[106] = ((char*)&gyro[2])[3];
00817         data[107] = ((char*)&mag[0])[0];
00818         data[108] = ((char*)&mag[0])[1];
00819         data[109] = ((char*)&mag[0])[2];
00820         data[110] = ((char*)&mag[0])[3];
00821         data[111] = ((char*)&mag[1])[0];
00822         data[112] = ((char*)&mag[1])[1];
00823         data[113] = ((char*)&mag[1])[2];
00824         data[114] = ((char*)&mag[1])[3];
00825         data[115] = ((char*)&mag[2])[0];
00826         data[116] = ((char*)&mag[2])[1];
00827         data[117] = ((char*)&mag[2])[2];
00828         data[118] = ((char*)&mag[2])[3];
00829         data[119] = 0x00;
00830         data[120] = 0x00;
00831         data[121] = 0x00;
00832         data[122] = 0x00;
00833         data[123] = 0x00;
00834         data[124] = 0x00;
00835         data[125] = 0x00;
00836         data[126] = 0x00;
00837         data[127] = 0x00;
00838 
00839         eeprom.write(addr, data, 128);
00840         addr += 0x80;
00841     }
00842 
00843     if(sd) {
00844         fprintf(sd, "%d,", mission_timer_reset);
00845         fprintf(sd, "%d,", mission_time);
00846         fprintf(sd, "%d,", flight_time);
00847         fprintf(sd, "%d,", phase);
00848         fprintf(sd, "%d,", f_sd);
00849         fprintf(sd, "%d,", f_gps);
00850         fprintf(sd, "%d,", f_adxl);
00851         fprintf(sd, "%d,", f_ina_in);
00852         fprintf(sd, "%d,", f_ina_ex);
00853         fprintf(sd, "%d,", f_lps);
00854         fprintf(sd, "%d,", f_mpu);
00855         fprintf(sd, "%d,", f_mpu_ak);
00856         fprintf(sd, "%f,", lat);
00857         fprintf(sd, "%f,", lon);
00858         fprintf(sd, "%d,", sat);
00859         fprintf(sd, "%d,", fix);
00860         fprintf(sd, "%f,", hdop);
00861         fprintf(sd, "%f,", alt);
00862         fprintf(sd, "%f,", geoid);
00863         fprintf(sd, "%f,", high_accel[0]);
00864         fprintf(sd, "%f,", high_accel[1]);
00865         fprintf(sd, "%f,", high_accel[2]);
00866         fprintf(sd, "%f,", voltage_in);
00867         fprintf(sd, "%f,", current_in);
00868         fprintf(sd, "%f,", voltage_ex);
00869         fprintf(sd, "%f,", current_ex);
00870         fprintf(sd, "%f,", press);
00871         fprintf(sd, "%f,", temp);
00872         fprintf(sd, "%f,", accel[0]);
00873         fprintf(sd, "%f,", accel[1]);
00874         fprintf(sd, "%f,", accel[2]);
00875         fprintf(sd, "%f,", gyro[0]);
00876         fprintf(sd, "%f,", gyro[1]);
00877         fprintf(sd, "%f,", gyro[2]);
00878         fprintf(sd, "%f,", mag[0]);
00879         fprintf(sd, "%f,", mag[1]);
00880         fprintf(sd, "%f,", mag[2]);
00881         fprintf(sd, "\r\n");
00882     }
00883 
00884     if(sd_timer.read_ms() >= 60*1000) {
00885         sd_timer.reset();
00886         sd_timer.start();
00887         if(sd) {
00888             fclose(sd);
00889             sd = fopen(file_name, "a");
00890         }
00891     }
00892 }
00893 
00894 void debug()
00895 {
00896     if(!debug_pin) {
00897         pc.printf("mission_timer_reset: %d\r\n", mission_timer_reset);
00898         pc.printf("mission_time: %d\r\n", mission_time);
00899         pc.printf("flight_time: %d\r\n", flight_time);
00900         pc.printf("phase: %d\r\n", phase);
00901         pc.printf("f_sd: %d\r\n", f_sd);
00902         pc.printf("f_gps: %d\r\n", f_gps);
00903         pc.printf("f_adxl: %d\r\n", f_adxl);
00904         pc.printf("f_ina_in: %d\r\n", f_ina_in);
00905         pc.printf("f_ina_ex: %d\r\n", f_ina_ex);
00906         pc.printf("f_lps: %d\r\n", f_lps);
00907         pc.printf("f_mpu: %d\r\n", f_mpu);
00908         pc.printf("f_mpu_ak: %d\r\n", f_mpu_ak);
00909         pc.printf("lat: %f\r\n", lat);
00910         pc.printf("lon: %f\r\n", lon);
00911         pc.printf("sat: %d\r\n", sat);
00912         pc.printf("fix: %d\r\n", fix);
00913         pc.printf("hdop: %f\r\n", hdop);
00914         pc.printf("alt: %f\r\n", alt);
00915         pc.printf("geoid: %f\r\n", geoid);
00916         pc.printf("high_accel_x: %f\r\n", high_accel[0]);
00917         pc.printf("high_accel_y: %f\r\n", high_accel[1]);
00918         pc.printf("high_accel_z: %f\r\n", high_accel[2]);
00919         pc.printf("voltage_in: %f\r\n", voltage_in);
00920         pc.printf("current_in: %f\r\n", current_in);
00921         pc.printf("voltage_ex: %f\r\n", voltage_ex);
00922         pc.printf("current_ex: %f\r\n", current_ex);
00923         pc.printf("press: %f\r\n", press);
00924         pc.printf("temp: %f\r\n", temp);
00925         pc.printf("accel_x: %f\r\n", accel[0]);
00926         pc.printf("accel_y: %f\r\n", accel[1]);
00927         pc.printf("accel_z: %f\r\n", accel[2]);
00928         pc.printf("gyro_x: %f\r\n", gyro[0]);
00929         pc.printf("gyro_y: %f\r\n", gyro[1]);
00930         pc.printf("gyro_z: %f\r\n", gyro[2]);
00931         pc.printf("mag_x: %f\r\n", mag[0]);
00932         pc.printf("mag_y: %f\r\n", mag[1]);
00933         pc.printf("mag_z: %f\r\n", mag[2]);
00934     }
00935 }