Hayato Kikuchi
/
MonitoringTest
Communication Class and Controller Class (ControllerForMbed Class)
Revision 2:fd0c21600586, committed 2021-12-23
- Comitter:
- kikuchi8810
- Date:
- Thu Dec 23 08:56:26 2021 +0000
- Parent:
- 1:6633661058ec
- Commit message:
- modified
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Button.cpp Thu Dec 23 08:56:26 2021 +0000 @@ -0,0 +1,63 @@ +#include "Button.h" + +// コンストラクタ +Button::Button(PinName pin):input(pin){ + pre_button_state = get_button_state(); + initial_flag = true; +} + +bool Button::get_button_state(){ + return input.read(); +} + +bool Button::button_rise(){ + bool ret = 0; + bool button_state = get_button_state(); + if(initial_flag){ + if(button_state == 0){ + pre_button_state = button_state; + initial_flag = false; + } + }else{ + if(button_state && !pre_button_state){ + initial_flag = true; + ret = 1; + } + pre_button_state = button_state; + } + return ret; +} + +bool Button::button_fall(){ + bool ret = 0; + bool button_state = get_button_state(); + if(initial_flag){ + if(button_state == 1){ + pre_button_state = button_state; + initial_flag = false; + } + }else{ + if(!button_state && pre_button_state){ + initial_flag = true; + ret = 1; + } + pre_button_state = button_state; + } + return ret; +} + +bool Button::button_changed(){ + bool ret = 0; + bool button_state = get_button_state(); + if(initial_flag){ + pre_button_state = button_state; + initial_flag = false; + }else{ + if(button_state != pre_button_state){ + initial_flag = true; + ret = 1; + } + pre_button_state = button_state; + } + return ret; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Button.h Thu Dec 23 08:56:26 2021 +0000 @@ -0,0 +1,23 @@ +#ifndef _BUTTON_H_INCLUDED +#define _BUTTON_H_INCLUDED + +#include "mbed.h" +#include "define.h" + +class Button{ + public: + Button(PinName pin); + + bool button_rise(); + bool button_fall(); + bool button_changed(); + bool get_button_state(); + + private: + DigitalIn input; + + bool pre_button_state; + bool initial_flag; +}; + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SoftPWM.lib Thu Dec 23 08:56:26 2021 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/komaida424/code/SoftPWM/#7918ce37626c
--- a/define.h Thu Dec 23 05:52:48 2021 +0000 +++ b/define.h Thu Dec 23 08:56:26 2021 +0000 @@ -1,6 +1,8 @@ #ifndef DEFINE_H #define DEFINE_H +#include "platform/mbed_thread.h" + struct ControllerData{ unsigned int ButtonState; uint8_t RJoyX, RJoyY, LJoyX, LJoyY;
--- 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); //眠らせないとなんか変 } }