[fluksod] implement spi read operation in C
This commit is contained in:
parent
aa412d1dc4
commit
d3dd4366da
|
@ -110,21 +110,8 @@ function tx(msg, cdev)
|
|||
end
|
||||
|
||||
function rx(msg, cdev)
|
||||
local sequence = {}
|
||||
|
||||
for char in function() return cdev:read(1) end do
|
||||
if char ~= '\0' then
|
||||
table.insert(sequence, char)
|
||||
else
|
||||
-- one more read to let the AVR send a second 0x00
|
||||
-- after which the AVR's state machine toggles to read mode
|
||||
cdev:read(1)
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
msg.received = {}
|
||||
msg.received.raw = table.concat(sequence)
|
||||
msg.received.raw = cdev:spiread()
|
||||
msg.received.l, msg.received.u = msg.received.raw:match('^l(%w*)%.?u(%w*)%.?$')
|
||||
|
||||
if msg.received.l ~= '' and msg.received.l:sub(1, 2) == msg.parsed[1] then
|
||||
|
|
|
@ -223,6 +223,68 @@ static int nixio_file_read(lua_State *L) {
|
|||
}
|
||||
}
|
||||
|
||||
static int nixio_file_spi_read(lua_State *L) {
|
||||
int fd = nixio__checkfd(L, 1);
|
||||
char buffer[NIXIO_BUFFERSIZE];
|
||||
int readc;
|
||||
size_t len;
|
||||
char last = 0;
|
||||
|
||||
for (size_t i = 0; i < NIXIO_BUFFERSIZE; i++) {
|
||||
do {
|
||||
readc = read(fd, buffer + i, 1);
|
||||
} while (readc == -1 && errno == EINTR);
|
||||
|
||||
if (readc < 0) {
|
||||
return nixio__perror(L);
|
||||
}
|
||||
|
||||
if (last) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (buffer[i] == 0x00) {
|
||||
len = i;
|
||||
last = 1; /* one last pass through the for loop to sync the state machine */
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/* REVISIT: a read on spidev doens't work for numbytes > 1 */
|
||||
|
||||
/* for (size_t i = 0; i < NIXIO_BUFFERSIZE; i += 2) {
|
||||
do {
|
||||
readc = read(fd, buffer + i, 2);
|
||||
} while (readc == -1 && errno == EINTR);
|
||||
|
||||
if (readc < 0) {
|
||||
return nixio__perror(L);
|
||||
}
|
||||
|
||||
if (buffer[i + 1] == 0x00) {
|
||||
len = i;
|
||||
|
||||
if (buffer[i] != 0x00) {
|
||||
len = i + 1;
|
||||
|
||||
do {
|
||||
readc = read(fd, buffer + i + 2, 1);
|
||||
} while (readc == -1 && errno == EINTR);
|
||||
|
||||
if (readc < 0) {
|
||||
return nixio__perror(L);
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
*/
|
||||
|
||||
lua_pushlstring(L, buffer, len);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int nixio_file_seek(lua_State *L) {
|
||||
int fd = nixio__checkfd(L, 1);
|
||||
|
@ -350,6 +412,7 @@ static int nixio_file__tostring(lua_State *L) {
|
|||
static const luaL_reg M[] = {
|
||||
{"write", nixio_file_write},
|
||||
{"read", nixio_file_read},
|
||||
{"spiread", nixio_file_spi_read},
|
||||
{"tell", nixio_file_tell},
|
||||
{"seek", nixio_file_seek},
|
||||
{"stat", nixio_file_stat},
|
||||
|
|
Loading…
Reference in New Issue