Communication Class and Controller Class (ControllerForMbed Class)

Dependencies:   SoftPWM

Revision:
2:fd0c21600586
Parent:
1:6633661058ec
--- a/main.cpp	Thu Dec 23 05:52:48 2021 +0000
+++ b/main.cpp	Thu Dec 23 08:56:26 2021 +0000
@@ -3,13 +3,15 @@
 //contoller(conrollerForMbed)クラス内のタイムアウト機能を使わないようにしている
 
 #include "mbed.h"
-#include "platform/mbed_thread.h"
+#include "SoftPWM.h" //ソフトフェアでPWM出力を行うクラス
+#include "Button.h"
 #include "Controller.h"// DS4のみ通信が確認できているバージョンで,プロジェクトに公開しているクラス
 #include "ControllerForMbed.h"//宇井コンとの通信をmbedで行えるように変更を加えたクラスでプロジェクトに公開していない.
 #include "CommunicationMonitoring.h" //複数のデバイスの通信状況を確認するクラス(通信監視クラス)
 #include "define.h" //コントローラクラスにのみ対応
  
 #define INT_TIME 0.001
+#define CONTROL_PERIOD INT_TIME*10.0
 #define INT_TIME_MS INT_TIME*1000
  
 Serial pc(USBTX, USBRX);
@@ -22,17 +24,41 @@
 
 CommunicationMonitoring commMonitor;
 int contoller_num; //通信監視クラス内でのコントローラのデバイス番号
- 
+
+/*ハードウェアのPWMは非対応*/
+SoftPWM led_red(LED_RED);
+SoftPWM led_green(LED_GREEN);
+SoftPWM led_blue(LED_BLUE);
+
 DigitalOut led_user(LED_USER);
-DigitalOut led_red(LED_RED);
-DigitalOut led_green(LED_GREEN);
-DigitalOut led_blue(LED_BLUE);
 DigitalOut pin_emergency(D0); //非常停止信号
 
+Button user_sw(USER_BUTTON0);
+
 Ticker interrupt;
 bool flag_10ms = false;
 bool flag_1s = false;
- 
+
+void RGB_LED() //RGBのLEDをいい感じに光らせる
+{
+    static float counts = 0.0;
+    counts += CONTROL_PERIOD; // ここで光る周期を変えられる(はず)
+
+    if(counts < CONTROL_PERIOD*100.0){
+        led_red.write(counts);
+        led_blue.write(1.0 - counts);
+        
+    }else if(counts < CONTROL_PERIOD*100.0*2.0){
+        led_green.write(counts - 1.0);
+        led_red.write(1.0*2.0 - counts);
+    }else if(counts < CONTROL_PERIOD*100.0*3.0){
+        led_blue.write(counts - 1.0*2.0);
+        led_green.write(1.0*3.0 - counts);
+    }else{
+        counts = 0.0;
+    }
+}
+
 void interrupt_func()
 {
     static int count_10ms = 0;
@@ -62,12 +88,22 @@
     #endif
     contoller_num = commMonitor.init(1000, INT_TIME_MS*10); //コントローラのタイムアウトと受信周期を設定し,デバイス番号を取得
     
+    led_red.write(0.0);
+    led_green.write(0.0);
+    led_blue.write(0.0);
+    led_user.write(1);
+    
+    while(!user_sw.button_fall())pc.printf("waiting\r\n"); //user_swが押されるまで待機
+    led_user.write(0);
+    
     interrupt.attach(&interrupt_func, INT_TIME);
     
     while(1) 
     {
         if(flag_10ms)
         {
+            RGB_LED();
+            
             #if CON_TYPE == CON_DS4
                 //con.update(); //main関数のflag内で呼び出す.
                 commMonitor.Monitoring(con.update(), contoller_num); //コントローラの通信状況を監視
@@ -98,9 +134,10 @@
 
             #elif CON_TYPE == CON_ADACHI
                 //conmbed.update(); //main関数のflag内で呼び出す.
-                commMonitor.Monitoring(conmbed.update(), contoller_num);
+                commMonitor.Monitoring(conmbed.update(), contoller_num); //コントローラの通信状況を監視
+                
                 //if(conmbed.available())
-                if(commMonitor.getAvailable(contoller_num))
+                if(commMonitor.getAvailable(contoller_num))//コントローラと通信しているかを確認
                 {
                     int buttonState = conmbed.getButtonState();
                     uint8_t joyRx = conmbed.readJoyRXbyte();
@@ -123,8 +160,6 @@
                     led_user.write(1);
                     pin_emergency.write(0); //非常停止を作動させる
                 }
-
-
             #endif
             
             flag_10ms = false;
@@ -132,18 +167,10 @@
         
         if(flag_1s)
         {
-            static int led_count = 0;
-
-            led_red.write(led_count & 0x01);
-            led_green.write(led_count & 0x02);
-            led_blue.write(led_count & 0x04);
-
-            led_count++;
-            if(led_count == 0x05) led_count = 0;
-
+            // code here!
             flag_1s = false;
         }
         
-        thread_sleep_for(1);
+        thread_sleep_for(1); //眠らせないとなんか変
     }
 }