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

Dependencies:   mbed

Committer:
TanakaRobo
Date:
Thu Feb 25 07:20:15 2021 +0000
Revision:
10:25af94dd1668
Parent:
9:9f43b2ead060
Child:
11:eaf2e3166d20
responce interrupt

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 0:ca84ed7518f5 7 *以下から選択。
TanakaRobo 0:ca84ed7518f5 8 *ScrpSlave(PinName TX1,PinName RX1,uint32_t addr);//RedePinなし、1ポート
TanakaRobo 0:ca84ed7518f5 9 *ScrpSlave(PinName TX1,PinName RX1,PinName REDE1,uint32_t addr);//RedePinあり、1ポート
TanakaRobo 0:ca84ed7518f5 10 *ScrpSlave(PinName TX1,PinName RX1,PinName TX2,PinName RX2,uint32_t addr);//RedePinなし、2ポート
TanakaRobo 0:ca84ed7518f5 11 *ScrpSlave(PinName TX1,PinName RX1,PinName REDE1,PinName TX2,PinName RX2,uint32_t addr);//RedePinあり、1ポート+RedePinなし、1ポート
TanakaRobo 0:ca84ed7518f5 12 *example not usb port
TanakaRobo 0:ca84ed7518f5 13 *L432KC : TX = PA_9 , RX = PA_10 , REDE = PA_12 , addr = 0x0803e000
TanakaRobo 10:25af94dd1668 14 *F446RE : TX = PC_12 , RX = PD_2 , RDDE = PH_1 , addr = 0x0807f800
TanakaRobo 4:39ef4d91dc34 15 *H743ZI : TX = PD_5 , RX = PD_6 , REDE = PD_7 , addr = 0x081ee000
TanakaRobo 3:28c77df7c0b6 16 *<obj>.addCMD(int cmd, bool (*proc)(int rx_data, int& tx_data))
TanakaRobo 3:28c77df7c0b6 17 *でcmdで指定したコマンドを受信したときに呼び出される
TanakaRobo 3:28c77df7c0b6 18 *bool型で引数が(int rx_data, int& tx_data)の関数を指定する。
TanakaRobo 5:a7894e6982ea 19 *addrで指定されたフラッシュメモリーのアドレスに通信で使う1バイトのアドレスが保存される。
TanakaRobo 5:a7894e6982ea 20 *addrに0から254までの値を入れて、この値そのものをidとして通信で使うこともできる。
TanakaRobo 5:a7894e6982ea 21 *
TanakaRobo 5:a7894e6982ea 22 *このライブラリでは、シリアル送信、受信とも割り込みを利用しています。
TanakaRobo 5:a7894e6982ea 23 *Nucleoはシリアル通信割り込みを同時に2ポートまでしか利用できません。
TanakaRobo 5:a7894e6982ea 24 *このライブラリでシリアルポートを2ポート開いた場合、それ以外のシリアル通信で割り込みを利用できないので注意してください。
TanakaRobo 7:4ad54efe2fdd 25 *
TanakaRobo 7:4ad54efe2fdd 26 *シリアルポートに外部からアクセスして通信することもできるようになりました。
TanakaRobo 7:4ad54efe2fdd 27 *このライブラリでは同時に2個シリアルポートを開いていますが、それぞれport1,port2としてアクセスできます。
TanakaRobo 8:82727add54ce 28 *シリアルポートを1つだけ開いているときは、port1とport2,send1とsend2は同じモノ扱いになります。
TanakaRobo 10:25af94dd1668 29 *sendのレスポンスはisResponceがtrueの時に、receiveDataの返り値として知ることができます。
TanakaRobo 10:25af94dd1668 30 *isWaitingで、今レスポンス待ち状態かどうか知ることができます。
TanakaRobo 10:25af94dd1668 31 *レスポンス受信前に他の命令などを受信するとレスポンス待ちはキャンセルされます。
TanakaRobo 10:25af94dd1668 32 *両方引数は0か1で、どちらのシリアルポートかを指定します。
TanakaRobo 10:25af94dd1668 33 *レスポンスを受信した時に割り込みで関数を作ることができます。
TanakaRobo 10:25af94dd1668 34 *void型。引数は(uint8_t id, uint8_t cmd, int16_t res)です。
TanakaRobo 10:25af94dd1668 35 *attachResponceで関数を指定してください。
TanakaRobo 7:4ad54efe2fdd 36 *printfしたいときなどは、
TanakaRobo 8:82727add54ce 37 *<obj>.port1.printf("hello\n");
TanakaRobo 7:4ad54efe2fdd 38 *と書くことできます。
TanakaRobo 8:82727add54ce 39 *また、writeable(),putc()でデータを送信することができますが、LTC485使用時はREDEピンを別に制御する必要があります。
TanakaRobo 8:82727add54ce 40 *その他Serialクラスに存在する機能すべてにアクセスできますが、このライブラリないで受信データをすべて処理しているので、個別に取り出すことはできません。
TanakaRobo 7:4ad54efe2fdd 41 *シリアルのボーレートは基本的に変更しないでください。
TanakaRobo 8:82727add54ce 42 *readable(),getc()は使わないでください。正常に動作しません。
TanakaRobo 8:82727add54ce 43 *また、受信・送信割り込みの設定は行わないでください。ライブラリが正常に動作しません。
TanakaRobo 0:ca84ed7518f5 44 */
TanakaRobo 7:4ad54efe2fdd 45 //ScrpSlave slave(SERIAL_TX,SERIAL_RX, 3); 3がそのままidとして使われる。
TanakaRobo 7:4ad54efe2fdd 46 //ScrpSlave slave(PC_12,PD_2 ,PH_1 ,SERIAL_TX,SERIAL_RX,0x0807f800); フラッシュメモリーの0x0807f800番地にidが保存される。
TanakaRobo 3:28c77df7c0b6 47 //ScrpSlave slave(PA_9 ,PA_10,PA_12,SERIAL_TX,SERIAL_RX,0x0803e000);
TanakaRobo 4:39ef4d91dc34 48 //ScrpSlave slave(PD_5 ,PD_6,PD_7,SERIAL_TX,SERIAL_RX,0x081ee000);
TanakaRobo 0:ca84ed7518f5 49
TanakaRobo 0:ca84ed7518f5 50 inline int constrain(int x,int a,int b){
TanakaRobo 0:ca84ed7518f5 51 return (x < a ? a : x > b ? b : x);
TanakaRobo 0:ca84ed7518f5 52 }
TanakaRobo 0:ca84ed7518f5 53
TanakaRobo 0:ca84ed7518f5 54 inline double constrain(double x,double a,double b){
TanakaRobo 0:ca84ed7518f5 55 return (x < a ? a : x > b ? b : x);
TanakaRobo 0:ca84ed7518f5 56 }
TanakaRobo 0:ca84ed7518f5 57
TanakaRobo 0:ca84ed7518f5 58 class ScrpSlave{
TanakaRobo 0:ca84ed7518f5 59 public:
TanakaRobo 0:ca84ed7518f5 60 ScrpSlave(PinName TX1,PinName RX1,uint32_t addr);//RedePinなし、1ポート
TanakaRobo 0:ca84ed7518f5 61 ScrpSlave(PinName TX1,PinName RX1,PinName REDE1,uint32_t addr);//RedePinあり、1ポート
TanakaRobo 0:ca84ed7518f5 62 ScrpSlave(PinName TX1,PinName RX1,PinName TX2,PinName RX2,uint32_t addr);//RedePinなし、2ポート
TanakaRobo 0:ca84ed7518f5 63 ScrpSlave(PinName TX1,PinName RX1,PinName REDE1,PinName TX2,PinName RX2,uint32_t addr);//RedePinあり、1ポート+RedePinなし、1ポート
TanakaRobo 0:ca84ed7518f5 64 ~ScrpSlave();
TanakaRobo 9:9f43b2ead060 65 RawSerial port1;
TanakaRobo 9:9f43b2ead060 66 RawSerial port2;
TanakaRobo 0:ca84ed7518f5 67 void addCMD(uint8_t cmd, bool (*proc)(int rx_data,int& tx_data));
TanakaRobo 10:25af94dd1668 68 void attachResponce(void (*func)(uint8_t id, uint8_t cmd, int16_t responce));//レスポンス受信割り込み関数
TanakaRobo 8:82727add54ce 69 bool send1(uint8_t id,uint8_t cmd,int16_t tx_data);//返り値 成功:true 失敗:false
TanakaRobo 5:a7894e6982ea 70 bool send2(uint8_t id,uint8_t cmd,int16_t tx_data);
TanakaRobo 5:a7894e6982ea 71 bool isWaiting(uint8_t port);//send,send2の通信のレスポンス待ち状況確認。
TanakaRobo 10:25af94dd1668 72 bool getResponce(uint8_t port);//レスポンスを受信したらtrueになる。
TanakaRobo 8:82727add54ce 73 int16_t receiveData(uint8_t port);//0か1か send1のレスポンスは0、send2のレスポンスは1を指定。データがない時は-1を返す。
TanakaRobo 0:ca84ed7518f5 74 private:
TanakaRobo 0:ca84ed7518f5 75 DigitalOut *rede_;
TanakaRobo 7:4ad54efe2fdd 76 FlashIAP *flash_;
TanakaRobo 9:9f43b2ead060 77 RawSerial *serial_[2];
TanakaRobo 2:141358d84ff4 78 uint8_t send_data_[2][8];
TanakaRobo 0:ca84ed7518f5 79 uint8_t mode_;
TanakaRobo 0:ca84ed7518f5 80 uint8_t my_id_;
TanakaRobo 0:ca84ed7518f5 81 uint32_t address_;
TanakaRobo 2:141358d84ff4 82 bool wait_data_[2];
TanakaRobo 5:a7894e6982ea 83 bool get_responce_[2];
TanakaRobo 2:141358d84ff4 84 bool stx_flag_[2];
TanakaRobo 2:141358d84ff4 85 bool id_ok_[2];
TanakaRobo 2:141358d84ff4 86 uint8_t tmp_data_[2][5];
TanakaRobo 2:141358d84ff4 87 uint8_t data_count_[2];
TanakaRobo 2:141358d84ff4 88 int16_t rx_data_[2];
TanakaRobo 10:25af94dd1668 89 void (*responceFunc_)(uint8_t id, uint8_t cmd, int16_t responce);
TanakaRobo 0:ca84ed7518f5 90 bool (*procs_[256])(int rx_data, int& tx_data);
TanakaRobo 5:a7894e6982ea 91 bool sending(int,uint8_t,uint8_t,int16_t);
TanakaRobo 0:ca84ed7518f5 92 void changeID(uint8_t);
TanakaRobo 7:4ad54efe2fdd 93 void init();
TanakaRobo 0:ca84ed7518f5 94 void check(int port);
TanakaRobo 8:82727add54ce 95 void receive0();
TanakaRobo 7:4ad54efe2fdd 96 void receive1();
TanakaRobo 10:25af94dd1668 97 void dataSend0();
TanakaRobo 10:25af94dd1668 98 void dataSend1();
TanakaRobo 2:141358d84ff4 99 void prime(int);
TanakaRobo 0:ca84ed7518f5 100 };
TanakaRobo 0:ca84ed7518f5 101
TanakaRobo 0:ca84ed7518f5 102 #endif /* SCRP_SLAVE_H */