SerialLibrary for arrc

goto_serial.hpp

Committer:
hamohamo
Date:
2021-12-11
Revision:
0:4801795a9073

File content as of revision 0:4801795a9073:

#ifndef _52SERIAL
#define _52SERIAL

#include "mbed.h"
#include "Buffer52.hpp"
/*
使用方法
ARRC::gotoSerial ser(PC_12,PD_2,9600);
DigitalOut rede(PH_1);
送信側 rede = 1;
受信側 rede = 0;

publish(id,送信する値,INT or FLOAT or FUNC(送信する型の指定));
INT,FLOAT 送信と受信でなるべく合わせること。
FUNC 受信側で設定した関数に値を引数として送信する。
subscribe(id,変数または関数のポインタ(例 &value , func));

受信側の関数(scrp_slaveでいうところのコマンド)の宣言方法

void func(Pack data){
    printf("subscribed_int:%d\n",data.integer);
    printf("subscribed_float:%d\n",data.decimal);
    led = !led;
}
ToDo
redeを組み込む
送受信可能にする
*/

namespace ARRC{

const unsigned STARTDATA = 0x01;
const unsigned ENDDATA = 0x09;
const unsigned INT = 1;
const unsigned FLOAT = 2;
const unsigned FUNC = 3;

typedef union {
    float decimal;
    int integer;
} Pack;

typedef void (*Func)(Pack data);

typedef union {
    float* decimal;
    int* integer;
} DATA;

class gotoSerial{
public:
    gotoSerial(PinName tx,PinName rx,int baudrate);
    bool publish(unsigned id,int num,unsigned type);
    bool publish(unsigned id,float num,unsigned type);
    bool subscribe(unsigned id,int* var);
    bool subscribe(unsigned id,float* var);
    bool subscribe(unsigned id,Func func);
private:
    void interrupt_read();
    bool update();
    int sub_vars_size;
    std::vector<DATA> sub_vars;
    std::vector<Func> sub_funcs;
    Buffer<int8_t> buf;
    Serial ser;
};

}

#endif