#ifndef transmit_h__
#define transmit_h__

#include "rtthread.h"
#include "signal.h"
#include "stdint.h"
#include "bytearray.h"


// 错误码定义
#define TRAN_ERR_NONE     0x00
#define TRAN_ERR_BUSY     0x01
#define TRAN_ERR_PARAM    0x02
#define TRAN_ERR_STEP     0x03





struct _tran_def;
typedef struct _tran_def tran_def;

typedef struct _ucport_def{
  uint8_t cmd;
  tran_def *p;
  int (*dolater)(struct _ucport_def *u,uint8_t cmd,array_def *data,char *err_str);
  void (*del)(struct _ucport_def *h);
  void (*doend)(struct _ucport_def *h,void *src,void *data,int ack,char *err_str);
}ucport_def;


typedef struct{
  ucport_def *(*creat)(tran_def *t,uint8_t cmd,array_def *data);
  uint8_t cmd;
  const char *codec_name;
}ucport_item;




#define transmit_export(codec_name_,cmd_,fun_) \
  const static char __tran_##codec_name_##cmd_##_name[] SECTION(".rodata.transtr") = #codec_name_; \
  RT_USED static ucport_item _tran_##cmd_ SECTION("transtruct")= \
  {\
    .cmd=cmd_,\
    .creat=fun_,\
    .codec_name=__tran_##codec_name_##cmd_##_name,\
  };





tran_def *tran_creat(sig_thread t);

void tran_recv_slot(tran_def *t,const char *codec_name,uint8_t cmd,array_def *data,char *err_str);

void tran_set_busy(tran_def *t,int busy);
int tran_get_busy(tran_def *t);


signal tran_reply_signal(tran_def *p,array_def *data);
signal tran_send_signal(tran_def *p,uint8_t cmd,array_def *data);





#endif

