明石高専ロボ研 mbedライブラリ
Dependencies: mbed
scrp_slave.hpp@10:25af94dd1668, 2021-02-25 (annotated)
- 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?
User | Revision | Line number | New 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 */ |