zynq_7010/zynq_7010_code/seria_com.cpp

111 lines
2.7 KiB
C++

#include <seria_com.h>
#define SERIAL_PORT "/dev/ttyPS1"
seria_com::seria_com(BlockingQueue<ScanEvent>& sysEvents):events(sysEvents)
{
serialib_.reset(new serialib);
if (!serialib_.get())
{
return;
}
int ret = serialib_->openDevice(SERIAL_PORT,19200);
if(ret != 1) return ;
printf("Ok To Open Port: %s \r\n", SERIAL_PORT);
thread_seria = std::thread(&seria_com::thread_seria_com,this);
}
seria_com::~seria_com()
{
}
void seria_com::thread_seria_com()
{
std::vector<uint8_t> buf;
while (serialib_.get())
{
if (serialib_->waitAvailable(100) >= 0)
{
buf.resize(serialib_->available());
serialib_->readBytes((void *)buf.data(), buf.size(), 0, 0);
parse_com_data(buf.data(),buf.size());
}
}
}
void seria_com::parse_com_data(uint8_t *buf,size_t len)
{
std::vector<uint8_t> vec;
vec.resize(len);
vec.push_back(HG_SERIA_PROTOCOL_ERROR);
if (len != 3 )
{
printf("协议数量错误!!!\r\n");
cc_seria_send(vec.data(),vec.size());
return ;
}
seria_parse_data parse;
int c = buf[0] << 11 ;
int d = c | buf[1] ;
printf("d :%d %x\r\n",d, d);
parse.valua = d << 5 | buf[2];
ScanEvent e;
printf("parse.bit.event:%d data :%d\r\n",parse.bit.event,parse.bit.data);
switch (parse.bit.event)
{
case HG_EVT_SERIA_SET_SPEED:
e = seria_to_hgevt((seria_protocol)parse.bit.data);
if (e == HG_EVT_SERIA_PROTOCOL_ERROR)
{
cc_seria_send(vec.data(),vec.size());
break;
}
events.Put(e);
break;
case HG_EVT_SERIA_START_FEEDING:
case HG_EVT_SERIA_STOP_FEEDING:
case HG_EVT_SERIA_GET_STATUS:
if (parse.bit.data != HG_SERIA_PROTOCOL_OK)
{
cc_seria_send(vec.data(),vec.size());
break;
}
events.Put((ScanEvent)parse.bit.event);
break;
default:
cc_seria_send(vec.data(),vec.size());
break;
}
printf("协议 READ :%d %x\r\n",parse.valua,parse.valua);
}
void seria_com::cc_seria_send(void * data,int len)
{
serialib_->writeBytes(data, len);
}
ScanEvent seria_com::seria_to_hgevt(seria_protocol p)
{
switch (p)
{
case HG_SERIA_SPEED_MODE_1:
return HG_EVT_SERIA_SPEED_MODE_1;
case HG_SERIA_SPEED_MODE_2:
return HG_EVT_SERIA_SPEED_MODE_2;
case HG_SERIA_SPEED_MODE_3:
return HG_EVT_SERIA_SPEED_MODE_3;
case HG_SERIA_SPEED_MODE_4:
return HG_EVT_SERIA_SPEED_MODE_4;
case HG_SERIA_SPEED_MODE_5:
return HG_EVT_SERIA_SPEED_MODE_5;
default:
return HG_EVT_SERIA_PROTOCOL_ERROR;
}
}