kopia lustrzana https://gitlab.com/Teuniz/DSRemote
Minor bugfix.
rodzic
d0e8cc25bd
commit
b290debcfe
2
global.h
2
global.h
|
@ -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
184
tmc_dev.c
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue