NagaokaRoboticsClub_mbedTeam / ikarashiCAN

Dependencies:   DataControl

Files at this revision

API Documentation at this revision

Comitter:
ikarashikota
Date:
Tue Aug 23 16:59:47 2022 +0000
Child:
1:6abb511f8c4c
Commit message:
:-)

Changed in this revision

DataControl.lib Show annotated file Show diff for this revision Revisions of this file
ikarashiCAN.cpp Show annotated file Show diff for this revision Revisions of this file
ikarashiCAN.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DataControl.lib	Tue Aug 23 16:59:47 2022 +0000
@@ -0,0 +1,1 @@
+DataControl#65149aeacbcc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ikarashiCAN.cpp	Tue Aug 23 16:59:47 2022 +0000
@@ -0,0 +1,115 @@
+
+#include "ikarashiCAN.h"
+
+ikarashiCAN::ikarashiCAN(PinName rd, PinName td, int msgID, int frequency):
+    can(rd, td, frequency), msg(msgID, reciever, 4)
+{
+    _msgID = msgID;
+    sended_msgID = 0;
+    can_s = 0;
+    can_r = 0;
+    _can_data = 0;
+}
+
+ikarashiCAN::ikarashiCAN(PinName rd, PinName td, int msgID):
+    can(rd, td, 50000), msg(msgID, reciever, 4)
+{
+    _msgID = msgID;
+    sended_msgID = 0;
+    can_s = 0;
+    can_r = 0;
+    _can_data = 0;
+}
+
+//----------------------bit controll------------------------
+int ikarashiCAN::getData()
+{
+   return dataCombine(msg.data, msg.len);
+}
+//--------------------------------------------------------//
+
+
+
+//---attach function---------------------------------------//
+void ikarashiCAN::send()
+{
+    if(can.write(CANMessage(_msgID, sender, separated_data_size))) {
+        can_s = 1;
+    } else {
+        can_s = 0;
+    }
+}
+
+void ikarashiCAN::recieve()
+{
+    if(can.read(msg)) {
+        can_r = 1;
+    }else{
+        can_r = 0;
+    }
+}
+//--------------------------------------------------------//
+
+
+
+//---attach-----------------------------------------------//
+void ikarashiCAN::startSend(float second)
+{
+    can_ticker.attach(this, &ikarashiCAN::send, second);
+}
+
+void ikarashiCAN::startRecieve()
+{
+    can_ticker.attach(this, &ikarashiCAN::recieve, CAN::TxIrq);
+}
+//--------------------------------------------------------//
+
+
+int ikarashiCAN::simpleGetData(int _id){
+    if(_id == msg.id && can_r){
+        _can_data = getData();
+        return getData();
+    }else{
+        return _can_data;
+    }
+}
+
+
+bool ikarashiCAN::checkSender()
+{
+    return can_s;
+}
+
+bool ikarashiCAN::checkReciever()
+{
+    return can_r;
+}
+
+int ikarashiCAN::recievedCanID(){
+    if(can_r){
+        return msg.id;
+    }else{
+        return -1;
+    }
+}
+
+int ikarashiCAN::myCanID(){
+    return _msgID;
+}
+
+int ikarashiCAN::CanLen(){
+    return msg.len;
+}
+
+void ikarashiCAN::sender_reset()
+{
+    for(int i=0; i<4; i++) sender[i] = 0;
+}
+
+void ikarashiCAN::reciever_reset()
+{
+    for(int i=0; i<4; i++) reciever[i] = 0;
+}
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ikarashiCAN.h	Tue Aug 23 16:59:47 2022 +0000
@@ -0,0 +1,168 @@
+/** @author 五十嵐幸多
+ *
+ * 割と簡単にCAN通信ができるクラスです。
+ * 通信初心者なので何かあったら、すぐ五十嵐へGO
+ */
+#ifndef IKARASHI_CAN
+
+#define IKARASHI_CAN
+
+#include "mbed.h"
+#include "DataControl.h"
+
+/*サンプルコード
+2台のCANを使って通信するヤツです。
+
+#include "mbed.h"
+#include "ikarashiCAN.h"
+
+Serial pc(USBTX,USBRX,115200);
+
+InterruptIn button(USER_BUTTON);
+DigitalOut led(LED2);
+Ticker ticker;
+
+//ikarashiCAN ican1(D15, D14, 1, 50000); //sender
+ikarashiCAN ican1(D15, D14, 1); //sender
+ikarashiCAN ican2(D4, D10, 2, 50000); //reciever
+
+uint16_t data = 0;
+
+void pushed(){
+    ican1.setData(999999);
+}
+void add(){
+
+    led != led;
+
+    data++;
+    ican1.setData(data);
+}
+
+int main()
+{
+
+    ticker.attach(&add, 1);
+    ican1.startSend(0.1);
+    ican2.startRecieve();
+    led = 1;
+    button.mode(PullDown);
+    
+    while(1){
+        button.fall(&pushed);
+        pc.printf("sdata: %d  rdata: %d  len: %d  s: %d  r: %d\n\r", data,ican2.simpleGetData(1), ican2.CanLen(), ican1.checkSender(), ican2.checkReciever());
+    }
+
+}
+
+*/
+
+
+/// CAN通信のクラスです
+class ikarashiCAN : public DataControl
+{
+public:
+
+    /** コンストラクタ
+     *
+     * @param rd CANのrdピン
+     * @param td CANのtdピン
+     * @param msgID CANのID  
+     * @param frequency CANの周波数
+     * @note nucleoでやる場合、frequencyは50000にしないとなぜか安定しません。
+     *       なので、frequencyを設定しなかったとき自動的に周波数が50000に設定されるようにしました。
+     *       もっといい方法があるかも...
+     */
+    ikarashiCAN(PinName rd, PinName td, int msgID, int frequency);
+    ikarashiCAN(PinName rd, PinName td, int msgID);
+    
+    /** 送信するデータをセットする関数
+     *
+     * 一度送信するデータをセットします。
+     * @typedef T 無の型です。一旦値を保持するための型
+     * @param _data 一旦値を保持する変数
+     */
+    template <class T>
+    void setData(T _data){
+        dataSet(_data, sender);
+    }
+
+    /** データを受け取る関数
+     *
+     * 受信したデータを返します。
+     * @return int 受信したデータ
+     */
+    int getData();
+    
+    /** お手軽関数
+     *
+     * ほんとは色々処理を実行してからデータを取得しなきゃなんですけど、めんどくさいですよね!
+     * なので、簡単に受信したデータを取得できる関数を用意しました。
+     * 特定のIDのデータを取得できます。
+     * @param _id 受信したいCANのID
+     * @return int 受信したデータ
+     */
+    int simpleGetData(int _id);
+
+    ///セットしたデータを送信します。
+    void send();
+
+    ///データを受信します。データの取得とは違います。
+    void recieve();
+
+    /** attach関数
+     *
+     * send関数のattachバージョン。
+     * @param second 繰り返す間隔。単位は[s]
+     */
+    void startSend(float second);
+    
+    /** attach関数
+     *
+     * recieve関数のattachバージョン。データが送信されたときに自動で受信します。
+     */
+    void startRecieve();
+    
+    ///データの送信が成功したときにtrueになります。
+    bool checkSender();
+    
+    ///データの受信に成功したときにtrueになります。
+    bool checkReciever();
+    
+    ///受信したデータのIDを返します。取得に失敗したときは-1を返します。
+    int recievedCanID();
+    
+    ///このクラスを適用しているCANのIDを返します。
+    int myCanID();
+    
+    ///受信したデータのサイズ(byte)を返します。
+    int CanLen();
+
+
+    void sender_reset();
+    void reciever_reset();
+
+    
+private:
+
+    CAN can;
+    CANMessage msg;
+    int _msgID;
+    int sended_msgID;
+    
+    Ticker can_ticker;
+    
+    ///送信するデータの配列
+    char sender[4];
+    
+    ///受信したデータが格納される配列
+    char reciever[4];
+    
+    int _can_data;
+    bool can_s;
+    bool can_r;
+
+};
+
+#endif
+