56 #include "rnr/rnrconfig.h" 58 #include "rnr/serdev.h" 81 int HekUno::open(uint_t uHekHwVer,
const string& dev,
int baud)
83 m_uHekHwVer = uHekHwVer;
85 if( (m_fd = SerDevOpen(dev.c_str(), baud, 8,
'N', 1, 0, 0) ) == -1 )
87 LOGERROR(
"Failed to open Arduino digital I/O board");
88 return -HEK_ECODE_SYS;
91 SerDevFIFOInputFlush(m_fd);
98 LOGDIAG3(
"Opened Arduino compatible device: %s@%d", dev.c_str(), baud);
109 LOGDIAG3(
"Closed Arduino compatible device.");
117 LOGDIAG3(
"Scanning Arduino digital I/O board capabilities.");
123 for(
int i=0; i<3; ++i)
125 cmdReadFwVersion(m_nFwVer);
133 LOGDIAG3(
"Arduino firmware version %d.", m_nFwVer);
138 int HekUno::cmdReadFwVersion(
int &ver)
146 sendCommand(cmd, strlen(cmd));
148 n = recvResponse(rsp,
sizeof(rsp), 200000);
157 LOGERROR(
"Failed to read firmware version.");
158 return -HEK_ECODE_NO_EXEC;
162 byte_t HekUno::cmdReadLimits()
169 sendCommand(cmd, strlen(cmd));
171 n = recvResponse(rsp,
sizeof(rsp));
175 val = unpackHex(rsp+1);
179 LOGERROR(
"Failed to read optical limits.");
180 return -HEK_ECODE_NO_EXEC;
188 byte_t HekUno::cmdReadAux()
195 sendCommand(cmd, strlen(cmd));
197 n = recvResponse(rsp,
sizeof(rsp));
201 val = unpackHex(rsp+1);
207 int HekUno::cmdReadPin(
int id)
214 sprintf(cmd,
"!r %d\r",
id);
215 sendCommand(cmd, strlen(cmd));
217 n = recvResponse(rsp,
sizeof(rsp));
227 int HekUno::cmdWritePin(
int id,
int val)
233 sprintf(cmd,
"!w %d %d\r",
id, val? 1: 0);
234 sendCommand(cmd, strlen(cmd));
236 n = recvResponse(rsp,
sizeof(rsp));
238 if( (n < 1) || (rsp[0] !=
'@') )
240 return -HEK_ECODE_NO_EXEC;
248 int HekUno::cmdConfigPin(
int id,
char dir)
259 else if( dir ==
'o' )
265 return -HEK_ECODE_BAD_VAL;
268 sprintf(cmd,
"!c %d %d\r",
id, c);
269 sendCommand(cmd, strlen(cmd));
271 n = recvResponse(rsp,
sizeof(rsp));
273 if( (n < 1) || (rsp[0] !=
'@') )
275 return -HEK_ECODE_NO_EXEC;
283 int HekUno::cmdSetAlarmLED(
int val)
291 return cmdWritePin(5, val);
294 sprintf(cmd,
"!l 1 %d\r", val? 1: 0);
295 sendCommand(cmd, strlen(cmd));
297 n = recvResponse(rsp,
sizeof(rsp));
299 if( (n < 1) || (rsp[0] !=
'@') )
301 return -HEK_ECODE_NO_EXEC;
309 int HekUno::cmdSetStatusLED(
int val)
320 sprintf(cmd,
"!l 2 %d\r", val? 1: 0);
321 sendCommand(cmd, strlen(cmd));
323 n = recvResponse(rsp,
sizeof(rsp));
325 if( (n < 1) || (rsp[0] !=
'@') )
327 return -HEK_ECODE_NO_EXEC;
335 int HekUno::cmdSetHaltedState()
346 sendCommand(cmd, strlen(cmd));
348 n = recvResponse(rsp,
sizeof(rsp));
350 if( (n < 1) || (rsp[0] !=
'@') )
352 return -HEK_ECODE_NO_EXEC;
360 int HekUno::cmdTestInterface()
370 sendCommand(cmd, strlen(cmd));
372 n = recvResponse(rsp,
sizeof(rsp));
374 if( (n < 1) || (rsp[0] !=
'@') )
376 return -HEK_ECODE_NO_EXEC;
379 n = sscanf(&rsp[1],
"%d %d", &nOpState, &nSeqNum);
383 LOGERROR(
"Failed test of interface: bad response.");
384 return -HEK_ECODE_NO_EXEC;
387 if( nOpState != m_nFwOpState )
389 fprintf(stderr,
"ARDUINO TEST: New OpState=%d\n", m_nFwOpState);
392 if( nSeqNum != m_nFwSeqNum )
394 fprintf(stderr,
"ARDUINO TEST: Lost sync: Sequence number received=%d, " 395 "expected=%d\n", nSeqNum, m_nFwSeqNum);
398 m_nFwOpState = nOpState;
399 m_nFwSeqNum = (nSeqNum + 1) & 0xff;
405 int HekUno::cmdNull()
411 sendCommand(cmd, strlen(cmd));
413 n = recvResponse(rsp,
sizeof(rsp), 2000000);
418 int HekUno::sendCommand(
char *buf,
size_t nBytes, uint_t timeout)
420 SerDevWrite(m_fd, (byte_t *)buf, nBytes, timeout);
421 SerDevFIFOOutputDrain(m_fd);
425 int HekUno::recvResponse(
char buf[],
size_t count, uint_t timeout)
431 nBytes = SerDevReadLine(m_fd, buf, count, (
char *)
"\n\r", timeout);
434 fprintf(stderr,
"DBG - received(%zd): ", nBytes);
435 for(ssize_t i=0; i<nBytes; ++i)
437 fprintf(stderr,
"%x ", buf[i]);
439 fprintf(stderr,
"\n");
445 byte_t HekUno::unpackHex(
char buf[])
452 for(
int i=0; i<2; ++i)
455 if(buf[i] >=
'0' && buf[i] <=
'9')
460 else if (buf[i] >=
'A' && buf[i] <=
'F')
462 val += buf[i] -
'A'+10;
465 else if (buf[i] >=
'a' && buf[i] <=
'f')
467 val += buf[i] -
'a'+10;
<b><i>Hekateros</i></b> Arduino Uno compatible I/O board class interface.
Top-level package include file.
#define HEK_VERSION(major, minor, revision)
Convert version triplet to integer equivalent.
The <b><i>Hekateros</i></b> namespace encapsulates all <b><i>Hekateros</i></b> related constructs...