PQ-013 Felix-Luminousの地上局プログラム ES920LR使用

Dependencies:   ES920LR mbed

main.cpp

Committer:
Sigma884
Date:
2018-11-14
Revision:
0:d99384e36f64

File content as of revision 0:d99384e36f64:

#include "mbed.h"
#include "ES920LR.hpp"

/*******************************************************************************
コンストラクタ
*******************************************************************************/
RawSerial pc(USBTX, USBRX, 115200);
RawSerial serial_es920(D1, D0);

ES920LR es920(serial_es920, pc, 115200);

/*******************************************************************************
関数のプロトタイプ宣言
*******************************************************************************/
void readPC();
void printHelp();

void sendUpLink(char command);
void readHeaderSensorSetup();
void readHeaderGPSSetup();
void readHeaderData();
void readHeaderStart();

/*******************************************************************************
変数の宣言
*******************************************************************************/
int time_read, time_reset, time_min, time_sec;
int flight_time_read, flight_time_reset, flight_time_min, flight_time_sec;

char rocket_phase;

bool ex_power;
bool separate1, separate2;
bool ok_up, ok_down, ok_top;
bool save;
bool flight_pin;

float gps_lat, gps_lon, gps_alt, gps_knot, gps_deg;
int gps_sat;

float ina_in_v, ina_in_i, ina_ex_v, ina_ex_i;

float pres33, alt33, speed33;

float temp35, hum35;

float pitot_speed;

int gps_wait_count;


/*******************************************************************************
定数
*******************************************************************************/
const float ES920_MAX_20 = 0.000305176;
const float ES920_MAX_100 = 0.001525879;
const float ES920_MAX_200 = 0.003051758;
const float ES920_MAX_500 = 0.007629395;
const float ES920_MAX_1500 = 0.022888184;
const float ES920_MAX_3000 = 0.045776367;


/*******************************************************************************
無線のヘッダまとめ(ROCKET -> GND)
*******************************************************************************/
const char HEADER_SENSOR_SETUP = 0x01;
// 0x01, ADXL, INA_in, INA_ex, MPU, MPU_m, 22HB, 33HW, SHT, TSL, SD
//   0     1      1       1     1     1      1     1    1    1    1
//         0      1       2     3     4      5     6    7    8    9

const char HEADER_GPS_SETUP = 0x02;
// 0x02, readable, wait_count
//   0      1          4
//          0          1
//        0x00 : NG
//        0x01 : OK
//        0xAA : Finish
//        0xFF : Ignore

const char HEADER_DATA = 0x10;
//起動時間, フライト時間, フェーズ, ex_pow&Sep1&Sep2&ok_up&ok_down&ok_top&gps_yn&save&flight_pin, lat, lon, alt, knot, deg, sat, in_v, in_i, ex_v, ex_i, pres33, alt33, speed33, temp35, hum35, pitot_speed 
//4(2,2)   4(2,2)      1         1                                                            2     2    2    2    2    2    2     2     2     2      2       2      2        2       2      2 
//0 2      4 6         8         9                                                            10    12   14   16   18   20   22    24    26    28     30      32     34       36      38     40 
//                                  0x01 : ex_pow
//                                  0x02 : Sep1
//                                  0x04 : Sep2
//                                  0x08 : ok_up
//                                  0x10 : ok_down
//                                  0x20 : ok_top
//                                  0x40 : save
//                                  0x80 : gps_yn

const char HEADER_START = 0x11;
// 0x11, What
//   0     1
//         0
//      'W' : 安全モード->離床検知モード
//      'S' : 離床検知モード->安全モード
//      'F' : 離床検知モード->フライトモード
//      '1' : 1段目分離
//      '2' : 2段目分離


/*******************************************************************************
無線のヘッダまとめ(GND -> ROCKET)
*******************************************************************************/
const char HEADER_COMMAND = 0xcd;
// 0xcd,コマンド
//   0     1
//   0     1


