namespace R2C2 {
Intellibox::Intellibox(const string &dev):
+ serial(dev),
power(false),
halted(false),
update_sensors(false),
command_sent(false)
{
- serial_fd = ::open(dev.c_str(), O_RDWR);
- if(serial_fd<0)
- throw Exception("Couldn't open serial port\n");
+ static unsigned baud[]= { 2400, 4800, 9600, 19200, 0 };
- static unsigned baud[]=
- {
- 2400, B2400,
- 4800, B4800,
- 9600, B9600,
- 19200, B19200,
- 0
- };
-
- termios attr;
- tcgetattr(serial_fd, &attr);
- cfmakeraw(&attr);
- attr.c_cflag |= CSTOPB;
+ serial.set_stop_bits(2);
bool ok = false;
bool p50 = false;
- for(unsigned i=0; baud[i]; i+=2)
+ for(unsigned i=0; baud[i]; ++i)
{
- cfsetospeed(&attr, baud[i+1]);
- tcsetattr(serial_fd, TCSADRAIN, &attr);
-
- write(serial_fd, "\xC4", 1);
+ serial.set_baud_rate(baud[i]);
+ serial.put('\xC4');
- pollfd pfd = { serial_fd, POLLIN, 0 };
- if(poll(&pfd, 1, 500)>0)
+ if(IO::poll(serial, IO::P_INPUT, 500*Time::msec))
{
IO::print("IB detected at %d bits/s\n", baud[i]);
char buf[2];
- p50 = (read(serial_fd, buf, 2)==2);
+ p50 = (serial.read(buf, 2)==2);
ok = true;
break;
}
throw Exception("IB not detected");
if(p50)
- write(serial_fd, "xZzA1\r", 6);
+ serial.write("xZzA1\r", 6);
command(CMD_STATUS);
}
if(!queue.empty() && command_sent)
{
- pollfd pfd = { serial_fd, POLLIN, 0 };
- if(poll(&pfd, 1, 0)>0)
+ if(IO::poll(serial, IO::P_INPUT, Time::zero))
{
process_reply(t);
queue.erase(queue.begin());
if(!queue.empty())
{
const CommandSlot &slot = queue.front();
- write(serial_fd, slot.data, slot.length);
+ serial.write(reinterpret_cast<const char *>(slot.data), slot.length);
command_sent = true;
}
}
{
for(list<CommandSlot>::iterator i=queue.begin(); i!=queue.end(); ++i)
{
- write(serial_fd, i->data, i->length);
- pollfd pfd = { serial_fd, POLLIN, 0 };
+ serial.write(reinterpret_cast<const char *>(i->data), i->length);
bool first = true;
- while(poll(&pfd, 1, (first ? -1 : 0))>0)
+ while(first ? IO::poll(serial, IO::P_INPUT) : IO::poll(serial, IO::P_INPUT, Time::zero))
{
char data[16];
- read(serial_fd, data, 16);
+ serial.read(data, 16);
first = false;
}
}
{
unsigned pos = 0;
while(pos<len)
- pos += read(serial_fd, buf+pos, len-pos);
+ pos += serial.read(reinterpret_cast<char *>(buf+pos), len-pos);
return pos;
}