Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 2:144ca2f5d850, committed 2015-02-14
- Comitter:
- YosukeK
- Date:
- Sat Feb 14 11:32:14 2015 +0000
- Parent:
- 1:aed433d882c9
- Commit message:
- ????????????????????
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Data.cpp Sat Feb 14 11:32:14 2015 +0000 @@ -0,0 +1,34 @@ +#include <mbed.h> +#include "Data.h" + +/** + * + */ +Data::Data() { +} + +Data::~Data() { + +} + + +/** + * + */ + +//LENGHT = 2; + +SendData::SendData(int left, int right) { + wheelVelocity[0] = left; + wheelVelocity[1] = right; +} + +int get(int index) { + int result = -1; + +// if (0 <= index && index < 2) { +// result = wheelVelocity[index]; +// } + return result; +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Data.h Sat Feb 14 11:32:14 2015 +0000 @@ -0,0 +1,43 @@ +#include <mbed.h> + +#ifndef __DATA_H_INCLUDED__ +#define __DATA_H_INCLUDED__ + +/** + * データクラス + * 基底のクラス定義のみ + */ +class Data { + public: + Data(); + ~Data(); + + private: + +}; + +#endif + + +#ifndef __SENDDATA_H_INCLUDED__ +#define __SENDDATA_H_INCLUDED__ + +/** + * 送信データクラス + * データクラスから派生 + */ +class SendData : public Data { + static const int LENGHT = 2; + + public: + SendData(); + SendData(int left, int right); + + int get(int index); + + private: + int wheelVelocity[LENGHT]; + +}; + +#endif \ No newline at end of file
--- a/EventArg.cpp Wed Jan 21 16:20:12 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -#include "mbed.h" -#include "EventArg.h" - -/** - * - */ -EventArg::EventArg() { - leftWheetVelocity = 0; - rightWheelVelocity = 0; -} - -EventArg::~EventArg() { - -} \ No newline at end of file
--- a/EventArg.h Wed Jan 21 16:20:12 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -#include "mbed.h" - -#ifndef __EVENTARG_H_INCLUDED__ -#define __EVENTARG_H_INCLUDED__ - -/** - * - */ -class EventArg { - public: - EventArg(); - ~EventArg(); - - public: - int leftWheetVelocity; - int rightWheelVelocity; -}; - -#endif \ No newline at end of file
--- a/Roomba.cpp Wed Jan 21 16:20:12 2015 +0000 +++ b/Roomba.cpp Sat Feb 14 11:32:14 2015 +0000 @@ -1,4 +1,4 @@ -#include "mbed.h" +#include <mbed.h> #include "Roomba.h" /** @@ -6,87 +6,14 @@ * @param tx * @param rx */ -Roomba::Roomba(PinName tx, PinName rx, PinName led): - _s(tx, rx), _led(led){ - count = 0; - timedOut = false; - _led = 0; - //_mode = Roomba::Mode::Off; - Roomba::mp = &Roomba::serialReceiveCallback; - _s.attach(this, Roomba::mp, Serial::RxIrq); -} - - -/** - * @bref コマンド送信インターフェースの実装 - * @param e イベント引数 - * @return true - */ -bool Roomba::send(EventArg e) { - - Roomba::start(); - Roomba::mode(Roomba::Full);//(Roomba::Mode::Full); If write struct Mode and no name enum, Compiler say no sutable constructor conver to enum... - Roomba::drive(e.leftWheetVelocity, e.rightWheelVelocity); - - return true; -} - -/** - * @bref コマンド送信結果受信時のインターフェースの実装 - * @param result コマンド送信結果 - */ -void Roomba::notify(bool result) { - if (result == true) { - _led = 1; - } else { - _led = 0; - } +Roomba::Roomba(PinName tx, PinName rx): + _s(tx, rx) { + _mode = Roomba::Mode::Off; } /** - * @bref 周期タイマのコールバックメソッド - * @param e イベント引数 - */ -void Roomba::periodicCallback(EventArg e) { - - count = count + 1; - - if (count > 10) { - if (timedOut == false) { - timedOut = true; - Roomba::notify(timedOut); - } - } - - Roomba::send(e); - -} - -/** - * @bref シリアル受信時コールバックメソッド - */ -void Roomba::serialReceiveCallback() { - count = 0; - - if (timedOut) { - timedOut = false; - Roomba::notify(timedOut); - } -} - -///** -// * @bref シリアル受信のアタッチ -// */ -////継承先から操作できるようにしただけ -//void Roomba::attachSerialReceiveCallback() { -// Roomba::mp = &Roomba::serialReceiveCallback; -// _s.attach(this, Roomba::mp, Serial::RxIrq); -// //_s.attach(this, &Roomba::notify, Serial::RxIrq); -//} - -/** - * @bref Start + * @bref start * @return true */ bool Roomba::start() { @@ -102,7 +29,7 @@ * @param 操作モード * @return true */ -bool Roomba::mode(Roomba::Mode m) { +bool Roomba::mode(Roomba::Mode::EMode m) { _s.putc(132);//Full; @@ -111,36 +38,36 @@ /** - * @bref Start + * @bref * @param true */ bool Roomba::drive(int rightWheelVelocity, int leftWheelVelocity) { + bool ret = false; - bool ret = false; + char command[10]; if ((-500 <= rightWheelVelocity && rightWheelVelocity <= 500) && (-500 <= leftWheelVelocity && leftWheelVelocity <= 500)) { - Roomba::command[0] = 145; - Roomba::command[1] = (rightWheelVelocity & 0xFF00) >> 8; //MSB - Roomba::command[2] = rightWheelVelocity & 0xFF; //LSB - Roomba::command[3] = (leftWheelVelocity & 0xFF00) >> 8; //MSB - Roomba::command[4] = leftWheelVelocity & 0xFF; //LSB - Roomba::command[5] = '\0'; + command[0] = 145; + command[1] = (rightWheelVelocity & 0xFF00) >> 8; //MSB + command[2] = rightWheelVelocity & 0xFF; //LSB + command[3] = (leftWheelVelocity & 0xFF00) >> 8; //MSB + command[4] = leftWheelVelocity & 0xFF; //LSB + command[5] = '\0'; - for (int i = 0; Roomba::command[i] != '\0'; i++) { - _s.putc(Roomba::command[i]); + for (int i = 0; i < 5; i++) { + _s.putc(command[i]); } - //_led = 0; ret = true; } - //_led = 1; return ret; } /** * @bref バッテリ状態 + * 実装未完了 * @param true * @return * @retval
--- a/Roomba.h Wed Jan 21 16:20:12 2015 +0000 +++ b/Roomba.h Sat Feb 14 11:32:14 2015 +0000 @@ -1,69 +1,39 @@ #include "mbed.h" -#include "EventArg.h" +//#include "Data.h" #ifndef __ROOMBA_H_INCLUDED__ #define __ROOMBA_H_INCLUDED__ -/** - * ルンバ制御クラスのインターフェース - * 下記メソッドを継承先が実装すること - */ -class IRoomba { - public: - //virtual ~IRoomba(){};//なぜ宣言を書いたのか、コメントにした理由とともに忘れた - virtual bool send(EventArg e) = 0; - virtual void notify(bool result) = 0; -}; /** * ルンバ制御クラス */ -class Roomba : public IRoomba { +class Roomba { public: - virtual bool send(EventArg e); - virtual void notify(bool result); - - //Mode.Fullのような書き方(またはそれに近い書き方がしたい) - //調べていたら、Roomba::Mode::Fullのように書くことできそうだとわかったので試したが、上手く行かない - //上手く行かない理由の考察はできていない - //http://stackoverflow.com/questions/8213696/accessing-enum-values-defined-in-a-struct - //struct Mode - //{ - enum Mode + struct Mode + { + enum EMode { Off, - Passive,//?? + Passive, Safe, Full }; - //}; - - private: - Serial _s; - Roomba::Mode _mode;// = Roomba::Mode.Off; - //EventArg::EventArg _e; - DigitalOut _led;//Notify()で使用するLED:ルンバ状態を通知する - //void (Roomba::*serialReceiveCallback)(); //= notify; - void (Roomba::*mp)();//member function pointer - - char command[10]; + }; + + Roomba(PinName tx, PinName rx); - int count; //タイムアウト検出カウンタ(カウント値が一定数を超えればタイムアウト) - bool timedOut;//タイムアウト検出フラグ - - public: - Roomba(PinName tx, PinName rx, PinName led); - - void attachPeriodicCallback(); - virtual void periodicCallback(EventArg e); - void attachSerialReceiveCallback(); - void serialReceiveCallback(); - - bool mode(Roomba::Mode m); + bool mode(Roomba::Mode::EMode m); //Mode getMode(); bool start(); bool drive(int rightWheelVelocity, int leftWheelVelocity); bool battery(int* batteryCapacity); + + protected: + Serial _s; + + private: + Roomba::Mode::EMode _mode; }; #endif \ No newline at end of file
--- a/main.cpp Wed Jan 21 16:20:12 2015 +0000 +++ b/main.cpp Sat Feb 14 11:32:14 2015 +0000 @@ -1,106 +1,188 @@ -#include "mbed.h" +#include <mbed.h> #include "Roomba.h" -#include "EventArg.h" + +/** + * データクラス + * 基底のクラス定義のみ + */ +class Data { + private: + public: + //virtual Data() + //virtual ~Data() {} +}; + + +/** + * 送信データクラス + * データクラスから派生 + */ +class SendData : public Data{ + static const int LENGHT = 2; + + private: + int wheelVelocity[LENGHT]; + + public: + SendData() { + } + + SendData(int left, int right) { + wheelVelocity[0] = left; + wheelVelocity[1] = right; + } + + int get(int index) { + int result = -1; + + if (0 <= index && index < LENGHT) { + result = wheelVelocity[index]; + } + return result; + } +}; + + +/** + * ルンバ制御クラスのインターフェース + * 下記メソッドを継承先が実装すること + */ +class IRoomba { + public: + //virtual ~IRoomba(){};//なぜ宣言を書いたのか、コメントにした理由とともに忘れた + //virtual void set(Data data) = 0; + virtual bool send() = 0; +}; + /* - * ルンバ向けイベント引数クラス + * ルンバ制御クラスの実装クラス */ -//class RoombaEventArg : public EventArg -//{ -// typedef EventArg base; -// -// public: -// //RoombaEventArg(int leftWheetVelocity, int rightWheelVelocity} { -// -// //} -// -// RoombaEventArg() { -// leftWheetVelocity = 0; -// rightWheelVelocity = 0; -// }; -// -// public: -// int leftWheetVelocity; -// int rightWheelVelocity; -//}; +class ImplRoomba : protected Roomba, protected IRoomba { + static const int COUNT_TIME_OUT = 10; + + typedef Roomba base; + + private: + int count; //タイムアウト検出カウンタ(カウント値が一定数を超えればタイムアウト) + bool isTimedOut;//タイムアウト検出フラグ + DigitalOut _led;//notify()で使用するLED:ルンバ状態を通知する + + SendData *_data;//送信データ + + public: + ImplRoomba(PinName tx, PinName rx, PinName led) : Roomba(tx, rx), _led(led), _data() { + count = 0; + isTimedOut = false; + _led = 0; -// -///* -// * ルンバ制御クラスの実装クラス -// */ -//class ImplRoomba : protected Roomba { -// typedef Roomba base; -// -// private: -// DigitalOut _led;//Notify()で使用するLED:ルンバ状態を通知する -// -// public: -// ImplRoomba(PinName tx, PinName rx, PinName led) :Roomba(tx, rx), _led(led){ -// _led = 0; -// Roomba::attachSerialReceiveCallback(); -// } -// -// /* -// * @bref 送信メソッド -// */ -// virtual bool ImplRoomba::send(RoombaEventArg e) { -// _led != _led; -// base::start(); -// base::mode(Roomba::Full);//(Roomba::Mode::Full); If write struct Mode and no name enum, Compiler say no sutable constructor conver to enum... -// base::drive(e.leftWheetVelocity, e.rightWheelVelocity); -// -// return true; -// } -// -// /* -// * @bref 状態通知メソッド -// */ -// virtual void ImplRoomba::notify(bool result) { -// if (result == false) { -// _led = 1; -// } else { -// _led = 0; -// } -// } -// -// /* -// * @bref 周期タイマコールバック -// */ -// virtual void ImplRoomba::periodicCallback(RoombaEventArg e) { -// base::periodicCallback(e); -// } -//}; + //beseの持つSerialインスタンスにコールバックメソッドを接続する + base::_s.attach(this, &ImplRoomba::serialReceiveCallback, Serial::RxIrq);//! + } + + + /* + * @bref データ設定メソッド + */ + virtual void ImplRoomba::set(SendData data) { + //Object of abstruct class type "ImplRoomba" is not allowed "ImplRoomba roomba(...);" + _data = &data; + + base::_s.printf("%d", (*_data).get(1)); + + } + + + /* + * @bref 送信メソッド + */ + virtual bool ImplRoomba::send() { + + base::start(); + + base::mode(Roomba::Mode::Full); + + int leftWheelVelocity = (*_data).get(0); + int rightWheerVelocity = (*_data).get(1); + base::drive(leftWheelVelocity, rightWheerVelocity); + + return true; + } + + + /* + * @bref 通信状態通知メソッド + */ + virtual void ImplRoomba::notify() { + + if (isTimedOut == true) { + _led = 1; + } else { + _led = 0; + } + } + + + /** + * @bref 周期タイマのコールバックメソッド + */ + virtual void ImplRoomba::periodicCallback() { + + count = count + 1; + + if (count > COUNT_TIME_OUT) { + if (isTimedOut == false) { + isTimedOut = true; + ImplRoomba::notify(); + } + } + + ImplRoomba::send(); + } + + /** + * @bref シリアル受信時コールバックメソッド + */ + virtual void ImplRoomba::serialReceiveCallback() { + count = 0; + + _led = 1; + base::_s.printf("hogehoge"); + + if (isTimedOut) { + isTimedOut = false; + ImplRoomba::notify(); + } + } + +}; -Ticker ticker; +ImplRoomba roomba(SERIAL_TX, SERIAL_RX, LED1); +//Ticker ticker; +//Serial pc(SERIAL_TX, SERIAL_RX); -Serial pc(SERIAL_TX, SERIAL_RX); +DigitalOut debugLed(LED1); -//匿名クラスでオーバーライドした書き方がしたい -//Roomba -Roomba roomba(SERIAL_TX, SERIAL_RX, LED1);/* = new Roomba: IRoomba { - bool Roomba::send() { - //start, mode, drive - return true; - } - void Roomba::notify() {} -};*/ +int main() { + int leftWheelVelocity = 0; + int rightWheelVelocity = 0; + + while (true) { -//Ticker no kawari. -int main() { - //ticker.attach(roomba.periodicCallback, 0.1); - - //TODO:Serial receive message. - - int leftWheelVelocity = 500; - int rightWheelVelocity = -500; - - EventArg e;//(leftWheelVelocity, rightWheelVelocity); - e.leftWheetVelocity = leftWheelVelocity; - e.rightWheelVelocity = rightWheelVelocity; - - while (true) { - roomba.periodicCallback(e); - wait_ms(100); + if (1) { + //ルンバの走行値を更新 + leftWheelVelocity = -200; + rightWheelVelocity = 500; + + SendData::SendData *data = new SendData(leftWheelVelocity, rightWheelVelocity); + roomba.set(*data); + delete data; + } + + //ルンバへ定期的に走行値を送信 + roomba.periodicCallback(); + + wait_ms(1000); } } \ No newline at end of file