NagaokaRoboticsClub_mbedTeam / ikarashiCAN

Dependencies:   DataControl

Committer:
ikarashikota
Date:
Wed Oct 05 09:48:37 2022 +0000
Revision:
6:503b975c3c8e
Parent:
5:664bd71935c3
Child:
7:b94c7d2eaed5
add ifOriginal function

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ikarashikota 0:b9571508f055 1 /** @author 五十嵐幸多
ikarashikota 0:b9571508f055 2 *
ikarashikota 0:b9571508f055 3 * 割と簡単にCAN通信ができるクラスです。
ikarashikota 0:b9571508f055 4 * 通信初心者なので何かあったら、すぐ五十嵐へGO
ikarashikota 0:b9571508f055 5 */
ikarashikota 0:b9571508f055 6 #ifndef IKARASHI_CAN
ikarashikota 0:b9571508f055 7
ikarashikota 0:b9571508f055 8 #define IKARASHI_CAN
ikarashikota 0:b9571508f055 9
ikarashikota 0:b9571508f055 10 #include "mbed.h"
ikarashikota 0:b9571508f055 11 #include "DataControl.h"
ikarashikota 0:b9571508f055 12
ikarashikota 0:b9571508f055 13 /*サンプルコード
ikarashikota 0:b9571508f055 14 2台のCANを使って通信するヤツです。
ikarashikota 0:b9571508f055 15
ikarashikota 4:d4c9f57a98c6 16
ikarashikota 0:b9571508f055 17 #include "mbed.h"
ikarashikota 0:b9571508f055 18 #include "ikarashiCAN.h"
ikarashikota 0:b9571508f055 19
ikarashikota 0:b9571508f055 20 Serial pc(USBTX,USBRX,115200);
ikarashikota 0:b9571508f055 21 InterruptIn button(USER_BUTTON);
ikarashikota 0:b9571508f055 22 Ticker ticker;
ikarashikota 0:b9571508f055 23
ikarashikota 0:b9571508f055 24 //ikarashiCAN ican1(D15, D14, 1, 50000); //sender
ikarashikota 0:b9571508f055 25 ikarashiCAN ican1(D15, D14, 1); //sender
ikarashikota 0:b9571508f055 26 ikarashiCAN ican2(D4, D10, 2, 50000); //reciever
ikarashikota 0:b9571508f055 27
ikarashikota 0:b9571508f055 28 uint16_t data = 0;
ikarashikota 4:d4c9f57a98c6 29 //bool btnFlag = 0;
ikarashikota 0:b9571508f055 30
ikarashikota 0:b9571508f055 31 void pushed(){
ikarashikota 4:d4c9f57a98c6 32 //btnFlag = !btnFlag;
ikarashikota 4:d4c9f57a98c6 33 data+=12;
ikarashikota 0:b9571508f055 34 }
ikarashikota 0:b9571508f055 35
ikarashikota 4:d4c9f57a98c6 36 void can_update(){
ikarashikota 4:d4c9f57a98c6 37 ican2.recieve();
ikarashikota 0:b9571508f055 38 ican1.setData(data);
ikarashikota 0:b9571508f055 39 }
ikarashikota 0:b9571508f055 40
ikarashikota 0:b9571508f055 41 int main()
ikarashikota 0:b9571508f055 42 {
ikarashikota 0:b9571508f055 43
ikarashikota 0:b9571508f055 44 ican1.startSend(0.1);
ikarashikota 4:d4c9f57a98c6 45
ikarashikota 0:b9571508f055 46 button.mode(PullDown);
ikarashikota 0:b9571508f055 47
ikarashikota 0:b9571508f055 48 while(1){
ikarashikota 0:b9571508f055 49 button.fall(&pushed);
ikarashikota 4:d4c9f57a98c6 50 can_update();
ikarashikota 0:b9571508f055 51 pc.printf("sdata: %d rdata: %d len: %d s: %d r: %d\n\r", data,ican2.simpleGetData(1), ican2.CanLen(), ican1.checkSender(), ican2.checkReciever());
ikarashikota 0:b9571508f055 52 }
ikarashikota 0:b9571508f055 53
ikarashikota 0:b9571508f055 54 }
ikarashikota 0:b9571508f055 55
ikarashikota 0:b9571508f055 56 */
ikarashikota 0:b9571508f055 57
ikarashikota 0:b9571508f055 58
ikarashikota 0:b9571508f055 59 /// CAN通信のクラスです
ikarashikota 0:b9571508f055 60 class ikarashiCAN : public DataControl
ikarashikota 0:b9571508f055 61 {
ikarashikota 0:b9571508f055 62 public:
ikarashikota 0:b9571508f055 63
ikarashikota 0:b9571508f055 64 /** コンストラクタ
ikarashikota 0:b9571508f055 65 *
ikarashikota 0:b9571508f055 66 * @param rd CANのrdピン
ikarashikota 0:b9571508f055 67 * @param td CANのtdピン
ikarashikota 0:b9571508f055 68 * @param msgID CANのID
ikarashikota 0:b9571508f055 69 * @param frequency CANの周波数
ikarashikota 0:b9571508f055 70 * @note nucleoでやる場合、frequencyは50000にしないとなぜか安定しません。
ikarashikota 0:b9571508f055 71 * なので、frequencyを設定しなかったとき自動的に周波数が50000に設定されるようにしました。
ikarashikota 4:d4c9f57a98c6 72 *
ikarashikota 0:b9571508f055 73 */
ikarashikota 0:b9571508f055 74 ikarashiCAN(PinName rd, PinName td, int msgID, int frequency);
ikarashikota 0:b9571508f055 75 ikarashiCAN(PinName rd, PinName td, int msgID);
ikarashikota 0:b9571508f055 76
ikarashikota 0:b9571508f055 77 /** 送信するデータをセットする関数
ikarashikota 0:b9571508f055 78 *
ikarashikota 0:b9571508f055 79 * 一度送信するデータをセットします。
ikarashikota 3:906335cad175 80 * @typedef T 一旦値を保持するための型
ikarashikota 0:b9571508f055 81 * @param _data 一旦値を保持する変数
ikarashikota 0:b9571508f055 82 */
ikarashikota 0:b9571508f055 83 template <class T>
ikarashikota 0:b9571508f055 84 void setData(T _data){
ikarashikota 0:b9571508f055 85 dataSet(_data, sender);
ikarashikota 0:b9571508f055 86 }
ikarashikota 0:b9571508f055 87
ikarashikota 0:b9571508f055 88 /** データを受け取る関数
ikarashikota 0:b9571508f055 89 *
ikarashikota 0:b9571508f055 90 * 受信したデータを返します。
ikarashikota 0:b9571508f055 91 * @return int 受信したデータ
ikarashikota 0:b9571508f055 92 */
ikarashikota 0:b9571508f055 93 int getData();
ikarashikota 0:b9571508f055 94
ikarashikota 0:b9571508f055 95 /** お手軽関数
ikarashikota 0:b9571508f055 96 *
ikarashikota 0:b9571508f055 97 * ほんとは色々処理を実行してからデータを取得しなきゃなんですけど、めんどくさいですよね!
ikarashikota 0:b9571508f055 98 * なので、簡単に受信したデータを取得できる関数を用意しました。
ikarashikota 0:b9571508f055 99 * 特定のIDのデータを取得できます。
ikarashikota 0:b9571508f055 100 * @param _id 受信したいCANのID
ikarashikota 0:b9571508f055 101 * @return int 受信したデータ
ikarashikota 0:b9571508f055 102 */
ikarashikota 0:b9571508f055 103 int simpleGetData(int _id);
ikarashikota 0:b9571508f055 104
ikarashikota 0:b9571508f055 105 ///セットしたデータを送信します。
ikarashikota 0:b9571508f055 106 void send();
ikarashikota 0:b9571508f055 107
ikarashikota 0:b9571508f055 108 ///データを受信します。データの取得とは違います。
ikarashikota 0:b9571508f055 109 void recieve();
ikarashikota 0:b9571508f055 110
ikarashikota 0:b9571508f055 111 /** attach関数
ikarashikota 0:b9571508f055 112 *
ikarashikota 0:b9571508f055 113 * send関数のattachバージョン。
ikarashikota 0:b9571508f055 114 * @param second 繰り返す間隔。単位は[s]
ikarashikota 0:b9571508f055 115 */
ikarashikota 0:b9571508f055 116 void startSend(float second);
ikarashikota 0:b9571508f055 117
ikarashikota 0:b9571508f055 118 /** attach関数
ikarashikota 0:b9571508f055 119 *
ikarashikota 0:b9571508f055 120 * recieve関数のattachバージョン。データが送信されたときに自動で受信します。
ikarashikota 3:906335cad175 121 * @attention mbed-os5以上だとバグるみたいです。mbed2を使うか、素のrecieve関数を使ってください
ikarashikota 0:b9571508f055 122 */
ikarashikota 0:b9571508f055 123 void startRecieve();
ikarashikota 0:b9571508f055 124
ikarashikota 5:664bd71935c3 125 /** オリジナル
ikarashikota 5:664bd71935c3 126 *
ikarashikota 5:664bd71935c3 127 * 引数の値を送信用配列にセットします。この値は下のGet関数で取得できます。
ikarashikota 5:664bd71935c3 128 * 受信データの判別に使えるかも
ikarashikota 5:664bd71935c3 129 * @param free_num unsigned short型 
ikarashikota 5:664bd71935c3 130 */
ikarashikota 5:664bd71935c3 131 void originalSet(unsigned short free_num);
ikarashikota 5:664bd71935c3 132
ikarashikota 5:664bd71935c3 133 /** オリジナルのセット
ikarashikota 5:664bd71935c3 134 *
ikarashikota 5:664bd71935c3 135 * @return int originalSetでセットした値
ikarashikota 5:664bd71935c3 136 */
ikarashikota 5:664bd71935c3 137 int originalGet();
ikarashikota 5:664bd71935c3 138
ikarashikota 6:503b975c3c8e 139 void ifOriginalGet(int buff, int id, int original_num);
ikarashikota 6:503b975c3c8e 140
ikarashikota 6:503b975c3c8e 141 void ifOriginalGet(int buff, int original_num);
ikarashikota 6:503b975c3c8e 142
ikarashikota 0:b9571508f055 143 ///データの送信が成功したときにtrueになります。
ikarashikota 0:b9571508f055 144 bool checkSender();
ikarashikota 0:b9571508f055 145
ikarashikota 0:b9571508f055 146 ///データの受信に成功したときにtrueになります。
ikarashikota 0:b9571508f055 147 bool checkReciever();
ikarashikota 0:b9571508f055 148
ikarashikota 0:b9571508f055 149 ///受信したデータのIDを返します。取得に失敗したときは-1を返します。
ikarashikota 0:b9571508f055 150 int recievedCanID();
ikarashikota 0:b9571508f055 151
ikarashikota 0:b9571508f055 152 ///このクラスを適用しているCANのIDを返します。
ikarashikota 0:b9571508f055 153 int myCanID();
ikarashikota 0:b9571508f055 154
ikarashikota 0:b9571508f055 155 ///受信したデータのサイズ(byte)を返します。
ikarashikota 0:b9571508f055 156 int CanLen();
ikarashikota 0:b9571508f055 157
ikarashikota 0:b9571508f055 158
ikarashikota 0:b9571508f055 159 void sender_reset();
ikarashikota 0:b9571508f055 160 void reciever_reset();
ikarashikota 0:b9571508f055 161
ikarashikota 0:b9571508f055 162
ikarashikota 0:b9571508f055 163 private:
ikarashikota 0:b9571508f055 164
ikarashikota 0:b9571508f055 165 CAN can;
ikarashikota 0:b9571508f055 166 CANMessage msg;
ikarashikota 0:b9571508f055 167 int _msgID;
ikarashikota 0:b9571508f055 168 int sended_msgID;
ikarashikota 0:b9571508f055 169
ikarashikota 0:b9571508f055 170 Ticker can_ticker;
ikarashikota 0:b9571508f055 171
ikarashikota 0:b9571508f055 172 ///送信するデータの配列
ikarashikota 5:664bd71935c3 173 char sender[5];
ikarashikota 0:b9571508f055 174
ikarashikota 0:b9571508f055 175 ///受信したデータが格納される配列
ikarashikota 5:664bd71935c3 176 char reciever[5];
ikarashikota 0:b9571508f055 177
ikarashikota 0:b9571508f055 178 int _can_data;
ikarashikota 0:b9571508f055 179 bool can_s;
ikarashikota 0:b9571508f055 180 bool can_r;
ikarashikota 0:b9571508f055 181
ikarashikota 0:b9571508f055 182 };
ikarashikota 0:b9571508f055 183
ikarashikota 0:b9571508f055 184 #endif
ikarashikota 0:b9571508f055 185