f303k8(メイン)用のプログラム。 ver1

Dependencies:   mbed BufferedSerial

main.cpp

Committer:
MatsumotoKouki
Date:
2022-02-13
Revision:
2:2c73772e8a8b
Parent:
1:b12e35a43ee1
Child:
4:b0611c3abb7f

File content as of revision 2:2c73772e8a8b:

#include "mbed.h"

//コマンド取得とモード変換は関数にいれたほうがわかりやすい
void nichrome_ON();
void buzzerON();
int getCommand();
void sendStatus();
void FlightPinDriver();

Serial pc(USBTX, USBRX,38400);//ボーレートを落とすと,USB側からのデータが正確に出力されない.//pcと直接通信してないのに定義する必要ある?
Serial im920(PA_9,PA_10,19200);//TX(IM920_RX), RX(IM920_TX)
//DigitalOut mcu_1(PA_7);
//DigitalOut mcu_2(PA_6);
Serial L432(PA_2,PA_3,38400);
DigitalOut cameraPow(PA_11);
DigitalOut cameraRec(PA_8);
DigitalOut nichrome(PF_0);
DigitalOut buzzer(PF_1);
DigitalIn flightPin(PA_12);
Timeout t;
Ticker sta;
Ticker warikomi;
char str[100];   
char comm[25];
//int i=0;
int flag; //flag:現在の状態
//0:開始時、1:スリープ解除あるいはスリープに入った、2:撮影開始、(3:撮影終了、使わない)9:リセット


int main()
{
    //ここに電源投入のプロトコル
    
    /******以下3行は開始時のカメラの状態がわからないため、開始と同時に強制スリープにする。他にいい方法ねーかな******/
    wait(5);
    
    cameraPow = 1;   //カメラの電源スイッチON
    wait(3);
    cameraPow = 0;
    sta.attach(sendStatus,5);
    warikomi.attach(FlightPinDriver,0.5);
    
    //while(flightPin!=1){    //フライトピンが作動していない場合
    flag=0;
    while(1){    //フライトピンが作動していない場合
        /*if(flightPin==0){
               break;
        }*/
        flag=getCommand();  
        switch(flag){
            case 0:
                break;
            case 1:
                printf("Camera is awake\r\n");
                break;
            case 2:
                printf("Video start\r\n");
                break;
            case 9:
                flag=0;
                printf("Stop command!\r\n");
                /******以下3行は開始時のカメラの状態がわからないため、開始と同時に強制スリープにする。他にいい方法ねーかな*****/
                cameraPow = 1;   //カメラの電源スイッチON
                wait(3);
                cameraPow = 0;                  
                break;         
            }       
    }
    L432.printf("TXDA p\r\n");  //センサー側にフライトピン作動を知らせる
    printf("flight pin worked");
    t.attach(nichrome_ON,3);//ニクロムを作動させるまでの時間
    //ここからGPSの情報取得して送信
}

void nichrome_ON(){
    printf("テグスカット!\n\r");
    nichrome=1;
    wait(2.0);//テグスを切るまでにかかる時間
    nichrome=0;
    t.detach();
    t.attach(buzzerON,6);//ブザー作動までの時間
}

void buzzerON(){
    printf("ブザー作動\n\r");
    L432.putc('c');  //センサー停止指示コマンド
    buzzer=1;  
    cameraRec=1;//撮影終了指示
    wait(0.2);//この待機時間は要らないのかもしれない
    cameraRec=0;
}

int getCommand(){
    char temp;
    int i=0;
    while(temp != '\n') { //読み込み文字が改行で無い場合(順番では\r\n)
        if(im920.readable()) { //IM920からのデータがある場合
                char temp = im920.getc();//一文字読み込む
                pc.printf("%c",temp);
                str[i++] = temp;
            } //else if(temp == '\n') { //読み込み文字が改行の場合
                //printf("get Command\r\n");
                if(str[i-2]=='1'&&str[i-1]=='1'){  //スリープに入るor抜け出す際にはコマンド"11"
                    printf("get 11 !!\r\n");
                    cameraPow = 1;             //カメラの電源スイッチON
                    wait(3);
                    cameraPow = 0;
                    //wait(10);                //カメラの電源ON
                    return 1;
                }
                else if(str[i-2]=='2'&&str[i-1]=='2'){ //撮影開始の際にはコマンド"22"
                    cameraRec = 1;             //撮影スイッチON(撮影開始指示)
                    wait(0.2);               //撮影開始
                    cameraRec=0;
                    printf("get 22\r\n");
                    return 2;
                }
                else if(str[i-2]=='3'&&str[i-1]=='3'){ //撮影終了の際にはコマンド"33"
                    printf("get 33\r\n");
                    L432.putc('s'); //L432にセンサ動作開始のコマンド送信
                    cameraRec=1;               //撮影スイッチON(撮影終了指示)
                    wait(0.2);               //撮影終了
                    cameraRec=0;
                    return 3;
                }
                else if(str[i-2]=='9'&&str[i-1]=='9'){ //異常が起きた時に中断するよう
                    return 9;
                }
            }
}

void sendStatus(){
    im920.printf("TXDA ");
    im920.putc(flag);
    im920.printf("\r\n");
} 

void FlightPinDriver(){
    if(flightPin==1){
            printf("Flight Pin Worked!!\n\r");
            warikomi.detach();
            t.attach(nichrome_ON,8);//ニクロムを作動させるまでの時間
    }
}