master
Teuniz 2025-07-07 09:37:02 +02:00
rodzic d0e8cc25bd
commit b290debcfe
2 zmienionych plików z 143 dodań i 43 usunięć

Wyświetl plik

@ -59,7 +59,7 @@
#define PROGRAM_NAME "DSRemote"
#define PROGRAM_VERSION "0.45_2507051510"
#define PROGRAM_VERSION "0.46_2507070936"
#define MAX_PATHLEN (1024)

184
tmc_dev.c
Wyświetl plik

@ -205,7 +205,7 @@ int tmcdev_write(struct tmcdev *dev, const char *cmd)
/*
* TMC Blockheader ::= #NXXXXXX: is used to describe
* TMC Blockheader #NXXXXXX is used to describe
* the length of the data stream, wherein, # is the start denoter of
* the data stream; N is less than or equal to 9; the N figures
* followed N represents the length of the data stream in bytes.
@ -217,9 +217,9 @@ int tmcdev_write(struct tmcdev *dev, const char *cmd)
*/
int tmcdev_read(struct tmcdev *dev)
{
int size, size2, len;
int n, hdr_type_block=1, size=0, num_len=0, payload_sz=0, pkt_sz=0;
char blockhdr[32];
char arr[16];
if(dev == NULL)
{
@ -230,7 +230,61 @@ int tmcdev_read(struct tmcdev *dev)
dev->sz = 0;
size = read(dev->fd, dev->hdrbuf, MAX_RESP_LEN);
for(int i=0; ; i++)
{
n = read(dev->fd, dev->hdrbuf + size, MAX_RESP_LEN - size);
// fprintf(stderr, "tmcdev_read(): loop: %i n: %i\n", i, n);
if(n < 0)
{
if(errno == EAGAIN)
{
continue;
}
else
{
perror(NULL);
return -2;
}
}
size += n;
if(hdr_type_block)
{
if(dev->hdrbuf[0] != '#') hdr_type_block = 0;
}
if(hdr_type_block && !pkt_sz && (size > 2))
{
num_len = dev->hdrbuf[1] - '0';
if((num_len < 1) || (num_len > 9)) return -1;
if(size > num_len + 2)
{
memcpy(arr, dev->hdrbuf + 2, num_len);
arr[num_len] = 0;
payload_sz = atoi(arr);
pkt_sz = payload_sz + num_len + 3; /* #NXXX....payload...\n */
// fprintf(stderr, "size: %i pkt_sz: %i\n", size, pkt_sz);
}
}
if(pkt_sz && (pkt_sz == size) && (dev->hdrbuf[size - 1] == '\n'))
{
// fprintf(stderr, "size: %i pkt_sz: %i\n", size, pkt_sz);
break;
}
if(!hdr_type_block && (dev->hdrbuf[size - 1] == '\n'))
{
break;
}
}
if((size < 2) || (size > MAX_RESP_LEN))
{
@ -238,12 +292,12 @@ int tmcdev_read(struct tmcdev *dev)
dev->buf[0] = 0;
return -2;
return -3;
}
dev->hdrbuf[size] = 0;
if(dev->hdrbuf[0] != '#')
if(!hdr_type_block)
{
if(dev->hdrbuf[size - 1] == '\n')
{
@ -257,48 +311,94 @@ int tmcdev_read(struct tmcdev *dev)
return dev->sz;
}
strncpy(blockhdr, dev->hdrbuf, 16);
if((num_len < 1) || (num_len > 9)) return -1;
len = blockhdr[1] - '0';
size--; /* remove the last character ('\n') */
if((len < 1) || (len > 9))
{
blockhdr[31] = 0;
if(size <= payload_sz) return -1;
return -3;
}
dev->buf = dev->hdrbuf + num_len + 2;
blockhdr[len + 2] = 0;
size2 = atoi(blockhdr + 2);
while(size < size2 && size<MAX_RESP_LEN) // we did not get all the data
{
ssize_t read_size = read(dev->fd, &dev->hdrbuf[size], MAX_RESP_LEN - size);
if(read_size < 1) // timeout or error occurred
{
blockhdr[31] = 0;
return -4;
}
size += read_size;
}
size--; // remove the last character
if(size < size2)
{
blockhdr[31] = 0;
return -5;
}
dev->buf = dev->hdrbuf + len + 2;
dev->sz = size2;
dev->sz = payload_sz;
return dev->sz;
// size = read(dev->fd, dev->hdrbuf, MAX_RESP_LEN);
//
// if((size < 2) || (size > MAX_RESP_LEN))
// {
// dev->hdrbuf[0] = 0;
//
// dev->buf[0] = 0;
//
// return -2;
// }
//
// dev->hdrbuf[size] = 0;
//
// if(dev->hdrbuf[0] != '#')
// {
// if(dev->hdrbuf[size - 1] == '\n')
// {
// dev->hdrbuf[--size] = 0;
// }
//
// dev->buf = dev->hdrbuf;
//
// dev->sz = size;
//
// return dev->sz;
// }
//
// strncpy(blockhdr, dev->hdrbuf, 16);
//
// len = blockhdr[1] - '0';
//
// if((len < 1) || (len > 9))
// {
// blockhdr[31] = 0;
//
// return -3;
// }
//
// blockhdr[len + 2] = 0;
//
// size2 = atoi(blockhdr + 2);
//
// int loop=0;
//
// while(size < size2 && size<MAX_RESP_LEN) // we did not get all the data
// {
// ssize_t read_size = read(dev->fd, &dev->hdrbuf[size], MAX_RESP_LEN - size);
//
// fprintf(stderr, "tmcdev_read(): loop: %i n: %i\n", i, n);
//
// if(read_size < 1) // timeout or error occurred
// {
// blockhdr[31] = 0;
//
// return -4;
// }
//
// size += read_size;
//
// loop++;
// }
//
// size--; // remove the last character
//
// if(size < size2)
// {
// blockhdr[31] = 0;
//
// return -5;
// }
//
// dev->buf = dev->hdrbuf + len + 2;
//
// dev->sz = size2;
//
// return dev->sz;
}