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: PQMPU9250 PQINA226 mbed PQAEGPS PQEEPROM PQADXL375 SDFileSystem PQLPS22HB PQES920LR
Diff: main.cpp
- Revision:
- 1:5c46289e3bd1
- Parent:
- 0:106e97338223
- Child:
- 2:104839501493
--- a/main.cpp Tue Jan 07 10:50:29 2020 +0000 +++ b/main.cpp Sat Feb 15 03:35:10 2020 +0000 @@ -11,21 +11,44 @@ #define DEBUG 1 -#define TIME_SEP1 7.0f -#define TIME_SEP2 5.0f -#define TIME_RECOVERY 30.0f -#define ALT_SEP1 500.0f +#define BURN_TIME 3.0f +#define T_SEP 7.0f +#define T_RECOVERY 14.0f + +#define DATA_RATE 20 +#define LOG_RATE 1 +#define DOWNLINK_RATE 1 + +#define LOG_HEADER 0x11 +#define DOWNLINK_HEADER 0x12 +#define UPLINK_HEADER 0x13 + +#define TIME_LSB 54.9 +#define LAT_LSB 0.00275 +#define LON_LSB 0.00549 +#define ALT_LSB 15.3 +#define HIGH_ACCEL_LSB 0.0061 +#define VOLTAGE_LSB 1.25 +#define CURRENT_LSB 1.1 +#define PRESS_LSB 0.0385 +#define TEMP_LSB 0.00259 +#define ACCEL_LSB 0.000488 +#define GYRO_LSB 0.061 +#define MAG_LSB 0.146 Serial pc(USBTX, USBRX, 115200); -Serial gps_serial(p9, p10, 115200); -Serial es_serial(p13, p14, 115200); + +Serial gps_serial(p13, p14, 115200); +Serial es_serial(p9, p10, 115200); I2C i2c(p28, p27); -SDFileSystem sd(p5, p6, p7, p8, "sd"); +LocalFileSystem local_file_system("local"); +SDFileSystem sd_file_system(p5, p6, p7, p8, "sd"); + +ES920LR es(es_serial); AEGPS gps(gps_serial); -ES920LR es(es_serial); ADXL375 adxl(i2c, ADXL375::ALT_ADDRESS_HIGH); INA226 ina_in(i2c, INA226::A0_VS, INA226::A1_VS); @@ -39,142 +62,213 @@ Timer flight_timer; Timer sd_timer; -Timeout sep1_timeout; -Timeout sep2_timeout; +Timeout sep_timeout; Timeout recovery_timeout; +Ticker debug_ticker; Ticker log_ticker; -Ticker read_ticker; - -DigitalIn flight_pin(p24); +Ticker downlink_ticker; -DigitalOut sep1(p21); -DigitalOut sep2(p22); -DigitalOut buzzer(p23); +DigitalIn liftoff_pin(p18); +DigitalIn ems_pin(p19); +DigitalIn flight_pin(p26); -AnalogIn pitot(p20); +DigitalOut sep(p25); +DigitalOut buzzer(p22); + +BusOut led(LED4, LED3, LED2, LED1); void init(); void read(); void log(); -void separate1(); -void separate2(); -void recovery(); void downlink(); void command_handler(char *command); int addr; -FILE *fp; +FILE *local; +FILE *sd; -typedef enum { - INIT, - SAFETY, - WAIT, - FLIGHT, - SEP1, - SEP2, - RECOVERY -} Phase_t; +char file_name[64]; + +int launched = 0; +int burning = 0; -struct { - int mission_timer_reset; - int mission_time; - int flight_timer_reset; - int flight_time; - Phase_t phase; - char f_sd; - char f_adxl; - char f_ina_in; - char f_ina_ex; - char f_lps; - char f_mpu; - char f_mpu_ak; - int hour; - int min; - float sec; - float lat; - float lon; - int sat; - int fix; - float hdop; - float alt; - float geoid; - float high_accel[3]; - float ina_in_v; - float ina_in_i; - float ina_ex_v; - float ina_ex_i; - float press; - float temp; - float accel[3]; - float gyro[3]; - float mag[3]; -} rocket; +char mission_timer_reset; +int mission_time; +int flight_time; +char f_sd; +char f_gps; +char f_adxl; +char f_ina_in; +char f_ina_ex; +char f_lps; +char f_mpu; +char f_mpu_ak; +enum { + SAFETY, + READY, + FLIGHT, + SEP, + EMERGENCY, + RECOVERY +} phase; +int utc_hour; +int utc_min; +float utc_sec; +float lat; +float lon; +int sat; +int fix; +float hdop; +float alt; +float geoid; +float high_accel[3]; +float voltage_in; +float current_in; +float voltage_ex; +float current_ex; +float press; +float temp; +float accel[3]; +float gyro[3]; +float mag[3]; + +float press_prev; +float press_diff; + +short mission_time_bits; +short flight_time_bits; +char flags; +short lat_bits; +short lon_bits; +short alt_bits; +short high_accel_bits[3]; +short voltage_in_bits; +short current_in_bits; +short voltage_ex_bits; +short current_ex_bits; +short press_bits; +short temp_bits; +short accel_bits[3]; +short gyro_bits[3]; +short mag_bits[3]; int main() { - flight_pin.mode(PullUp); mission_timer.start(); + init(); + sd_timer.start(); - log_ticker.attach(&log, 1.0f); - - es.attach(command_handler); while(1) { read(); - if(rocket.phase == INIT) { - init(); - rocket.phase = SAFETY; - } else if(rocket.phase == SAFETY) { - - } else if(rocket.phase == WAIT) { - if(flight_pin) { - sep1_timeout.attach(&separate1, TIME_SEP1); - recovery_timeout.attach(&recovery, TIME_RECOVERY); - rocket.phase = FLIGHT; - } - } else if(rocket.phase == FLIGHT) { - flight_timer.start(); - if(rocket.alt > SEP1) { - sep2_timeout.attach(&separate2, TIME_SEP2); - rocket.phase = SEP1; - } - } else if(rocket.phase == SEP1) { - if(false/*rocket.alt < ALT_SEP1*/) { - rocket.phase = RECOVERY; - } - } else if(rocket.phase == SEP2) { - } else if(rocket.phase == RECOVERY) { + led = phase; + switch(phase) { + case SAFETY: + break; + case READY: + if(flight_pin | liftoff_pin) phase = FLIGHT; + break; + case FLIGHT: + if(!launched) { + flight_timer.reset(); + flight_timer.start(); + launched = 1; + burning = 1; + } + if(flight_timer.read() > T_SEP) { + burning = 0; + if(!burning & ( press_diff > 0.0f | flight_timer.read() > T_SEP ) ) { + phase = SEP; + } + } + break; + case SEP: + buzzer = 1; + sep = 1; + if(flight_timer.read() > T_RECOVERY) phase = RECOVERY; + break; + case EMERGENCY: + sep = 0; + break; + case RECOVERY: + sep = 0; + break; } if(mission_timer.read_ms() >= 30*60*1000) { mission_timer.reset(); - rocket.mission_timer_reset++; + mission_timer_reset++; } } } -void separate1() -{ - rocket.phase = SEP1; - sep1_timeout.detach(); -} - -void separate2() -{ - rocket.phase = SEP2; - sep2_timeout.detach(); -} - -void recovery() -{ - rocket.phase = RECOVERY; - recovery_timeout.detach(); -} - void init() { - fp = fopen("/sd/IZU2020_AVIONICS.txt", "a"); + char file_name_format[] = "/sd/IZU2020_AVIONICS_%d.dat"; + int file_number = 1; + while(1) { + sprintf(file_name, file_name_format, file_number); + sd = fopen(file_name, "r"); + if(sd != NULL) { + fclose(sd); + file_number++; + } else { + sprintf(file_name, "/sd/IZU2020_AVIONICS_%d.dat", file_number); + break; + } + } + sd = fopen(file_name, "w"); + + if(sd) { + fprintf(sd, "mission_timer_reset,"); + fprintf(sd, "mission_time,"); + fprintf(sd, "flight_time,"); + fprintf(sd, "phase,"); + fprintf(sd, "f_sd,"); + fprintf(sd, "f_gps,"); + fprintf(sd, "f_adxl,"); + fprintf(sd, "f_ina_in,"); + fprintf(sd, "f_ina_ex,"); + fprintf(sd, "f_lps,"); + fprintf(sd, "f_mpu,"); + fprintf(sd, "f_mpu_ak,"); + fprintf(sd, "lat,"); + fprintf(sd, "lon,"); + fprintf(sd, "sat,"); + fprintf(sd, "fix,"); + fprintf(sd, "hdop,"); + fprintf(sd, "alt,"); + fprintf(sd, "geoid,"); + fprintf(sd, "high_accel_x,"); + fprintf(sd, "high_accel_y,"); + fprintf(sd, "high_accel_z,"); + fprintf(sd, "voltage_in,"); + fprintf(sd, "current_in,"); + fprintf(sd, "voltage_ex,"); + fprintf(sd, "current_ex,"); + fprintf(sd, "press,"); + fprintf(sd, "temp,"); + fprintf(sd, "accel_x,"); + fprintf(sd, "accel_y,"); + fprintf(sd, "accel_z,"); + fprintf(sd, "gyro_x,"); + fprintf(sd, "gyro_y,"); + fprintf(sd, "gyro_z,"); + fprintf(sd, "mag_x,"); + fprintf(sd, "mag_y,"); + fprintf(sd, "mag_z,"); + fprintf(sd, "\r\n"); + } + + liftoff_pin.mode(PullDown); + ems_pin.mode(PullDown); + flight_pin.mode(PullUp); + + log_ticker.attach(log, LOG_RATE); + downlink_ticker.attach(downlink, 1.0f / DOWNLINK_RATE); + + es.attach(command_handler); adxl.begin(); ina_in.begin(); @@ -185,179 +279,646 @@ void read() { - rocket.f_sd = (char)(bool)fp; - rocket.f_adxl = (char)adxl.test(); - rocket.f_ina_in = (char)ina_in.test(); - rocket.f_ina_ex = (char)ina_ex.test(); - rocket.f_lps = (char)lps.test(); - rocket.f_mpu = (char)mpu.test(); - rocket.f_mpu_ak = (char)mpu.test_AK8963(); + mission_time = mission_timer.read_ms(); + flight_time = flight_timer.read_ms(); - rocket.mission_time = mission_timer.read_ms(); - rocket.flight_time = flight_timer.read_ms(); + utc_hour = gps.get_hour(); + utc_min = gps.get_min(); + utc_sec = gps.get_sec(); + lat = gps.get_lat(); + lon = gps.get_lon(); + sat = gps.get_sat(); + fix = gps.get_fix(); + hdop = gps.get_hdop(); + alt = gps.get_alt(); + geoid = gps.get_geoid(); + + f_sd = (bool)sd; + + f_adxl = adxl.test(); + if(f_adxl) adxl.read(high_accel); + + f_ina_in = ina_in.test(); + if(f_ina_in) { + ina_in.read_voltage(&voltage_in); + ina_in.read_current(¤t_in); + } - rocket.hour = gps.get_hour(); - rocket.min = gps.get_min(); - rocket.sec = gps.get_sec(); - rocket.lat = gps.get_lat(); - rocket.lon = gps.get_lon(); - rocket.sat = gps.get_sat(); - rocket.fix = gps.get_fix(); - rocket.hdop = gps.get_hdop(); - rocket.alt = gps.get_alt(); - rocket.geoid = gps.get_geoid(); + f_ina_ex = ina_ex.test(); + if(f_ina_ex) { + ina_ex.read_voltage(&voltage_ex); + ina_ex.read_current(¤t_ex); + } - adxl.read(rocket.high_accel); - - ina_in.read_voltage(&rocket.ina_in_v); - ina_in.read_current(&rocket.ina_in_i); - ina_ex.read_voltage(&rocket.ina_ex_v); - ina_ex.read_current(&rocket.ina_ex_i); + f_lps = lps.test(); + if(f_lps) { + lps.read_press(&press); + press_diff = press - press_prev; + press_prev = press; + lps.read_temp(&temp); + } - lps.read_press(&rocket.press); - lps.read_temp(&rocket.temp); + f_mpu = mpu.test(); + if(f_mpu) { + mpu.read_accel(accel); + mpu.read_gyro(gyro); + } - mpu.read_accel(rocket.accel); - mpu.read_gyro(rocket.gyro); - mpu.read_mag(rocket.mag); + f_mpu_ak = mpu.test_AK8963(); + if(f_mpu_ak) { + mpu.read_mag(mag); + } } void command_handler(char *command) { - pc.printf("received:%x\r\n", command[0]); + pc.printf("COMMAND: %02x", command[0]); switch(command[0]) { - case 0x01: - if(rocket.phase == WAIT) { - rocket.phase = SAFETY; - } + case 0x80: + break; + case 0x81: + break; + case 0x82: + break; + case 0x83: + break; + case 0x84: + break; + case 0x85: + break; + case 0x86: + break; + case 0x87: + break; + case 0x88: + break; + case 0x89: + break; + case 0x8A: + break; + case 0x8B: + break; + case 0x8C: + break; + case 0x8D: + break; + case 0x8E: + break; + case 0x8F: + break; + case 0x90: + break; + case 0x91: + break; + case 0x92: + break; + case 0x93: + break; + case 0x94: + break; + case 0x95: + break; + case 0x96: + break; + case 0x97: + break; + case 0x98: + break; + case 0x99: + break; + case 0x9A: + break; + case 0x9B: + break; + case 0x9C: + break; + case 0x9D: + break; + case 0x9E: + break; + case 0x9F: break; - - case 0x02: - if(rocket.phase == SAFETY) { - rocket.phase = WAIT; - } + case 0xA0: + break; + case 0xA1: + break; + case 0xA2: + break; + case 0xA3: + break; + case 0xA4: + break; + case 0xA5: + break; + case 0xA6: + break; + case 0xA7: + break; + case 0xA8: + break; + case 0xA9: + break; + case 0xAA: + break; + case 0xAB: + break; + case 0xAC: + break; + case 0xAD: + break; + case 0xAE: + break; + case 0xAF: break; - - case 0x03: - if(rocket.phase == WAIT) { - rocket.phase = FLIGHT; - } + case 0xB0: + if(phase == READY) phase = SAFETY; + break; + case 0xB1: + if(phase == SAFETY) phase = READY; + break; + case 0xB2: + if(phase == READY) phase = FLIGHT; + break; + case 0xB3: + if(phase == FLIGHT) phase = SEP; + break; + case 0xB4: + if(phase >= FLIGHT & phase <= SEP) phase = EMERGENCY; + break; + case 0xB5: + if(phase == SEP) phase = RECOVERY; + break; + case 0xB6: + break; + case 0xB7: + break; + case 0xB8: + break; + case 0xB9: + break; + case 0xBA: + break; + case 0xBB: + break; + case 0xBC: + break; + case 0xBD: + break; + case 0xBE: break; - - case 0x04: - if(rocket.phase == FLIGHT) { - rocket.phase = SEP1; - } + case 0xBF: + break; + case 0xC0: + break; + case 0xC1: + break; + case 0xC2: + break; + case 0xC3: + break; + case 0xC4: + break; + case 0xC5: + break; + case 0xC6: + break; + case 0xC7: + break; + case 0xC8: + break; + case 0xC9: + break; + case 0xCA: + break; + case 0xCB: + break; + case 0xCC: + break; + case 0xCD: + break; + case 0xCE: + break; + case 0xCF: + break; + case 0xD0: + break; + case 0xD1: + break; + case 0xD2: + break; + case 0xD3: + break; + case 0xD4: + break; + case 0xD5: + break; + case 0xD6: + break; + case 0xD7: + break; + case 0xD8: + break; + case 0xD9: + break; + case 0xDA: + break; + case 0xDB: + break; + case 0xDC: + break; + case 0xDD: + break; + case 0xDE: + break; + case 0xDF: + break; + case 0xE0: break; - - case 0x05: - if(rocket.phase == SEP1) { - rocket.phase = SEP2; - } + case 0xE1: + adxl.begin(); + break; + case 0xE2: + break; + case 0xE3: + break; + case 0xE4: + break; + case 0xE5: + ina_ex.begin(); + break; + case 0xE6: + break; + case 0xE7: + break; + case 0xE8: + break; + case 0xE9: + ina_in.begin(); + break; + case 0xEA: + break; + case 0xEB: + break; + case 0xEC: + lps.begin(); + break; + case 0xED: + mpu.begin(); + break; + case 0xEE: break; - - case 0x06: - if(rocket.phase == SEP2) { - rocket.phase = RECOVERY; - } + case 0xEF: + break; + case 0xF0: + break; + case 0xF1: + break; + case 0xF2: + break; + case 0xF3: + break; + case 0xF4: + break; + case 0xF5: + break; + case 0xF6: break; - - default: + case 0xF7: + break; + case 0xF8: + break; + case 0xF9: + break; + case 0xFA: + break; + case 0xFB: + break; + case 0xFC: + break; + case 0xFD: + break; + case 0xFE: + break; + case 0xFF: + NVIC_SystemReset(); break; } } void downlink() { - //es.send(avio.byte, 128); + mission_time_bits = (short)(mission_time / TIME_LSB); + flight_time_bits = (short)(flight_time / TIME_LSB); + flags |= f_sd << 7; + flags |= f_gps << 6; + flags |= f_adxl << 5; + flags |= f_ina_in << 4; + flags |= f_ina_ex << 3; + flags |= f_lps << 2; + flags |= f_mpu << 1; + flags |= f_mpu_ak; + lat_bits = (short)(lat / LAT_LSB); + lon_bits = (short)(lon / LON_LSB); + alt_bits = (short)(alt / ALT_LSB); + for(int i = 0; i < 3; i++) { + high_accel_bits[i] = (short)(high_accel[i] / HIGH_ACCEL_LSB); + } + voltage_in_bits = (short)(voltage_in / VOLTAGE_LSB); + current_in_bits = (short)(current_in / CURRENT_LSB); + voltage_ex_bits = (short)(voltage_ex / VOLTAGE_LSB); + current_ex_bits = (short)(current_ex / CURRENT_LSB); + press_bits = (short)(press / PRESS_LSB); + temp_bits = (short)(temp / TEMP_LSB); + for(int i = 0; i < 3; i++) { + accel_bits[i] = (short)(accel[i] / ACCEL_LSB); + } + for(int i = 0; i < 3; i++) { + gyro_bits[i] = (short)(gyro[i] / GYRO_LSB); + } + for(int i = 0; i < 3; i++) { + mag_bits[i] = (short)(mag[i] / MAG_LSB); + } + + char data[50]; + data[0] = DOWNLINK_HEADER; + data[1] = mission_timer_reset; + data[2] = ((char*)&mission_time_bits)[0]; + data[3] = ((char*)&mission_time_bits)[1]; + data[4] = ((char*)&flight_time_bits)[0]; + data[5] = ((char*)&flight_time_bits)[1]; + data[6] = flags; + data[7] = phase; + data[8] = ((char*)&lat_bits)[0]; + data[9] = ((char*)&lat_bits)[1]; + data[10] = ((char*)&lon_bits)[0]; + data[11] = ((char*)&lon_bits)[1]; + data[12] = ((char*)&alt_bits)[0]; + data[13] = ((char*)&alt_bits)[1]; + data[14] = ((char*)&high_accel_bits[0])[0]; + data[15] = ((char*)&high_accel_bits[0])[1]; + data[16] = ((char*)&high_accel_bits[1])[0]; + data[17] = ((char*)&high_accel_bits[1])[1]; + data[18] = ((char*)&high_accel_bits[2])[0]; + data[19] = ((char*)&high_accel_bits[2])[1]; + data[20] = ((char*)&voltage_in_bits)[0]; + data[21] = ((char*)&voltage_in_bits)[1]; + data[22] = ((char*)¤t_in_bits)[0]; + data[23] = ((char*)¤t_in_bits)[1]; + data[24] = ((char*)&voltage_ex_bits)[0]; + data[25] = ((char*)&voltage_ex_bits)[1]; + data[26] = ((char*)¤t_ex_bits)[0]; + data[27] = ((char*)¤t_ex_bits)[1]; + data[28] = ((char*)&press_bits)[0]; + data[29] = ((char*)&press_bits)[1]; + data[30] = ((char*)&temp_bits)[0]; + data[31] = ((char*)&temp_bits)[1]; + data[32] = ((char*)&accel_bits[0])[0]; + data[33] = ((char*)&accel_bits[0])[1]; + data[34] = ((char*)&accel_bits[1])[0]; + data[35] = ((char*)&accel_bits[1])[1]; + data[36] = ((char*)&accel_bits[2])[0]; + data[37] = ((char*)&accel_bits[2])[1]; + data[38] = ((char*)&gyro_bits[0])[0]; + data[39] = ((char*)&gyro_bits[0])[1]; + data[40] = ((char*)&gyro_bits[1])[0]; + data[41] = ((char*)&gyro_bits[1])[1]; + data[42] = ((char*)&gyro_bits[2])[0]; + data[43] = ((char*)&gyro_bits[2])[1]; + data[44] = ((char*)&mag_bits[0])[0]; + data[45] = ((char*)&mag_bits[0])[1]; + data[46] = ((char*)&mag_bits[1])[0]; + data[47] = ((char*)&mag_bits[1])[1]; + data[48] = ((char*)&mag_bits[2])[0]; + data[49] = ((char*)&mag_bits[2])[1]; + + es.send(data, 50); +} + +void debug() +{ + pc.printf("{"); + pc.printf("\"mission_timer_reset\": %d,", mission_timer_reset); + pc.printf("\"mission_time\": %d,", mission_time); + pc.printf("\"flight_time\": %d,", flight_time); + pc.printf("\"phase\": %d,", phase); + pc.printf("\"f_sd\": %d,", f_sd); + pc.printf("\"f_gps\": %d,", f_gps); + pc.printf("\"f_adxl\": %d,", f_adxl); + pc.printf("\"f_ina_in\": %d,", f_ina_in); + pc.printf("\"f_ina_ex\": %d,", f_ina_ex); + pc.printf("\"f_lps\": %d,", f_lps); + pc.printf("\"f_mpu\": %d,", f_mpu); + pc.printf("\"f_mpu_ak\": %d,", f_mpu_ak); + pc.printf("\"lat\": %f,", lat); + pc.printf("\"lon\": %f,", lon); + pc.printf("\"sat\": %d,", sat); + pc.printf("\"fix\": %d,", fix); + pc.printf("\"hdop\": %f,", hdop); + pc.printf("\"alt\": %f,", alt); + pc.printf("\"geoid\": %f,", geoid); + pc.printf("\"high_accel_x\": %f,", high_accel[0]); + pc.printf("\"high_accel_y\": %f,", high_accel[1]); + pc.printf("\"high_accel_z\": %f,", high_accel[2]); + pc.printf("\"voltage_in\": %f,", voltage_in); + pc.printf("\"current_in\": %f,", current_in); + pc.printf("\"voltage_ex\": %f,", voltage_ex); + pc.printf("\"current_ex\": %f,", current_ex); + pc.printf("\"press\": %f,", press); + pc.printf("\"temp\": %f,", temp); + pc.printf("\"accel_x\": %f,", accel[0]); + pc.printf("\"accel_y\": %f,", accel[1]); + pc.printf("\"accel_z\": %f,", accel[2]); + pc.printf("\"gyro_x\": %f,", gyro[0]); + pc.printf("\"gyro_y\": %f,", gyro[1]); + pc.printf("\"gyro_z\": %f,", gyro[2]); + pc.printf("\"mag_x\": %f,", mag[0]); + pc.printf("\"mag_y\": %f,", mag[1]); + pc.printf("\"mag_z\": %f", mag[2]); + pc.printf("}\r\n"); } void log() { char data[128]; - memset(data, 0x00, 128); - memcpy(&data[0], &rocket.phase, 1); - memcpy(&data[1], (char*)&rocket.mission_timer_reset, 2); - memcpy(&data[3], (char*)&rocket.mission_time, 4); - memcpy(&data[7], (char*)&rocket.flight_timer_reset, 2); - memcpy(&data[9], (char*)&rocket.flight_time, 4); - memcpy(&data[13], (char*)&rocket.lat, 4); - memcpy(&data[17], (char*)&rocket.lon, 4); - memcpy(&data[21], (char*)&rocket.sat, 4); - memcpy(&data[25], (char*)&rocket.fix, 4); - memcpy(&data[29], (char*)&rocket.hdop, 4); - memcpy(&data[33], (char*)&rocket.alt, 4); - memcpy(&data[37], (char*)&rocket.geoid, 4); - memcpy(&data[41], (char*)&rocket.high_accel[0], 4); - memcpy(&data[45], (char*)&rocket.high_accel[1], 4); - memcpy(&data[49], (char*)&rocket.high_accel[2], 4); - memcpy(&data[53], (char*)&rocket.ina_in_v, 4); - memcpy(&data[57], (char*)&rocket.ina_in_i, 4); - memcpy(&data[61], (char*)&rocket.ina_ex_v, 4); - memcpy(&data[65], (char*)&rocket.ina_ex_i, 4); - memcpy(&data[69], (char*)&rocket.press, 4); - memcpy(&data[73], (char*)&rocket.temp, 4); - memcpy(&data[77], (char*)&rocket.accel[0], 4); - memcpy(&data[81], (char*)&rocket.accel[1], 4); - memcpy(&data[85], (char*)&rocket.accel[2], 4); - memcpy(&data[89], (char*)&rocket.gyro[0], 4); - memcpy(&data[93], (char*)&rocket.gyro[1], 4); - memcpy(&data[97], (char*)&rocket.gyro[2], 4); - memcpy(&data[101], (char*)&rocket.mag[0], 4); - memcpy(&data[105], (char*)&rocket.mag[1], 4); - memcpy(&data[109], (char*)&rocket.mag[2], 4); + data[0] = LOG_HEADER; + data[1] = ((char*)&mission_timer_reset)[0]; + data[2] = ((char*)&mission_time)[0]; + data[3] = ((char*)&mission_time)[1]; + data[4] = ((char*)&mission_time)[2]; + data[5] = ((char*)&mission_time)[3]; + data[6] = ((char*)&flight_time)[0]; + data[7] = ((char*)&flight_time)[1]; + data[8] = ((char*)&flight_time)[2]; + data[9] = ((char*)&flight_time)[3]; + data[10] = ((char*)&f_sd)[0]; + data[11] = ((char*)&f_gps)[0]; + data[12] = ((char*)&f_adxl)[0]; + data[13] = ((char*)&f_ina_in)[0]; + data[14] = ((char*)&f_ina_ex)[0]; + data[15] = ((char*)&f_lps)[0]; + data[16] = ((char*)&f_mpu)[0]; + data[17] = ((char*)&f_mpu_ak)[0]; + data[18] = ((char*)&phase)[0]; + data[19] = ((char*)&lat)[0]; + data[20] = ((char*)&lat)[1]; + data[21] = ((char*)&lat)[2]; + data[22] = ((char*)&lat)[3]; + data[23] = ((char*)&lon)[0]; + data[24] = ((char*)&lon)[1]; + data[25] = ((char*)&lon)[2]; + data[26] = ((char*)&lon)[3]; + data[27] = ((char*)&sat)[0]; + data[28] = ((char*)&sat)[1]; + data[29] = ((char*)&sat)[2]; + data[30] = ((char*)&sat)[3]; + data[31] = ((char*)&fix)[0]; + data[32] = ((char*)&fix)[1]; + data[33] = ((char*)&fix)[2]; + data[34] = ((char*)&fix)[3]; + data[35] = ((char*)&hdop)[0]; + data[36] = ((char*)&hdop)[1]; + data[37] = ((char*)&hdop)[2]; + data[38] = ((char*)&hdop)[3]; + data[39] = ((char*)&alt)[0]; + data[40] = ((char*)&alt)[1]; + data[41] = ((char*)&alt)[2]; + data[42] = ((char*)&alt)[3]; + data[43] = ((char*)&geoid)[0]; + data[44] = ((char*)&geoid)[1]; + data[45] = ((char*)&geoid)[2]; + data[46] = ((char*)&geoid)[3]; + data[47] = ((char*)&high_accel[0])[0]; + data[48] = ((char*)&high_accel[0])[1]; + data[49] = ((char*)&high_accel[0])[2]; + data[50] = ((char*)&high_accel[0])[3]; + data[51] = ((char*)&high_accel[1])[0]; + data[52] = ((char*)&high_accel[1])[1]; + data[53] = ((char*)&high_accel[1])[2]; + data[54] = ((char*)&high_accel[1])[3]; + data[55] = ((char*)&high_accel[2])[0]; + data[56] = ((char*)&high_accel[2])[1]; + data[57] = ((char*)&high_accel[2])[2]; + data[58] = ((char*)&high_accel[2])[3]; + data[59] = ((char*)&voltage_in)[0]; + data[60] = ((char*)&voltage_in)[1]; + data[61] = ((char*)&voltage_in)[2]; + data[62] = ((char*)&voltage_in)[3]; + data[63] = ((char*)¤t_in)[0]; + data[64] = ((char*)¤t_in)[1]; + data[65] = ((char*)¤t_in)[2]; + data[66] = ((char*)¤t_in)[3]; + data[67] = ((char*)&voltage_ex)[0]; + data[68] = ((char*)&voltage_ex)[1]; + data[69] = ((char*)&voltage_ex)[2]; + data[70] = ((char*)&voltage_ex)[3]; + data[71] = ((char*)¤t_ex)[0]; + data[72] = ((char*)¤t_ex)[1]; + data[73] = ((char*)¤t_ex)[2]; + data[74] = ((char*)¤t_ex)[3]; + data[75] = ((char*)&press)[0]; + data[76] = ((char*)&press)[1]; + data[77] = ((char*)&press)[2]; + data[78] = ((char*)&press)[3]; + data[79] = ((char*)&temp)[0]; + data[80] = ((char*)&temp)[1]; + data[81] = ((char*)&temp)[2]; + data[82] = ((char*)&temp)[3]; + data[83] = ((char*)&accel[0])[0]; + data[84] = ((char*)&accel[0])[1]; + data[85] = ((char*)&accel[0])[2]; + data[86] = ((char*)&accel[0])[3]; + data[87] = ((char*)&accel[1])[0]; + data[88] = ((char*)&accel[1])[1]; + data[89] = ((char*)&accel[1])[2]; + data[90] = ((char*)&accel[1])[3]; + data[91] = ((char*)&accel[2])[0]; + data[92] = ((char*)&accel[2])[1]; + data[93] = ((char*)&accel[2])[2]; + data[94] = ((char*)&accel[2])[3]; + data[95] = ((char*)&gyro[0])[0]; + data[96] = ((char*)&gyro[0])[1]; + data[97] = ((char*)&gyro[0])[2]; + data[98] = ((char*)&gyro[0])[3]; + data[99] = ((char*)&gyro[1])[0]; + data[100] = ((char*)&gyro[1])[1]; + data[101] = ((char*)&gyro[1])[2]; + data[102] = ((char*)&gyro[1])[3]; + data[103] = ((char*)&gyro[2])[0]; + data[104] = ((char*)&gyro[2])[1]; + data[105] = ((char*)&gyro[2])[2]; + data[106] = ((char*)&gyro[2])[3]; + data[107] = ((char*)&mag[0])[0]; + data[108] = ((char*)&mag[0])[1]; + data[109] = ((char*)&mag[0])[2]; + data[110] = ((char*)&mag[0])[3]; + data[111] = ((char*)&mag[1])[0]; + data[112] = ((char*)&mag[1])[1]; + data[113] = ((char*)&mag[1])[2]; + data[114] = ((char*)&mag[1])[3]; + data[115] = ((char*)&mag[2])[0]; + data[116] = ((char*)&mag[2])[1]; + data[117] = ((char*)&mag[2])[2]; + data[118] = ((char*)&mag[2])[3]; + data[119] = 0x00; + data[120] = 0x00; + data[121] = 0x00; + data[122] = 0x00; + data[123] = 0x00; + data[124] = 0x00; + data[125] = 0x00; + data[126] = 0x00; + data[127] = 0x00; + + eeprom.write(addr, data, 128); + addr += 0x80; - eeprom.write(addr, data, 128); - char test[] = {'A', 'V', 'I', 'O', '\r', '\n'}; - es.send(test, 7); - addr += 0x80; - /*for(int i = 0; i < 128 ; i++) { - pc.printf("%x ", data[i]); - }*/ - /*for(int i = 0; i < 128 ; i++) { - fprintf(fp, "%02x ", (int)data[i]); - }*/ - - fprintf(fp, "%d,%d,%d,", rocket.mission_time, rocket.flight_time, rocket.phase); - fprintf(fp, "%d,%d,%d,%d,%d,%d,%d,", rocket.f_sd, rocket.f_adxl, rocket.f_ina_in, rocket.f_ina_ex, rocket.f_lps, rocket.f_mpu, rocket.f_mpu_ak); - fprintf(fp, "%d,", flight_pin.read()); - fprintf(fp, "%d,%d,%.1f,%.6f,%.6f,%d,%d,%.2f,%.1f,%.1f,", rocket.hour, rocket.min, rocket.sec, rocket.lat, rocket.lon, rocket.sat, rocket.fix, rocket.hdop, rocket.alt, rocket.geoid); - fprintf(fp, "%.2f,%.2f,%.2f,", rocket.high_accel[0], rocket.high_accel[1], rocket.high_accel[2]); - fprintf(fp, "%.1f,%.1f,", rocket.press, rocket.temp); - fprintf(fp, "%.2f,%.2f,%.2f,%.2f,", rocket.ina_in_v, rocket.ina_in_i, rocket.ina_ex_v, rocket.ina_ex_i); - fprintf(fp, "%.1f,%.1f,%.1f,", rocket.accel[0], rocket.accel[1], rocket.accel[2]); - fprintf(fp, "%.1f,%.1f,%.1f,", rocket.gyro[0], rocket.gyro[1], rocket.gyro[2]); - fprintf(fp, "%.1f,%.1f,%.1f,", rocket.mag[0], rocket.mag[1], rocket.mag[2]); - fprintf(fp, "\r\n"); + if(sd) { + fprintf(sd, "%d,", mission_timer_reset); + fprintf(sd, "%d,", mission_time); + fprintf(sd, "%d,", flight_time); + fprintf(sd, "%d,", phase); + fprintf(sd, "%d,", f_sd); + fprintf(sd, "%d,", f_gps); + fprintf(sd, "%d,", f_adxl); + fprintf(sd, "%d,", f_ina_in); + fprintf(sd, "%d,", f_ina_ex); + fprintf(sd, "%d,", f_lps); + fprintf(sd, "%d,", f_mpu); + fprintf(sd, "%d,", f_mpu_ak); + fprintf(sd, "%f,", lat); + fprintf(sd, "%f,", lon); + fprintf(sd, "%d,", sat); + fprintf(sd, "%d,", fix); + fprintf(sd, "%f,", hdop); + fprintf(sd, "%f,", alt); + fprintf(sd, "%f,", geoid); + fprintf(sd, "%f,", high_accel[0]); + fprintf(sd, "%f,", high_accel[1]); + fprintf(sd, "%f,", high_accel[2]); + fprintf(sd, "%f,", voltage_in); + fprintf(sd, "%f,", current_in); + fprintf(sd, "%f,", voltage_ex); + fprintf(sd, "%f,", current_ex); + fprintf(sd, "%f,", press); + fprintf(sd, "%f,", temp); + fprintf(sd, "%f,", accel[0]); + fprintf(sd, "%f,", accel[1]); + fprintf(sd, "%f,", accel[2]); + fprintf(sd, "%f,", gyro[0]); + fprintf(sd, "%f,", gyro[1]); + fprintf(sd, "%f,", gyro[2]); + fprintf(sd, "%f,", mag[0]); + fprintf(sd, "%f,", mag[1]); + fprintf(sd, "%f,", mag[2]); + fprintf(sd, "\r\n"); + } if(sd_timer.read_ms() >= 30 * 1000) { sd_timer.reset(); sd_timer.start(); - if(fp) { - fclose(fp); - fp = fopen("/sd/IZU2020_AVIONICS.txt", "a"); + if(sd) { + fclose(sd); + sd = fopen(file_name, "a"); } } - //fwrite(data, sizeof(char), 128, fp); - -#if DEBUG - pc.printf("mission time: %d[sec]\r\n", rocket.mission_time); - pc.printf("flight time: %d[sec]\r\n", rocket.flight_time); - pc.printf("phase: %d\r\n", rocket.phase); - pc.printf("sd: %d\t\tadxl: %d\t\tina_in: %d\t\tina_ex: %d\r\n", rocket.f_sd, rocket.f_adxl, rocket.f_ina_in, rocket.f_ina_ex); - pc.printf("lps: %d\t\tmpu: %d\t\tmpu_ak: %d\r\n", rocket.f_lps, rocket.f_mpu, rocket.f_mpu_ak); - pc.printf("flight pin: %d\r\n\n", flight_pin.read()); - pc.printf("gps\tutc: %d:%d:%.1f\r\n", rocket.hour, rocket.min, rocket.sec); - pc.printf("\tlat:%.6f, lon:%.6f\r\n", rocket.lat, rocket.lon); - pc.printf("\tsat:%d, fix:%d\r\n", rocket.sat, rocket.fix); - pc.printf("\thdop:%.2f, alt:%.1f, geoid:%.1f\r\n\n", rocket.hdop, rocket.alt, rocket.geoid); - pc.printf("high_accel\tx:\t%.2f[G]\ty:\t%.2f[G]\tz:\t%.2f[G]\r\n\n", rocket.high_accel[0], rocket.high_accel[1], rocket.high_accel[2]); - pc.printf("press:\t%.1f[hPa]\ttemp:\t%.1f[C]\r\n\n", rocket.press, rocket.temp); - pc.printf("internal:\t%.2f[mV]\t%.2f[mA]\r\n", rocket.ina_in_v, rocket.ina_in_i); - pc.printf("external:\t%.2f[mV]\t%.2f[mA]\r\n\n", rocket.ina_ex_v, rocket.ina_ex_i); - pc.printf("accel\tx:\t%.1f[G]\t\ty:\t%.1f[G]\t\tz:\t%.1f[G]\r\n", rocket.accel[0], rocket.accel[1], rocket.accel[2]); - pc.printf("gyro\tx:\t%.1f[rad/s]\ty:\t%.1f[rad/s]\tz:\t%.1f[rad/s]\r\n", rocket.gyro[0], rocket.gyro[1], rocket.gyro[2]); - pc.printf("mag\tx:\t%.1f[H]\t\ty:\t%.1f[H]\t\tz:\t%.1f[H]\r\n\n", rocket.mag[0], rocket.mag[1], rocket.mag[2]); -#endif - } \ No newline at end of file