📄 filer.c
字号:
if(GetByte(port, &data, &Checksum)==TIMEOUT) return TIMEOUT;
pPacket->Count = data;
/* get packet status */
if(GetByte(port, &data, &Checksum)==TIMEOUT) return TIMEOUT;
pPacket->Status = data;
/* get data marker */
if(GetByte(port, &data, &Checksum)==TIMEOUT) return TIMEOUT;
if(data != 0x02) return BAD_PACKET;
/* server replies */
switch(pPacket->Function) {
/* replies */
case CONNECT_SERVER:
case DISCONNECT_SERVER:
/* data end marker */
if(GetByte(port, &data, &Checksum)==TIMEOUT) return TIMEOUT;
if(data) return BAD_PACKET;
if(GetByte(port, &data, &Checksum)==TIMEOUT) return TIMEOUT;
if(data) return BAD_PACKET;
break;
case MAKE_DIR:
case DEL_DIR:
case DEL_FILE:
case SEND_PATH:
case SEND_FILENAME:
case GET_FILENAME:
case SEND_DATA:
/* get data marker and size MSB (always 0) */
for(f=0;f<4;f++) {
if(GetByte(port, &data, &Checksum)==TIMEOUT) return TIMEOUT;
if(data) return BAD_PACKET;
}
/* get data size */
if(GetByte(port, &data, &Checksum)==TIMEOUT) return TIMEOUT;
sizelo = data;
if(GetByte(port, &data, &Checksum)==TIMEOUT) return TIMEOUT;
sizehi = data;;
pPacket->Size = (sizehi * 256) + sizelo;
break;
case DATA_END:
case INIT_GET:
case ASK_DIR:
/* get data size & end marker (6 bytes) */
for(f=0;f<6;f++) {
if(GetByte(port, &data, &Checksum)==TIMEOUT) return TIMEOUT;
if(data) return BAD_PACKET;
}
break;
/* data retreival */
case GET_DATA:
/* get data marker and size MSB (always 0) */
for(f=0;f<4;f++) {
if(GetByte(port, &data, &Checksum)==TIMEOUT) return TIMEOUT;
if(data) return BAD_PACKET;
}
/* get data size */
if(GetByte(port, &data, &Checksum)==TIMEOUT) return TIMEOUT;
sizelo = data;
if(GetByte(port, &data, &Checksum)==TIMEOUT) return TIMEOUT;
sizehi = data;;
pPacket->Size = (sizehi * 256) + sizelo;
for(f=0; f<pPacket->Size; f++) {
if(GetByte(port, &pPacket->pData[f], &Checksum)==TIMEOUT)
return TIMEOUT;
}
break;
case GET_DIR:
/* get data marker and size MSB (always 0) */
for(f=0;f<4;f++) {
if(GetByte(port, &data, &Checksum)==TIMEOUT) return TIMEOUT;
if(data) return BAD_PACKET;
}
/* get data size */
if(GetByte(port, &data, &Checksum)==TIMEOUT) return TIMEOUT;
sizelo = data;
if(GetByte(port, &data, &Checksum)==TIMEOUT) return TIMEOUT;
sizehi = data;;
pPacket->Size = (sizehi * 256) + sizelo;
for(f=0; f<pPacket->Size; f++) {
if(GetByte(port, &pPacket->pData[f], &Checksum)==TIMEOUT)
return TIMEOUT;
}
/* special 'dir' data end marker */
if(GetByte(port, &data, &Checksum)==TIMEOUT) return TIMEOUT;
if(data!=0x01) return BAD_PACKET;
if(GetByte(port, &data, &Checksum)==TIMEOUT) return TIMEOUT;
if(data) return BAD_PACKET;
if(GetByte(port, &data, &Checksum)==TIMEOUT) return TIMEOUT;
if(data) return BAD_PACKET;
if(GetByte(port, &data, &Checksum)==TIMEOUT) return TIMEOUT;
if(data) return BAD_PACKET;
break;
default:
return INVALID_FUNCTION;
}
/* get CRC Marker (no CRC on the next byte!) */
if(GetByte(port, &data, NULL)==TIMEOUT) return TIMEOUT;
if(data != 0x10) return BAD_PACKET;
if(GetByte(port, &data, &Checksum)==TIMEOUT) return TIMEOUT;
if(data != 0x03) return BAD_PACKET;
/* get received CRC */
if(GetByte(port, &data, NULL)==TIMEOUT) return TIMEOUT;
crclo = data;
if(GetByte(port, &data, NULL)==TIMEOUT) return TIMEOUT;
crchi = data;
pPacket->CRC16 = (crchi * 256) + crclo;
/* check if CRC is good */
if(pPacket->CRC16 != Checksum) return BAD_CRC;
#ifdef DEBUG_FILER
printf("\n\nGOT PACKET# : 0x%X\n", pPacket->Count);
printf("GOT Function: 0x%X\n", pPacket->Function);
printf("GOT Status : 0x%X\n", pPacket->Status);
printf("GOT Size : 0x%X\n", pPacket->Size);
#endif
return PACKET_RECVD;
}
/* --------------------------------------------------------------------
Talk (handshake) with server
-------------------------------------------------------------------- */
int FilerRequest(FILERCOM *pFiler, int Request, WORD Size, BYTE *pData)
{
int attempt = 0, stat;
WORD Count;
Count = pFiler->Count;
/* packet handshake */
while(attempt<NUM_OF_ATTEMPTS) {
SendPacket(pFiler, Request, Count, Size, pData);
stat=GetPacket(pFiler);
if(stat==PACKET_RECVD) break;
attempt++;
}
if(attempt==NUM_OF_ATTEMPTS) return NO_RESPONSE;
if(pFiler->Function != (BYTE)Request) return BAD_REQUEST;
if(pFiler->Count != Count) return BAD_PACKET_COUNT;
/* update packet counter */
Count++;
pFiler->Count = Count;
return SERVER_ACK; /* client <> server agree */
}
/* --------------------------------------------------------------------
Open Filer communications
-------------------------------------------------------------------- */
FILERCOM *FilerConnect(int PortNumber, unsigned long BaudRate, FLCB *pCb)
{
int f;
FILERCOM *pFiler;
char ttyname[20];
unsigned static long BaudTable[]= {
0,115200L,57600L,38400L,19200L,9600L,4800L,2400L,1200L,INV_BAUDRATE
};
/* check if PortNumber is valid (valid= 1 to 4) */
if((PortNumber > 4)||(PortNumber ==0))
{
close(ttyfd);
return 0;
}
/* check for valid baud-rate */
for(f=0;f<10;f++) {
if(BaudRate == BaudTable[f]) break;
}
if(BaudTable[f]==INV_BAUDRATE)
{
close(ttyfd);
return 0; /* invalid baudrate */
}
sprintf(ttyname, "%s%c", SERIAL_NAME, SERIAL_FIRST + PortNumber - 1);
ttyfd = open(ttyname, O_RDWR);
if (ttyfd < 0)
{
printf("Cannot open %s\n", ttyname);
return 0;
}
signal(SIGALRM, alarm_handler);
/* allocate packet storage */
if(!(pFiler = malloc(sizeof(FILERCOM)))) return 0;
/* packet structure defaults */
pFiler->pData=0;
pFiler->Function=0;
pFiler->Count=0;
pFiler->Status=0;
pFiler->CRC16=0;
pFiler->Port=0; /* no port address for Unix */
pFiler->pCb = pCb;
/* allocate data buffer storage */
if(!(pFiler->pData = malloc(sizeof(FILERCOM)+PACKET_DATA_SIZE+100)))
{
close(ttyfd);
return 0;
}
if(!BaudRate) {
timeout_secs = TIMEOUT_AUTO;
/* Determine baudrate automatically if given baudrate == 0 */
for(f=1;f<10;f++) {
/* no response from server */
if(BaudTable[f]==INV_BAUDRATE) {
free(pFiler->pData);
free(pFiler);
close(ttyfd);
return 0;
}
pFiler->Baud = BaudTable[f];
close(ttyfd);
SetBaudRate(ttyname, pFiler->Baud);
ttyfd = open(ttyname, O_RDWR);
if (ttyfd < 0) return 0;
/* try 2 attempts */
SendPacket(pFiler, CONNECT_SERVER, 0,0, NULL);
if(GetPacket(pFiler)==PACKET_RECVD) break;
SendPacket(pFiler, CONNECT_SERVER, 0,0, NULL);
if(GetPacket(pFiler)==PACKET_RECVD) break;
}
}
else {
pFiler->Baud=BaudRate;
close(ttyfd);
SetBaudRate(ttyname, BaudRate);
ttyfd = open(ttyname, O_RDWR);
if (ttyfd < 0) return 0;
}
timeout_secs = TIMEOUT_NORMAL;
if(FilerRequest(pFiler, CONNECT_SERVER, 0, NULL) == NO_RESPONSE) {
free(pFiler->pData);
free(pFiler);
close(ttyfd);
return 0;
}
return pFiler;
}
/* --------------------------------------------------------------------
CloseServer channel (disconnect)
-------------------------------------------------------------------- */
int FilerDisconnect(FILERCOM *pFiler)
{
if(!pFiler) return SERVER_CLOSED;
pFiler->Count=0;
if(FilerRequest(pFiler, DISCONNECT_SERVER, 0, NULL) == NO_RESPONSE) {
return NO_RESPONSE;
}
free(pFiler->pData);
free(pFiler);
close(ttyfd);
return SERVER_CLOSED;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -