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

Dependencies:   mbed BufferedSerial

Revision:
2:2c73772e8a8b
Parent:
1:b12e35a43ee1
Child:
4:b0611c3abb7f
--- a/main.cpp	Mon Aug 16 12:08:41 2021 +0000
+++ b/main.cpp	Sun Feb 13 07:22:59 2022 +0000
@@ -4,45 +4,70 @@
 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);
-DigitalOut cameraPow(PF_0);
-DigitalOut cameraRec(PF_1);
-DigitalOut nichrome(PA_8);
-DigitalOut buzzer(PA_11);
+//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];   
-int i=0;
+char comm[25];
+//int i=0;
+int flag; //flag:現在の状態
+//0:開始時、1:スリープ解除あるいはスリープに入った、2:撮影開始、(3:撮影終了、使わない)9:リセット
+
 
 int main()
 {
     //ここに電源投入のプロトコル
-    int flag=0;
-    while(flightPin==1){
-        if(flag==0){
-            while(1){
-                if(getCommand()==1){
-                    flag=1;//flagに1を代入することで先に進む
-                    cameraPow=1;
-                    cameraRec=1;//カメラスタートという指示しかないけど、電源と録画開始は同じ時間でいいのか?
-                    break;
-                }
-            }
-        }
-        
-        else if(flag==1){
-            while(1) {
-                if(getCommand()==1){
-                    flag=0;//flagに0を代入することで最初に戻る
-                    break;
-                }
-            }
-        }
+    
+    /******以下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の情報取得して送信
 }
@@ -58,37 +83,62 @@
 
 void buzzerON(){
     printf("ブザー作動\n\r");
-    buzzer=1;
-    //ここからモード変換だけど、わかりにくかったら他の関数に入れてもいいかも
-    mcu_1=1;
-    wait(0.1);//電流何秒流す?
-    mcu_1=0;
+    L432.putc('c');  //センサー停止指示コマンド
+    buzzer=1;  
+    cameraRec=1;//撮影終了指示
+    wait(0.2);//この待機時間は要らないのかもしれない
+    cameraRec=0;
 }
 
 int getCommand(){
     char temp;
-    if(im920.readable()) { //IM920からのデータがある場合
-        temp = im920.getc();//一文字読み込む
-        if(temp != '\r') { //読み込み文字が改行で無い場合
-            str[i] = temp;
-            i++;
-        } else if(temp == '\r') { //読み込み文字が改行の場合//\nではなく\rを使うのに理由はある?
-            if(str[i-2] == 's'&& str[i-1] == 't') { //startの"st"
-                  mcu_1=1;
-                  wait(0.1);    //電流流すの何秒間にしましょう?
-                  mcu_1=0;
-                  return 1;
-            }
-        }
-        else if(temp == '\r') { //読み込み文字が改行の場合//\nではなく\rを使うのに理由はある?
-                if(str[i-2] == 'r' && str[i-1] == 'e') {
-                      mcu_1=1;
-                      mcu_2=1;
-                      wait(0.1);    //電流流すの何秒間にしましょう?
-                      mcu_1=0;
-                      mcu_2=0;
-                      return 1;
+    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;
                 }
             }
-        }    
-}
\ No newline at end of file
+}
+
+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);//ニクロムを作動させるまでの時間
+    }
+}   
\ No newline at end of file