明石高専ロボ研 mbedライブラリ

Dependencies:   mbed

Dependents:   MDD_L432KC USB2RS485 pathtracking odometry ... more

Committer:
TanakaRobo
Date:
Wed Oct 13 09:12:48 2021 +0000
Revision:
14:bdd394483434
Parent:
13:77c13e86ad12
first? commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
TanakaRobo 0:ca84ed7518f5 1 #ifndef SCRP_SLAVE_H
TanakaRobo 0:ca84ed7518f5 2 #define SCRP_SLAVE_H
TanakaRobo 0:ca84ed7518f5 3 #include "mbed.h"
TanakaRobo 0:ca84ed7518f5 4
TanakaRobo 0:ca84ed7518f5 5 /*USBでPCにつなぐポートと、基板上でRasPiとつなぐポートを同時に開く。
TanakaRobo 0:ca84ed7518f5 6 *RedePinの有り無しの選択、ポートを一つだけ開くことも可。
TanakaRobo 11:eaf2e3166d20 7 *bool interruptがデフォルトでtrueだが、falseを渡すことで割り込みを無効にできる。
TanakaRobo 11:eaf2e3166d20 8 *その時は、受信のために繰り返しreceive()を呼び出す必要がある。
TanakaRobo 0:ca84ed7518f5 9 *以下から選択。
TanakaRobo 11:eaf2e3166d20 10 *ScrpSlave(PinName TX1,PinName RX1,uint32_t addr,bool interrupt = true);//RedePinなし、1ポート
TanakaRobo 11:eaf2e3166d20 11 *ScrpSlave(PinName TX1,PinName RX1,PinName REDE1,uint32_t addr,bool interrupt = true);//RedePinあり、1ポート
TanakaRobo 11:eaf2e3166d20 12 *ScrpSlave(PinName TX1,PinName RX1,PinName TX2,PinName RX2,uint32_t addr,bool interrupt = true);//RedePinなし、2ポート
TanakaRobo 11:eaf2e3166d20 13 *ScrpSlave(PinName TX1,PinName RX1,PinName REDE1,PinName TX2,PinName RX2,uint32_t addr,bool interrupt = true);//RedePinあり、1ポート+RedePinなし、1ポート
TanakaRobo 0:ca84ed7518f5 14 *example not usb port
TanakaRobo 13:77c13e86ad12 15 *L432KC : TX = PA_9 , RX = PA_10 , REDE = PA_12 , addr = 0x0803f800
TanakaRobo 10:25af94dd1668 16 *F446RE : TX = PC_12 , RX = PD_2 , RDDE = PH_1 , addr = 0x0807f800
TanakaRobo 4:39ef4d91dc34 17 *H743ZI : TX = PD_5 , RX = PD_6 , REDE = PD_7 , addr = 0x081ee000
TanakaRobo 3:28c77df7c0b6 18 *<obj>.addCMD(int cmd, bool (*proc)(int rx_data, int& tx_data))
TanakaRobo 3:28c77df7c0b6 19 *でcmdで指定したコマンドを受信したときに呼び出される
TanakaRobo 3:28c77df7c0b6 20 *bool型で引数が(int rx_data, int& tx_data)の関数を指定する。
TanakaRobo 5:a7894e6982ea 21 *addrで指定されたフラッシュメモリーのアドレスに通信で使う1バイトのアドレスが保存される。
TanakaRobo 5:a7894e6982ea 22 *addrに0から254までの値を入れて、この値そのものをidとして通信で使うこともできる。
TanakaRobo 11:eaf2e3166d20 23 *addrに255を入れると全受信モードになります。すべての受信idを自分のものとみなし応答します。
TanakaRobo 11:eaf2e3166d20 24 *この機能はScrpSlaveの性質をよく理解したうえで使ってください。
TanakaRobo 12:7f0b6e7b9626 25 *通常のMD通信網に不注意にこれを入れると、送り返すresponseが衝突し、通信状態を悪化させます。
TanakaRobo 5:a7894e6982ea 26 *
TanakaRobo 5:a7894e6982ea 27 *このライブラリでは、シリアル送信、受信とも割り込みを利用しています。
TanakaRobo 5:a7894e6982ea 28 *Nucleoはシリアル通信割り込みを同時に2ポートまでしか利用できません。
TanakaRobo 5:a7894e6982ea 29 *このライブラリでシリアルポートを2ポート開いた場合、それ以外のシリアル通信で割り込みを利用できないので注意してください。
TanakaRobo 7:4ad54efe2fdd 30 *
TanakaRobo 7:4ad54efe2fdd 31 *シリアルポートに外部からアクセスして通信することもできるようになりました。
TanakaRobo 7:4ad54efe2fdd 32 *このライブラリでは同時に2個シリアルポートを開いていますが、それぞれport1,port2としてアクセスできます。
TanakaRobo 8:82727add54ce 33 *シリアルポートを1つだけ開いているときは、port1とport2,send1とsend2は同じモノ扱いになります。
TanakaRobo 12:7f0b6e7b9626 34 *sendのレスポンスはgetResponseがtrueの時に、receiveDataの返り値として知ることができます。
TanakaRobo 10:25af94dd1668 35 *isWaitingで、今レスポンス待ち状態かどうか知ることができます。
TanakaRobo 10:25af94dd1668 36 *レスポンス受信前に他の命令などを受信するとレスポンス待ちはキャンセルされます。
TanakaRobo 10:25af94dd1668 37 *両方引数は0か1で、どちらのシリアルポートかを指定します。
TanakaRobo 11:eaf2e3166d20 38 *レスポンスを受信した時に割り込みで呼ばれる関数を設定することができます。
TanakaRobo 10:25af94dd1668 39 *void型。引数は(uint8_t id, uint8_t cmd, int16_t res)です。
TanakaRobo 12:7f0b6e7b9626 40 *attachResponseで関数を指定してください。
TanakaRobo 11:eaf2e3166d20 41 *
TanakaRobo 11:eaf2e3166d20 42 *クラス内のシリアルポートに.port1 .port2という形でアクセスできます。
TanakaRobo 7:4ad54efe2fdd 43 *printfしたいときなどは、
TanakaRobo 11:eaf2e3166d20 44 *<obj>.port2.printf("hello\n");
TanakaRobo 7:4ad54efe2fdd 45 *と書くことできます。
TanakaRobo 8:82727add54ce 46 *また、writeable(),putc()でデータを送信することができますが、LTC485使用時はREDEピンを別に制御する必要があります。
TanakaRobo 11:eaf2e3166d20 47 *その他Serialクラスに存在する機能すべてにアクセスできますが、このライブラリで受信データをすべて処理しているので、
TanakaRobo 11:eaf2e3166d20 48 *getc()などで個別に取り出すことはできません。
TanakaRobo 7:4ad54efe2fdd 49 *シリアルのボーレートは基本的に変更しないでください。
TanakaRobo 8:82727add54ce 50 *readable(),getc()は使わないでください。正常に動作しません。
TanakaRobo 8:82727add54ce 51 *また、受信・送信割り込みの設定は行わないでください。ライブラリが正常に動作しません。
TanakaRobo 0:ca84ed7518f5 52 */
TanakaRobo 7:4ad54efe2fdd 53 //ScrpSlave slave(SERIAL_TX,SERIAL_RX, 3); 3がそのままidとして使われる。
TanakaRobo 7:4ad54efe2fdd 54 //ScrpSlave slave(PC_12,PD_2 ,PH_1 ,SERIAL_TX,SERIAL_RX,0x0807f800); フラッシュメモリーの0x0807f800番地にidが保存される。
TanakaRobo 13:77c13e86ad12 55 //ScrpSlave slave(PA_9 ,PA_10,PA_12,SERIAL_TX,SERIAL_RX,0x0803f800);
TanakaRobo 4:39ef4d91dc34 56 //ScrpSlave slave(PD_5 ,PD_6,PD_7,SERIAL_TX,SERIAL_RX,0x081ee000);
TanakaRobo 11:eaf2e3166d20 57 //ScrpSlave slave(PC_12,PD_2 ,PH_1 ,SERIAL_TX,SERIAL_RX,0x0807f800,false);//rtos使用時や3ポート以上開き割り込みを無効にするとき。
TanakaRobo 11:eaf2e3166d20 58
TanakaRobo 0:ca84ed7518f5 59
TanakaRobo 0:ca84ed7518f5 60 inline int constrain(int x,int a,int b){
TanakaRobo 0:ca84ed7518f5 61 return (x < a ? a : x > b ? b : x);
TanakaRobo 0:ca84ed7518f5 62 }
TanakaRobo 0:ca84ed7518f5 63
TanakaRobo 0:ca84ed7518f5 64 inline double constrain(double x,double a,double b){
TanakaRobo 0:ca84ed7518f5 65 return (x < a ? a : x > b ? b : x);
TanakaRobo 0:ca84ed7518f5 66 }
TanakaRobo 0:ca84ed7518f5 67
TanakaRobo 0:ca84ed7518f5 68 class ScrpSlave{
TanakaRobo 0:ca84ed7518f5 69 public:
TanakaRobo 11:eaf2e3166d20 70 ScrpSlave(PinName TX1,PinName RX1,uint32_t addr,bool interrupt = true);//RedePinなし、1ポート
TanakaRobo 11:eaf2e3166d20 71 ScrpSlave(PinName TX1,PinName RX1,PinName REDE1,uint32_t addr,bool interrupt = true);//RedePinあり、1ポート
TanakaRobo 11:eaf2e3166d20 72 ScrpSlave(PinName TX1,PinName RX1,PinName TX2,PinName RX2,uint32_t addr,bool interrupt = true);//RedePinなし、2ポート
TanakaRobo 11:eaf2e3166d20 73 ScrpSlave(PinName TX1,PinName RX1,PinName REDE1,PinName TX2,PinName RX2,uint32_t addr,bool interrupt = true);//RedePinあり、1ポート+RedePinなし、1ポート
TanakaRobo 0:ca84ed7518f5 74 ~ScrpSlave();
TanakaRobo 9:9f43b2ead060 75 RawSerial port1;
TanakaRobo 9:9f43b2ead060 76 RawSerial port2;
TanakaRobo 0:ca84ed7518f5 77 void addCMD(uint8_t cmd, bool (*proc)(int rx_data,int& tx_data));
TanakaRobo 12:7f0b6e7b9626 78 void attachResponse(void (*func)(uint8_t id, uint8_t cmd, int16_t response));//レスポンス受信割り込み関数
TanakaRobo 11:eaf2e3166d20 79 void receive();//割り込みを無効にしたときにこれを繰り返し呼び出して受信する。
TanakaRobo 11:eaf2e3166d20 80 bool send1(uint8_t id, uint8_t cmd, int16_t tx_data, bool flag = true);//返り値 成功:true 失敗:false
TanakaRobo 11:eaf2e3166d20 81 bool send2(uint8_t id, uint8_t cmd, int16_t tx_data, bool flag = true);//レスポンスを待つか、待たないかのflag
TanakaRobo 5:a7894e6982ea 82 bool isWaiting(uint8_t port);//send,send2の通信のレスポンス待ち状況確認。
TanakaRobo 12:7f0b6e7b9626 83 bool getResponse(uint8_t port);//レスポンスを受信したらtrueになる。
TanakaRobo 8:82727add54ce 84 int16_t receiveData(uint8_t port);//0か1か send1のレスポンスは0、send2のレスポンスは1を指定。データがない時は-1を返す。
TanakaRobo 11:eaf2e3166d20 85 uint8_t receiveId();//直前の通信で送られてきたidを返す。
TanakaRobo 11:eaf2e3166d20 86 uint8_t receiveCmd();//直前の通信で送られてきたCMD番号を返す。割り込み関数内でCMDを知りたいときに有効。
TanakaRobo 11:eaf2e3166d20 87 uint8_t receivePort();//直前の通信で受信したポートを返す。
TanakaRobo 0:ca84ed7518f5 88 private:
TanakaRobo 0:ca84ed7518f5 89 DigitalOut *rede_;
TanakaRobo 7:4ad54efe2fdd 90 FlashIAP *flash_;
TanakaRobo 9:9f43b2ead060 91 RawSerial *serial_[2];
TanakaRobo 2:141358d84ff4 92 uint8_t send_data_[2][8];
TanakaRobo 0:ca84ed7518f5 93 uint8_t mode_;
TanakaRobo 0:ca84ed7518f5 94 uint8_t my_id_;
TanakaRobo 11:eaf2e3166d20 95 uint8_t rx_cmd_;
TanakaRobo 11:eaf2e3166d20 96 uint8_t rx_id_;
TanakaRobo 11:eaf2e3166d20 97 uint8_t receive_port_;
TanakaRobo 0:ca84ed7518f5 98 uint32_t address_;
TanakaRobo 11:eaf2e3166d20 99 bool all_receive_;
TanakaRobo 11:eaf2e3166d20 100 bool interrupt_;
TanakaRobo 2:141358d84ff4 101 bool wait_data_[2];
TanakaRobo 12:7f0b6e7b9626 102 bool get_response_[2];
TanakaRobo 2:141358d84ff4 103 bool stx_flag_[2];
TanakaRobo 2:141358d84ff4 104 bool id_ok_[2];
TanakaRobo 2:141358d84ff4 105 uint8_t tmp_data_[2][5];
TanakaRobo 2:141358d84ff4 106 uint8_t data_count_[2];
TanakaRobo 2:141358d84ff4 107 int16_t rx_data_[2];
TanakaRobo 12:7f0b6e7b9626 108 void (*responseFunc_)(uint8_t id, uint8_t cmd, int16_t response);
TanakaRobo 0:ca84ed7518f5 109 bool (*procs_[256])(int rx_data, int& tx_data);
TanakaRobo 11:eaf2e3166d20 110 bool sending(int, uint8_t, uint8_t, int16_t, bool = true);
TanakaRobo 11:eaf2e3166d20 111 void sendNoInterrupt(uint8_t port);
TanakaRobo 0:ca84ed7518f5 112 void changeID(uint8_t);
TanakaRobo 7:4ad54efe2fdd 113 void init();
TanakaRobo 0:ca84ed7518f5 114 void check(int port);
TanakaRobo 8:82727add54ce 115 void receive0();
TanakaRobo 7:4ad54efe2fdd 116 void receive1();
TanakaRobo 10:25af94dd1668 117 void dataSend0();
TanakaRobo 10:25af94dd1668 118 void dataSend1();
TanakaRobo 2:141358d84ff4 119 void prime(int);
TanakaRobo 0:ca84ed7518f5 120 };
TanakaRobo 0:ca84ed7518f5 121
TanakaRobo 0:ca84ed7518f5 122 #endif /* SCRP_SLAVE_H */