/*******************************************************************************
ロケットのフェーズ
*******************************************************************************/
const char ROCKET_SETUP = 0x00;     //セットアップ中
const char ROCKET_SAFETY = 0x01;    //安全モード
const char ROCKET_WAIT = 0x02;      //待機モード
const char ROCKET_FLIGHT = 0x03;    //フライトモード
const char ROCKET_SEP1 = 0x04;      //分離1モード
const char ROCKET_SEP2 = 0x05;      //分離2モード
const char ROCKET_RECOVERY = 0x06;  //回収モード


/*******************************************************************************
メイン関数
*******************************************************************************/
int main(){
    printHelp();
    
    pc.attach(&readPC, Serial::RxIrq);
    
    es920.attach(&readHeaderSensorSetup, HEADER_SENSOR_SETUP);
    es920.attach(&readHeaderGPSSetup, HEADER_GPS_SETUP);
    es920.attach(&readHeaderData, HEADER_DATA);
    es920.attach(&readHeaderStart, HEADER_START);
    
    while(1){
    }
}


/*******************************************************************************
PCからの読み取り
*******************************************************************************/
void readPC(){
    char ch = pc.getc();
    pc.printf("Input : %c\r\n", ch);
    switch(ch){
        case 'W':
        case 'S':
        case 'F':
        case '1':
        case '2':
        case 'C':
        case 'B':
        case 'O':
        sendUpLink(ch);
        break;
        
        case '?':
        printHelp();
        break;
    }
}


/*******************************************************************************
ヘルプを表示
*******************************************************************************/
void printHelp(){
    for(int i = 0; i < 20; i ++){
        pc.printf("*");
    }
    
    pc.printf("\r\nCommands\r\n");
    pc.printf("  W      : Safety -> Wait\r\n");
    pc.printf("  S      : Wait -> Safety\r\n");
    pc.printf("  F      : Wait -> Flight\r\n");
    pc.printf("  1(one) : 1st Separate 5[s]\r\n");
    pc.printf("  2(two) : 2nd Separate 5[s]\r\n");
    pc.printf("  C      : Stop Recording\r\n");
    pc.printf("  O      : Start Recording\r\n");
    pc.printf("  B      : Buzzer On/Off\r\n");
    pc.printf("  ?      : HELP\r\n");
    
    for(int i = 0; i < 20; i ++){
        pc.printf("*");
    }
    pc.printf("\r\n");
    wait(1.0f);
}


/*******************************************************************************
アップリンクを送信する
*******************************************************************************/
void sendUpLink(char command){
    es920 << HEADER_COMMAND;
    es920 << command;
    es920.send();
}


/*******************************************************************************
HEADER_SENSOR_SETUPを受信したら呼び出される
*******************************************************************************/
void readHeaderSensorSetup(){
    pc.printf("\r\n**************************************************\r\n");
    pc.printf("Sensor Setting Start!!\r\n");
    
    ///////////////////////////////////////////ADXL375
    if(es920.data[0] == 0x01){
        pc.printf("ADXL375 : OK\r\n");
    }
    else{
        pc.printf("ADXL375 : NG...\r\n");
    }
    
    ///////////////////////////////////////////INA226_in
    if(es920.data[1] == 0x01){
        pc.printf("INA226_in : OK!!\r\n");
    }
    else{
        pc.printf("INA226_in : NG...\r\n");
    }
    
    ///////////////////////////////////////////INA226_ex
    if(es920.data[2] == 0x01){
        pc.printf("INA226_ex OK!!\r\n");
    }
    else{
        pc.printf("INA226_ex NG...\r\n");
    }

    ///////////////////////////////////////////MPU9250
    if(es920.data[3] == 0x01){
        pc.printf("MPU9250 : OK!!\r\n");
    }
    else{
        pc.printf("MPU9250 : NG...\r\n");
    }
    if(es920.data[4] == 0x01){
        pc.printf("MPU9250 MAG : OK!!\r\n");
    }
    else{
        pc.printf("MPU9250 MAG : NG...\r\n");
    }
    
    ///////////////////////////////////////////LPS22HB
    if(es920.data[5] == 0x01){
        pc.printf("LPS22HB : OK!!\r\n");
    }
    else{
        pc.printf("LPS22HB : NG...\r\n");
    }
    
    ///////////////////////////////////////////LPS33HW
    if(es920.data[6] == 0x01){
        pc.printf("LPS33HW : OK!!\r\n");
    }
    else{
        pc.printf("LPS33HW : NG...\r\n");
    }
    
    ///////////////////////////////////////////SHT35
    if(es920.data[7] == 0x01){
        pc.printf("SHT35 : OK!!\r\n");
    }
    else{
        pc.printf("SHT35 : NG...\r\n");
    }
    
    ///////////////////////////////////////////TSL2561
    if(es920.data[8] == 0x01){
        pc.printf("TSL2561 : OK!!\r\n");
    }
    else{
        pc.printf("SL2561 : NG...\r\n");
    }
    
    ///////////////////////////////////////////SD
    if(es920.data[9] == 0x01){
        pc.printf("SD : OK!!\r\n");
    }
    else{
        pc.printf("SD : NG...\r\n");
    }
    
    pc.printf("Sensor Setting Finished!!\r\n");
    pc.printf("**************************************************\r\n");
}


