yotaro morizumi / Mbed 2 deprecated zoomy_customLibrary

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers scrp_slave.hpp Source File

scrp_slave.hpp

00001 #ifndef SCRP_SLAVE_H
00002 #define SCRP_SLAVE_H
00003 #include "mbed.h"
00004 
00005 /*USBでPCにつなぐポートと、基板上でRasPiとつなぐポートを同時に開く。
00006  *RedePinの有り無しの選択、ポートを一つだけ開くことも可。
00007  *bool interruptがデフォルトでtrueだが、falseを渡すことで割り込みを無効にできる。
00008  *その時は、受信のために繰り返しreceive()を呼び出す必要がある。
00009  *以下から選択。
00010  *ScrpSlave(PinName TX1,PinName RX1,uint32_t addr,bool interrupt = true);//RedePinなし、1ポート
00011  *ScrpSlave(PinName TX1,PinName RX1,PinName REDE1,uint32_t addr,bool interrupt = true);//RedePinあり、1ポート
00012  *ScrpSlave(PinName TX1,PinName RX1,PinName TX2,PinName RX2,uint32_t addr,bool interrupt = true);//RedePinなし、2ポート
00013  *ScrpSlave(PinName TX1,PinName RX1,PinName REDE1,PinName TX2,PinName RX2,uint32_t addr,bool interrupt = true);//RedePinあり、1ポート+RedePinなし、1ポート
00014  *example not usb port
00015  *L432KC : TX = PA_9 , RX = PA_10 , REDE = PA_12 , addr = 0x0803f800
00016  *F446RE : TX = PC_12 , RX = PD_2 , RDDE = PH_1 , addr = 0x0807f800
00017  *H743ZI : TX = PD_5 , RX = PD_6 , REDE = PD_7 , addr = 0x081ee000
00018  *<obj>.addCMD(int cmd, bool (*proc)(int rx_data, int& tx_data))
00019  *でcmdで指定したコマンドを受信したときに呼び出される
00020  *bool型で引数が(int rx_data, int& tx_data)の関数を指定する。
00021  *addrで指定されたフラッシュメモリーのアドレスに通信で使う1バイトのアドレスが保存される。
00022  *addrに0から254までの値を入れて、この値そのものをidとして通信で使うこともできる。
00023  *addrに255を入れると全受信モードになります。すべての受信idを自分のものとみなし応答します。
00024  *この機能はScrpSlaveの性質をよく理解したうえで使ってください。
00025  *通常のMD通信網に不注意にこれを入れると、送り返すresponseが衝突し、通信状態を悪化させます。
00026  *
00027  *このライブラリでは、シリアル送信、受信とも割り込みを利用しています。
00028  *Nucleoはシリアル通信割り込みを同時に2ポートまでしか利用できません。
00029  *このライブラリでシリアルポートを2ポート開いた場合、それ以外のシリアル通信で割り込みを利用できないので注意してください。
00030  *
00031  *シリアルポートに外部からアクセスして通信することもできるようになりました。
00032  *このライブラリでは同時に2個シリアルポートを開いていますが、それぞれport1,port2としてアクセスできます。
00033  *シリアルポートを1つだけ開いているときは、port1とport2,send1とsend2は同じモノ扱いになります。
00034  *sendのレスポンスはgetResponseがtrueの時に、receiveDataの返り値として知ることができます。
00035  *isWaitingで、今レスポンス待ち状態かどうか知ることができます。
00036  *レスポンス受信前に他の命令などを受信するとレスポンス待ちはキャンセルされます。
00037  *両方引数は0か1で、どちらのシリアルポートかを指定します。
00038  *レスポンスを受信した時に割り込みで呼ばれる関数を設定することができます。
00039  *void型。引数は(uint8_t id, uint8_t cmd, int16_t res)です。
00040  *attachResponseで関数を指定してください。
00041  *
00042  *クラス内のシリアルポートに.port1 .port2という形でアクセスできます。
00043  *printfしたいときなどは、
00044  *<obj>.port2.printf("hello\n");
00045  *と書くことできます。
00046  *また、writeable(),putc()でデータを送信することができますが、LTC485使用時はREDEピンを別に制御する必要があります。
00047  *その他Serialクラスに存在する機能すべてにアクセスできますが、このライブラリで受信データをすべて処理しているので、
00048  *getc()などで個別に取り出すことはできません。
00049  *シリアルのボーレートは基本的に変更しないでください。
00050  *readable(),getc()は使わないでください。正常に動作しません。
00051  *また、受信・送信割り込みの設定は行わないでください。ライブラリが正常に動作しません。
00052  */
00053 //ScrpSlave slave(SERIAL_TX,SERIAL_RX, 3); 3がそのままidとして使われる。
00054 //ScrpSlave slave(PC_12,PD_2 ,PH_1 ,SERIAL_TX,SERIAL_RX,0x0807f800); フラッシュメモリーの0x0807f800番地にidが保存される。
00055 //ScrpSlave slave(PA_9 ,PA_10,PA_12,SERIAL_TX,SERIAL_RX,0x0803f800);
00056 //ScrpSlave slave(PD_5 ,PD_6,PD_7,SERIAL_TX,SERIAL_RX,0x081ee000);
00057 //ScrpSlave slave(PC_12,PD_2 ,PH_1 ,SERIAL_TX,SERIAL_RX,0x0807f800,false);//rtos使用時や3ポート以上開き割り込みを無効にするとき。
00058 
00059 
00060 class ScrpSlave{
00061 public:
00062     ScrpSlave(PinName TX1,PinName RX1,uint32_t addr,bool interrupt = true);//RedePinなし、1ポート
00063     ScrpSlave(PinName TX1,PinName RX1,PinName REDE1,uint32_t addr,bool interrupt = true);//RedePinあり、1ポート
00064     ScrpSlave(PinName TX1,PinName RX1,PinName TX2,PinName RX2,uint32_t addr,bool interrupt = true);//RedePinなし、2ポート
00065     ScrpSlave(PinName TX1,PinName RX1,PinName REDE1,PinName TX2,PinName RX2,uint32_t addr,bool interrupt = true);//RedePinあり、1ポート+RedePinなし、1ポート
00066     ~ScrpSlave();
00067     RawSerial port1;
00068     RawSerial port2;
00069     void addCMD(uint8_t cmd, bool (*proc)(int rx_data,int& tx_data));
00070     void attachResponse(void (*func)(uint8_t id, uint8_t cmd, int16_t response));//レスポンス受信割り込み関数
00071     void receive();//割り込みを無効にしたときにこれを繰り返し呼び出して受信する。
00072     bool send1(uint8_t id, uint8_t cmd, int16_t tx_data, bool flag = true);//返り値 成功:true 失敗:false
00073     bool send2(uint8_t id, uint8_t cmd, int16_t tx_data, bool flag = true);//レスポンスを待つか、待たないかのflag
00074     bool isWaiting(uint8_t port);//send,send2の通信のレスポンス待ち状況確認。
00075     bool getResponse(uint8_t port);//レスポンスを受信したらtrueになる。
00076     int16_t receiveData(uint8_t port);//0か1か send1のレスポンスは0、send2のレスポンスは1を指定。データがない時は-1を返す。
00077     uint8_t receiveId();//直前の通信で送られてきたidを返す。
00078     uint8_t receiveCmd();//直前の通信で送られてきたCMD番号を返す。割り込み関数内でCMDを知りたいときに有効。
00079     uint8_t receivePort();//直前の通信で受信したポートを返す。
00080 private:
00081     DigitalOut *rede_;
00082     FlashIAP *flash_;
00083     RawSerial *serial_[2];
00084     uint8_t send_data_[2][8];
00085     uint8_t mode_;
00086     uint8_t my_id_;
00087     uint8_t rx_cmd_;
00088     uint8_t rx_id_;
00089     uint8_t receive_port_;
00090     uint32_t address_;
00091     bool all_receive_;
00092     bool interrupt_;
00093     bool wait_data_[2];
00094     bool get_response_[2];
00095     bool stx_flag_[2];
00096     bool id_ok_[2];
00097     uint8_t tmp_data_[2][5];
00098     uint8_t data_count_[2];
00099     int16_t rx_data_[2];
00100     void (*responseFunc_)(uint8_t id, uint8_t cmd, int16_t response);
00101     bool (*procs_[256])(int rx_data, int& tx_data);
00102     bool sending(int, uint8_t, uint8_t, int16_t, bool = true);
00103     void sendNoInterrupt(uint8_t port);
00104     void changeID(uint8_t);
00105     void init();
00106     void check(int port);
00107     void receive0();
00108     void receive1();
00109     void dataSend0();
00110     void dataSend1();
00111     void prime(int);
00112 };
00113 
00114 #endif /* SCRP_SLAVE_H */