/*******************************************************************************
HEADER_GPS_SETUPを受信したら呼び出される
*******************************************************************************/
void readHeaderGPSSetup(){
    switch(es920.data[0]){
        case 0x00:
        gps_wait_count = es920.toInt(1);
        pc.printf("GPS Wait : %d\r\n", gps_wait_count);
        break;
        
        case 0x01:
        pc.printf("GPS Wait Complete!!\r\n");
        break;
        
        case 0xAA:
        pc.printf("GPS Setting Finished!!\r\n");
        pc.printf("\r\n**************************************************\r\n");
        break;
        
        case 0xFF:
        pc.printf("GPS Setting Ignore...\r\n");
        pc.printf("\r\n**************************************************\r\n");
        break;
    }
}


/*******************************************************************************
HEADER_DATAを受信したら呼び出される
*******************************************************************************/
void readHeaderData(){
    int i = 0;                              //0
    time_reset = (int)es920.toShort(i);
    i += 2;                                 //2
    time_read = (int)es920.toShort(i);
    i += 2;                                 //4
    flight_time_reset = (int)es920.toShort(i);
    i += 2;                                 //6
    flight_time_read = (int)es920.toShort(i);
    i += 2;                                 //8
    
    rocket_phase = es920.data[i];
    i += 1;                                 //9
    
    char rocket_status = es920.data[i];
    i += 1;                                 //10
    ex_power = false;
    separate1 = false;
    separate2 = false;
    ok_up = false;
    ok_down = false;
    ok_top = false;
    save = false;
    flight_pin = false;
    if(rocket_status & 0x01)ex_power = true;
    if(rocket_status & 0x02)separate1 = true;
    if(rocket_status & 0x04)separate2 = true;
    if(rocket_status & 0x08)ok_up = true;
    if(rocket_status & 0x10)ok_down = true;
    if(rocket_status & 0x20)ok_top = true;
    if(rocket_status & 0x40)save = true;
    if(rocket_status & 0x80)flight_pin = true;
    
    gps_lat = (float)es920.toShort(i) * ES920_MAX_100;
    i += 2;                                         //12
    gps_lon = (float)es920.toShort(i) * ES920_MAX_500;
    i += 2;                                         //14
    gps_alt = (float)es920.toShort(i) * ES920_MAX_500;
    i += 2;                                         //16
    gps_knot = (float)es920.toShort(i) * ES920_MAX_200;
    i += 2;                                         //18
    gps_deg = (float)es920.toShort(i) * ES920_MAX_1500;
    i += 2;                                         //20
    gps_sat = (int)es920.toShort(i);
    i += 2;                                         //22
    ina_in_v = (float)es920.toShort(i) * ES920_MAX_20;
    i += 2;                                         //24
    ina_in_i = (float)es920.toShort(i) * ES920_MAX_20;
    i += 2;                                         //26
    ina_ex_v = (float)es920.toShort(i) * ES920_MAX_20;
    i += 2;                                         //28
    ina_ex_i = (float)es920.toShort(i) * ES920_MAX_20;
    i += 2;                                         //30
    pres33 = (float)es920.toShort(i) * ES920_MAX_3000;
    i += 2;                                         //32
    alt33 = (float)es920.toShort(i) * ES920_MAX_500;
    i += 2;                                         //34
    speed33 = (float)es920.toShort(i) * ES920_MAX_100;
    i += 2;                                         //36
    temp35 = (float)es920.toShort(i) * ES920_MAX_100;
    i += 2;                                         //38
    hum35 = (float)es920.toShort(i) * ES920_MAX_200;
    i += 2;                                         //40
    pitot_speed = (float)es920.toShort(i) * ES920_MAX_200;
    
    
    time_min = time_reset * 30 + (float)floor((double)time_read / 60);
    time_sec = time_read % 60;
    flight_time_min = flight_time_reset * 30 + floor((double)flight_time_read / 60);
    flight_time_sec = flight_time_read % 60;
    
    pc.printf("Time : %d:%02d\r\n", time_min, time_sec);
    pc.printf("FlightTime : %d:%02d\r\n", flight_time_min, flight_time_sec);
    
    pc.printf("Phase : ");
    switch(rocket_phase){
        case ROCKET_SETUP:
        pc.printf("SETUP\r\n");
        break;
        case ROCKET_SAFETY:
        pc.printf("SAFETY\r\n");
        break;
        case ROCKET_WAIT:
        pc.printf("WAIT\r\n");
        break;
        case ROCKET_FLIGHT:
        pc.printf("FLIGHT\r\n");
        break;
        case ROCKET_SEP1:
        pc.printf("SEPARATE 1\r\n");
        break;
        case ROCKET_SEP2:
        pc.printf("SEPARATE 2\r\n");
        break;
        case ROCKET_RECOVERY:
        pc.printf("RECOVERY\r\n");
        break;
    }
    
    pc.printf("Power : ");
    if(ex_power){
        pc.printf("External\r\n");
    }
    else{
        pc.printf("Battery\r\n");
    }
    
    pc.printf("Separate : %d, %d\r\n", separate1, separate2);
    pc.printf("UP DOWN TOP : %d, %d, %d\r\n", ok_up, ok_down, ok_top);
    pc.printf("SAVE : %d\r\n", save);
    pc.printf("Flight Pin : %d\r\n", flight_pin);
    
    pc.printf("GPS : %3.7f, %3.7f, %.2f\r\n", gps_lat, gps_lon, gps_alt);
    pc.printf("Move : %.2f[knot], %.2f[deg]\r\n", gps_knot, gps_deg);
    pc.printf("Sats : %d\r\n", gps_sat);
    
    pc.printf("INA_in : %.2f[V], %.2f[A]\r\n", ina_in_v, ina_in_i);
    pc.printf("INA_ex : %.2f[V], %.2f[A]\r\n", ina_ex_v, ina_ex_i);
    
    pc.printf("LPS33HW : %.4f[hPa], %.2f[m], %.2f[m/s]\r\n", pres33, alt33, speed33);
    pc.printf("SHT35 : %.2f[degC], %.2f[%%]\r\n", temp35, hum35);
    pc.printf("Pitot : %.2f[m/s]\r\n", pitot_speed);
    
    pc.printf("\n\n\n");
}


/*******************************************************************************
HEADER_STARTを受信したら呼び出される
*******************************************************************************/
void readHeaderStart(){
    char what = es920.data[0];
    switch(what){
        case 'W':
        pc.printf("Phase Change : WAIT\r\n");
        break;
        
        case 'S':
        pc.printf("Phase Change : SAFETY\r\n");
        break;
        
        case 'F':
        pc.printf("Phase Change : FLIGHT\r\n");
        break;
        
        case '1':
        pc.printf("Separate1 Start\r\n");
        break;
        
        case '2':
        pc.printf("Separate2 Start\r\n");
        break;
        
        case 'C':
        pc.printf("File Closed\r\n");
        break;
        
        case 'B':
        pc.printf("Buzzer Change\r\n");
        break;
        
        default:
        pc.printf("????? Start\r\n");
        break;
    }
}