/******************************************************************************/ /* Copyright 2004 MBARI - Monterey Bay Aquarium Research Institute */ /******************************************************************************/ /******************************************************************************/ /* Summary : Routines to access the inetd server application, LOBOSERV, */ /* which the SNAP2410 Access Points are configured to connect to. */ /* The inetd server is running on lepas.shore.mbari.org, with the */ /* LOBOSERV application active on port 52332 */ /* Filename : LOBOSERV.C */ /* Author : Luke Coletti */ /* Project : */ /* Version : 1.0 */ /* Compiler : Aztec C68k/ROM v5.2D */ /* Created : 02/14/05 */ /* Archived : */ /******************************************************************************/ /* Modification History: */ /* */ /******************************************************************************/ #include /* Tattletale Model 8 Definitions */ #include /* definitions and prototypes for Model 8 library */ #include /* definitions and prototypes for Model 8 library */ #include #include #include #include #include #include #include "lobo.h" #define READ_TIMEOUT 5 //in seconds #define MAX_RETRIES 5 #define MAX_CMD_RETRIES 6 extern uchar DS1994_ROM[8]; extern uchar modem_pwr; extern int tzoffset; extern long modem_baud; extern float modem_connect_secs; extern float modem_rssi_avg; extern float modem_rssi_sd; extern time_t current_time; extern time_t connect_fail_time; extern ulong connect_fail_ctr; //add send emergency message! int LinkToAccessPoint(int exitmode) { uchar Port0, Port1; char timebuf[100]; int ret; long elapsed_usecs; ldiv_t sdiv; if( UsbActive() == TRUE ){ current_time = RtcToCtm(); printfUSB("\nLinkToAccessPoint(), %s", ctime(¤t_time) ); } I2C_ReadInputPorts(&Port0, &Port1); //is the MODEM asleep ? if( Port0 & 0x04 ){ if( (ret=ModemCheckIO( modem_baud )) != TRUE ){ if( UsbActive() == TRUE ) printfUSB("\nERROR, ModemCheckIO(), RET=%d!\n", ret); ModemResetIO(PUT_MODEM_TO_SLEEP); return( ERROR ); } I2C_SetClrBitPort0(MODEM_CFG, TRUE); //set MODEM to CONFIG mode I2C_SetClrBitPort0(MODEM_RTS, TRUE); //enable MODEM transmitter SerInFlush(); I2C_SetClrBitPort0(MODEM_SLEEP, FALSE); //wake the radio up now } else{ if( UsbActive() == TRUE ) printfUSB("\nLinkToAccessPoint(), MODEM was already Awake on Entry, exiting!\n"); ModemResetIO(KEEP_MODEM_ACTIVE); return( LOBOSERV_CONNECT_BADENTRY ); } StopWatchStart(); if( (ret=ModemSeekCD()) != TRUE){ if( UsbActive() == TRUE ) printfUSB("\nLinkToAccessPoint, ERROR in ModemSeekCD(), ret = %d\n", ret); connect_fail_time = RtcToCtm(); WrDS1994Long( (ushort)CONNFAILTIME_PTR, (ulong)connect_fail_time, &DS1994_ROM[0]); ++connect_fail_ctr; WrDS1994Long( (ushort)CONNFAILCTR_PTR, (ulong)connect_fail_ctr, &DS1994_ROM[0]); //if USER mode then RESET IO going out if( exitmode == LOBOSERV_USER_MODE ) ModemResetIO( KEEP_MODEM_ACTIVE ); return( LOBOSERV_CONNECT_FAIL ); } else{ elapsed_usecs = StopWatchTime(); sdiv = ldiv(elapsed_usecs, 1000000L); sprintf(timebuf, "%ld.%ld", sdiv.quot, sdiv.rem); modem_connect_secs = atof(timebuf); if( UsbActive() == TRUE ) printfUSB("\nLinkToAccessPoint(), Linked with Access Point in %02.4f secs.\n", modem_connect_secs); } if( (ret=ModemGetRSSI(&modem_rssi_avg, &modem_rssi_sd)) != TRUE){ if( UsbActive() == TRUE ) printfUSB("\nLinkToAccessPoint(), ERROR in ModemGetRSSI(), ret = %d\n", ret); //if USER mode then RESET IO going out if( exitmode == LOBOSERV_USER_MODE ) ModemResetIO( KEEP_MODEM_ACTIVE ); return( ret ); } if( UsbActive() == TRUE ) printfUSB("\nLinkToAccessPoint(), Signal Strength = %02.4f, StdDev = %02.4f\n", modem_rssi_avg, modem_rssi_sd); //if USER mode then RESET IO going out if( exitmode == LOBOSERV_USER_MODE ){ ModemResetIO( KEEP_MODEM_ACTIVE ); } SerInFlush(); return( OK ); } int GetLinkRSSI(float *Mean, float *StdDev, int exitmode) { uchar Port0; char rbuf[250]; int i, ret; if( UsbActive() == TRUE ){ current_time = RtcToCtm(); printfUSB("\nGetLinkRSSI(), %s", ctime(¤t_time) ); } if( (ret=ModemCheckIO( modem_baud )) != TRUE ){ if( UsbActive() == TRUE ) printfUSB("\nERROR, ModemCheckIO(), RET=%d!\n", ret); ModemResetIO(PUT_MODEM_TO_SLEEP); return( ERROR ); } I2C_ReadInputPort0(&Port0); if( Port0 & 0x01 ) I2C_SetClrBitPort0(MODEM_CFG, TRUE); //if need be, set MODEM to config mode if( Port0 & 0x02 ) I2C_SetClrBitPort0(MODEM_RTS, TRUE); //if need be, enable MODEM transmitter SerInFlush(); if( ModemGetRSSI(Mean, StdDev) == DISCONNECT){ modem_rssi_avg=modem_rssi_sd=-1.0; if( exitmode == LOBOSERV_USER_MODE ) ModemResetIO( KEEP_MODEM_ACTIVE ); return( DISCONNECT ); } //if USER mode then RESET IO going out if( exitmode == LOBOSERV_USER_MODE ){ ModemResetIO( KEEP_MODEM_ACTIVE ); } SerInFlush(); return( OK ); } int LoboTalkMode(int exitmode) { uchar Port0; char rbuf[250]; char CMD[50]; //storage for MESSAGE COMMAND string used by sscanf() char EOM[10]; //storage for END OF MESSAGE char, i.e., "}", used by sscanf() char *ptr; int i, ret, ack_ret, send_ret, read_ret; long tmpval; if( UsbActive() == TRUE ){ current_time = RtcToCtm(); printfUSB("\nLoboTalkMode(), %s", ctime(¤t_time) ); } if( ModemCDActive() != TRUE ){ if( UsbActive() == TRUE ) printfUSB("\nLoboTalkMode(), MODEM CD NOT Active on Entry, exiting!\n"); return( DISCONNECT ); } if( (ret=ModemCheckIO( modem_baud )) != TRUE ){ if( UsbActive() == TRUE ) printfUSB("\nERROR, ModemCheckIO(), RET=%d!\n", ret); ModemResetIO(PUT_MODEM_TO_SLEEP); return( ret ); } I2C_ReadInputPort0(&Port0); if( !(Port0 & 0x01) ) I2C_SetClrBitPort0(MODEM_CFG, FALSE); //if need be, set MODEM to DATA mode if( Port0 & 0x02 ) I2C_SetClrBitPort0(MODEM_RTS, TRUE); //if need be, enable MODEM transmitter SerInFlush(); if( (ret=SendServerCommand("{LOBOTALK}")) != OK ){ if( UsbActive() == TRUE ) printfUSB("\nSendServerCommand(), ret = %d", ret); if( exitmode == LOBOSERV_USER_MODE ) ModemResetIO( KEEP_MODEM_ACTIVE ); return( ret ); } Sleep(0); Sleep( TICKS_PER_SECOND*5 ); send_ret = ModemPuts("{HELLO WORLD, WELCOME TO LOBO TALK MODE!}"); //if USER mode then RESET IO going out if( exitmode == LOBOSERV_USER_MODE ) ModemResetIO( KEEP_MODEM_ACTIVE ); SerInFlush(); return( TRUE ); } int PingServer(ushort iter, float *Mean, float *Min, float *Max, int exitmode) { uchar Port0; char rbuf[250]; int i, ret, ack_ret, send_ret, read_ret; ushort count; ulong msBeg, msEnd; float *val=NULL; float sum; if( UsbActive() == TRUE ){ current_time = RtcToCtm(); printfUSB("\nPingServer(), %s", ctime(¤t_time) ); } if( ModemCDActive() != TRUE ){ if( UsbActive() == TRUE ) printfUSB("\nPingServer(), MODEM CD NOT Active on Entry, exiting!\n"); return( DISCONNECT ); } if( (ret=ModemCheckIO( modem_baud )) != TRUE ){ if( UsbActive() == TRUE ) printfUSB("\nERROR, ModemCheckIO(), RET=%d!\n", ret); ModemResetIO(PUT_MODEM_TO_SLEEP); return( ERROR ); } I2C_ReadInputPort0(&Port0); if( !(Port0 & 0x01) ) I2C_SetClrBitPort0(MODEM_CFG, FALSE); //if need be, set MODEM to DATA mode if( Port0 & 0x02 ) I2C_SetClrBitPort0(MODEM_RTS, TRUE); //if need be, enable MODEM transmitter SerInFlush(); val = calloc((size_t)(iter), sizeof(float)); count = 0; for(i = 1; i <= iter; i++ ){ msBeg = MilliSecs(); SerInFlush(); send_ret = ModemPuts("{LOBOPING}"); if( send_ret > 0 ){ read_ret = ModemGetsTmout(rbuf, sizeof(rbuf), READ_TIMEOUT); //get Command ACK if( read_ret > 0 ){ ack_ret = MatchACK(rbuf); if( ack_ret == ACK ){ //did we get it? msEnd = MilliSecs(); val[count] = (float)(msEnd - msBeg); ++count; } //end ack_ret if } //end read_ret if else{ if( read_ret == DISCONNECT ){ free(val); if( exitmode == LOBOSERV_USER_MODE ) ModemResetIO( KEEP_MODEM_ACTIVE ); return( DISCONNECT ); } } } //end send_ret if else{ if( send_ret == DISCONNECT ){ free(val); if( exitmode == LOBOSERV_USER_MODE ) ModemResetIO( KEEP_MODEM_ACTIVE ); return( DISCONNECT ); } } } // end for if( count > 1 ){ /* Calculate the Mean of the time delta readings */ VectorSumMean(count, val, &sum, Mean); /* Calculate the Minimum and Maximum of the time delta readings */ VectorMinMax(count, val, Min, Max); } else{ *Mean = *Min = *Max = -1.0; } free(val); if( UsbActive() == TRUE ){ printfUSB("\nMessages: Sent = %d, Acknowledged = %d, Lost = %d\n", iter, count, (short)(iter - count)); printfUSB("Approximate round trip times in milli-seconds:\n"); printfUSB("Minimum = %.0fms, Maximum = %.0fms, Average = %.0fms\n", *Min, *Max, *Mean); } //if USER mode then RESET IO going out if( exitmode == LOBOSERV_USER_MODE ) ModemResetIO( KEEP_MODEM_ACTIVE ); SerInFlush(); return( count ); } int GetServerPID(long *pid, int exitmode) { uchar Port0; char rbuf[250]; char CMD[50]; //storage for MESSAGE COMMAND string used by sscanf() char EOM[10]; //storage for END OF MESSAGE char, i.e., "}", used by sscanf() char *ptr; int i, ret, ack_ret, send_ret, read_ret; long tmpval; if( UsbActive() == TRUE ){ current_time = RtcToCtm(); printfUSB("\nGetServerPID(), %s", ctime(¤t_time) ); } if( ModemCDActive() != TRUE ){ if( UsbActive() == TRUE ) printfUSB("\nGetServerPID(), MODEM CD NOT Active on Entry, exiting!\n"); return( DISCONNECT ); } if( (ret=ModemCheckIO( modem_baud )) != TRUE ){ if( UsbActive() == TRUE ) printfUSB("\nERROR, ModemCheckIO(), RET=%d!\n", ret); ModemResetIO(PUT_MODEM_TO_SLEEP); return( ret ); } I2C_ReadInputPort0(&Port0); if( !(Port0 & 0x01) ) I2C_SetClrBitPort0(MODEM_CFG, FALSE); //if need be, set MODEM to DATA mode if( Port0 & 0x02 ) I2C_SetClrBitPort0(MODEM_RTS, TRUE); //if need be, enable MODEM transmitter SerInFlush(); if( (ret=SendServerCommand("{LOBOPID}")) != OK ){ if( exitmode == LOBOSERV_USER_MODE ) ModemResetIO( KEEP_MODEM_ACTIVE ); return( ret ); } tmpval = 0L; for(i = 1; i <= MAX_RETRIES; i++ ){ read_ret = ModemGetsTmout(rbuf, sizeof(rbuf), READ_TIMEOUT); //get Command Value if( read_ret > 0 ){ if( UsbActive() == TRUE ) printfUSB("\nGetServerPID(), rbuf = %s", rbuf); if( (ptr=strstr(rbuf, "{PID,")) != NULL ){ //take a peek to see if we got it if( sscanf(ptr,"{%[^{},], %ld%[}]", CMD, &tmpval, EOM) == 3 ){ send_ret = ModemPuts("{ACK}"); //yep, we got it! if( send_ret > 0 ){ *pid = tmpval; if( UsbActive() == TRUE ) printfUSB("\nGetServerPID(), Returned PID Value = %ld\n", tmpval); if( exitmode == LOBOSERV_USER_MODE ) ModemResetIO( KEEP_MODEM_ACTIVE ); return( TRUE ); } else{ if( send_ret == DISCONNECT ){ if( exitmode == LOBOSERV_USER_MODE ) ModemResetIO( KEEP_MODEM_ACTIVE ); return( DISCONNECT ); } } } //end sscanf() if else{ SerInFlush(); ModemPuts("{NAK}"); //we couldn't decode the value } } //end strstr() if else{ SerInFlush(); ModemPuts("{NAK}"); //we got something but it isn't what we want } } //end read_ret if else{ if( read_ret == DISCONNECT ){ if( exitmode == LOBOSERV_USER_MODE ) ModemResetIO( KEEP_MODEM_ACTIVE ); return( DISCONNECT ); } } Sleep(0); Sleep( TICKS_PER_SECOND*2 ); } // end for //if USER mode then RESET IO going out if( exitmode == LOBOSERV_USER_MODE ) ModemResetIO( KEEP_MODEM_ACTIVE ); SerInFlush(); return( FALSE ); } int SyncRtcToServer(long *delta, int exitmode) { uchar Port0; char tbuf[250]; char rbuf[250]; char CMD[50]; //storage for MESSAGE COMMAND string used by sscanf() char EOM[10]; //storage for END OF MESSAGE char, i.e., "}", used by sscanf() char timebuf[50]; char *ptr; int i, ret, ack_ret, send_ret, read_ret; int synctz; ulong synctime, msStart, msFinish; ldiv_t sdiv; if( UsbActive() == TRUE ){ current_time = RtcToCtm(); printfUSB("\nSyncRtcToServer(), %s", ctime(¤t_time) ); } if( ModemCDActive() != TRUE ){ if( UsbActive() == TRUE ) printfUSB("\nSyncRtcToServer(), MODEM CD NOT Active on Entry, exiting!\n"); return( DISCONNECT ); } if( (ret=ModemCheckIO( modem_baud )) != TRUE ){ if( UsbActive() == TRUE ) printfUSB("\nERROR, ModmCheckIO(), RET=%d!\n", ret); ModemResetIO(PUT_MODEM_TO_SLEEP); return( ret ); } I2C_ReadInputPort0(&Port0); if( !(Port0 & 0x01) ) I2C_SetClrBitPort0(MODEM_CFG, FALSE); //if need be, set MODEM to DATA mode if( Port0 & 0x02 ) I2C_SetClrBitPort0(MODEM_RTS, TRUE); //if need be, enable MODEM transmitter SerInFlush(); if( (ret=SendServerCommand("{LOBOSYNCTIME}")) != OK ){ if( exitmode == LOBOSERV_USER_MODE ) ModemResetIO( KEEP_MODEM_ACTIVE ); return( ret ); } synctime = 0L; for(i = 1; i <= MAX_RETRIES; i++ ){ read_ret = ModemGetsTmout(rbuf, sizeof(rbuf), READ_TIMEOUT); //get Command Value if( read_ret > 0 ){ if( UsbActive() == TRUE ) printfUSB("\nSyncRtcToServer(), rbuf = %s\n", rbuf); if( (ptr=strstr(rbuf, "{SYNCTIME,")) != NULL ){ //take a peek to see if we got it if( sscanf(ptr,"{%[^{},], %lu, %d%[}]", CMD, &synctime, &synctz, EOM) == 4 ){ current_time = RtcToCtm(); msStart = MilliSecs(); sprintf(tbuf,"{SYNC, %lu, %d}", synctime, synctz); //turn around the value sent SerInFlush(); //if it's within range when its received we'll get an ACK send_ret = ModemPuts(tbuf); //Send Response if( send_ret > 0 ){ if( UsbActive() == TRUE ) printfUSB("\nSyncRtcToServer(), tbuf = %s\n", tbuf); read_ret = ModemGetsTmout(rbuf, sizeof(rbuf), READ_TIMEOUT); //get Command ACK if( read_ret > 0 ){ if( UsbActive() == TRUE ) printfUSB("\nSyncRtcToServer(), rbuf = %s\n", rbuf); ack_ret = MatchACK(rbuf); if( ack_ret == ACK ){ //we got it! msFinish = MilliSecs(); SetTimeSecs(synctime, NULL); //update PIC WrDS1994Long((ushort)TIMEVAL_PTR, synctime, DS1994_ROM); //update DS1994 if( (tzoffset != synctz) && (synctz >= 7) && (synctz <= 8) ){ tzoffset = synctz; WrDS1994Short(TZOFFSET_PTR, tzoffset, DS1994_ROM); } *delta = (long)(current_time - synctime); sdiv = ldiv((long)(msFinish - msStart), 1000L); sprintf(timebuf, "%ld.%ld", sdiv.quot, sdiv.rem); if( UsbActive() == TRUE ){ printfUSB("\nSyncRtcToServer(), got ACK in = %.4f secs\n", atof(timebuf)); printfUSB("SyncRtcToServer(), Time Sent = %s\n", ctime(&synctime) ); printfUSB("SyncRtcToServer(), TZ Sent = %d\n", synctz); printfUSB("SyncRtcToServer(), RTC Delta = %ld secs.\n", *delta ); } if( exitmode == LOBOSERV_USER_MODE ) ModemResetIO( KEEP_MODEM_ACTIVE ); return( TRUE ); } // end ack_ret if else if( ack_ret == NAK ){ if( UsbActive() == TRUE ) printfUSB("\nSyncRtcToServer(), got NAK\n"); continue; } else{ if( UsbActive() == TRUE ) printfUSB("\nSyncRtcToServer(), got ERROR, sending NAK!\n"); SerInFlush(); ModemPuts("{NAK}"); continue; } } // end read_ret if else{ if( read_ret == DISCONNECT ){ if( exitmode == LOBOSERV_USER_MODE ) ModemResetIO( KEEP_MODEM_ACTIVE ); return( DISCONNECT ); } } } // end send_ret if else{ if( send_ret == DISCONNECT ){ if( exitmode == LOBOSERV_USER_MODE ) ModemResetIO( KEEP_MODEM_ACTIVE ); return( DISCONNECT ); } } } //end sscanf() if else{ SerInFlush(); ModemPuts("{NAK}"); //we couldn't decode the value } } //end strstr() if else{ SerInFlush(); ModemPuts("{NAK}"); //we got something but it isn't what we want } } //end read_ret if else{ if( read_ret == DISCONNECT ){ if( exitmode == LOBOSERV_USER_MODE ) ModemResetIO( KEEP_MODEM_ACTIVE ); return( DISCONNECT ); } } Sleep(0); Sleep( TICKS_PER_SECOND*2 ); } //end for //if USER mode then RESET IO going out if( exitmode == LOBOSERV_USER_MODE ) ModemResetIO( KEEP_MODEM_ACTIVE ); SerInFlush(); return( ERROR ); } int ZmodemFilesToServer(ushort files, char *wildcard, int exitmode) { FILE *log_file; uchar Port0; int ret, year; long recs_found, rec_ctr, err_ctr; float tstamp; DirStrEntry *dlist; if( UsbActive() == TRUE ){ current_time = RtcToCtm(); printfUSB("\nStartServerZmodem(), %s", ctime(¤t_time) ); } if( ModemCDActive() != TRUE ){ if( UsbActive() == TRUE ) printfUSB("\nStartServerZmodem(), MODEM CD NOT Active on Entry, exiting!\n"); return( DISCONNECT ); } dlist = AllocateDirListingMem(files); if(dlist == NULL) return( ERROR ); if( (recs_found = CreateDirListing(dlist, wildcard, files)) <= 0 ){ free(dlist); return( ERROR ); } if( (ret=ModemCheckIO( modem_baud )) != TRUE ){ if( UsbActive() == TRUE ) printfUSB("\nERROR, ModemCheckIO(), RET=%d!\n", ret); ModemResetIO(PUT_MODEM_TO_SLEEP); free(dlist); return( ret ); } I2C_ReadInputPort0(&Port0); if( !(Port0 & 0x01) ) I2C_SetClrBitPort0(MODEM_CFG, FALSE); //if need be, set MODEM to DATA mode if( Port0 & 0x02 ) I2C_SetClrBitPort0(MODEM_RTS, TRUE); //if need be, enable MODEM transmitter SerInFlush(); rec_ctr = recs_found; err_ctr = 0L; while( (rec_ctr > 0) && (err_ctr <= 3) ){ if( (ret = SendServerCommand("{LOBOZMODEM}")) != OK ){ tstamp = GetDOYtime(&year); log_file = openLogFile(); if(log_file != FNULL) fprintf(log_file, ", %04d.%010f, SendServerCommand({LOBOZMODEM}), %d\n", year, tstamp, ret); fclose(log_file); if( ret == DISCONNECT ) goto bail; else{ //log file was updated thus fsize in file list is stale free(dlist); dlist = AllocateDirListingMem(files); if(dlist == NULL){ ret = -101; goto bail; } if( (recs_found = CreateDirListing(dlist, wildcard, files)) <= 0 ){ ret = -102; goto bail; } rec_ctr = recs_found; ++err_ctr; continue; } } Sleep(0); //let remote zmodem (qrz) start up Sleep( TICKS_PER_SECOND*3 ); SerInFlush(); if( (ret = SZ(dlist->name, dlist->lenstr)) != OK ){ tstamp = GetDOYtime(&year); log_file = openLogFile(); if(log_file != FNULL) fprintf(log_file, ", %04d.%010f, SZ() %s %s, %d\n", year, tstamp, dlist->name, dlist->lenstr, ret); fclose(log_file); if( ret == DISCONNECT ) goto bail; else{ //log file was updated thus fsize in file list is stale free(dlist); dlist = AllocateDirListingMem(files); if(dlist == NULL){ ret = -103; goto bail; } if( (recs_found = CreateDirListing(dlist, wildcard, files)) <= 0 ){ ret = -104; goto bail; } rec_ctr = recs_found; ++err_ctr; continue; } } Sleep(0); //let remote zmodem (qrz) finish up Sleep( TICKS_PER_SECOND*3 ); SerInFlush(); if( (ret = FstatServerFile(dlist->name, dlist->lenstr)) == OK ){ if( exitmode == LOBOSERV_DATA_MODE ) RemoveRenameSentFile(dlist->name); } else{ tstamp = GetDOYtime(&year); log_file = openLogFile(); if(log_file != FNULL) fprintf(log_file, ", %04d.%010f, FstatServerFile() %s %s, %d\n", year, tstamp, dlist->name, dlist->lenstr, ret); fclose(log_file); if( ret == DISCONNECT ) goto bail; else{ //log file was updated thus fsize in file list is stale free(dlist); dlist = AllocateDirListingMem(files); if(dlist == NULL){ ret = -105; goto bail; } if( (recs_found = CreateDirListing(dlist, wildcard, files)) <= 0 ){ ret = -106; goto bail; } rec_ctr = recs_found; ++err_ctr; continue; } } --rec_ctr; if(rec_ctr != 0) ++dlist; } // end while bail: free(dlist); //if USER mode then RESET IO going out if( exitmode == LOBOSERV_USER_MODE ) ModemResetIO( KEEP_MODEM_ACTIVE ); SerInFlush(); return( ret ); } int FstatServerFile(char *fname, char *fsize) { char tbuf[250]; char rbuf[250]; int i, ret, ack_ret, send_ret, read_ret; if( UsbActive() == TRUE ){ current_time = RtcToCtm(); printfUSB("\nFstatServerFile(), %s", ctime(¤t_time) ); } if( ModemCDActive() != TRUE ){ if( UsbActive() == TRUE ) printfUSB("\nFstatServerFile(), MODEM CD NOT Active on Entry, exiting!\n"); return( DISCONNECT ); } if( (ret=SendServerCommand("{LOBOFSTAT}")) != OK ) return( ret ); for(i = 1; i <= MAX_RETRIES; i++ ){ SerInFlush(); sprintf(tbuf,"{FNAMEFSIZE, %s, %s}", fname, fsize); send_ret = ModemPuts(tbuf); //Send File Info if( send_ret > 0 ){ if( UsbActive() == TRUE ) printfUSB("\nFstatServerFile(), tbuf = %s\n", tbuf); read_ret = ModemGetsTmout(rbuf, sizeof(rbuf), READ_TIMEOUT); //get ACK if( read_ret > 0 ){ if( UsbActive() == TRUE ) printfUSB("\nFstatServerFile(), rbuf = %s\n", rbuf); ack_ret = MatchACK(rbuf); //match ACK_FSTAT if( ack_ret == ACK ){ //did we get the ACK if( UsbActive() == TRUE ) printfUSB("\nFstatServerFile(), got ACK\n"); return( OK ); } else if( ack_ret == NAK ){ //did we get the NAK if( UsbActive() == TRUE ) printfUSB("\nFstatServerFile(), got NAK\n"); continue; } else{ if( UsbActive() == TRUE ) printfUSB("\nFstatServerFile(), got ERROR, exiting!\n"); return( ERROR ); } } // end read_ret if else{ if( read_ret == DISCONNECT ) return( DISCONNECT ); } } // end send_ret if else{ if( send_ret == DISCONNECT ) return( DISCONNECT ); } } // end for SerInFlush(); return( ERROR ); } int SendServerCommand(char *cmd) { char rbuf[250]; int i, ack_ret, send_ret, read_ret; for(i = 1; i <= MAX_CMD_RETRIES; i++ ){ send_ret = ModemPuts( cmd ); if( UsbActive() == TRUE ) printfUSB("\nSendServerCommand(), send = %s\n", cmd); if( send_ret > 0 ){ read_ret = ModemGetsTmout(rbuf, sizeof(rbuf), READ_TIMEOUT); //get Command ACK if( read_ret > 0 ){ if( UsbActive() == TRUE ) printfUSB("\nSendServerCommand(), received = %s\n", rbuf); ack_ret = MatchACK(rbuf); if( ack_ret == ACK ){ //did we get it? if( UsbActive() == TRUE ) printfUSB("\nSendServerCommand(), %s got an ACK!\n", cmd); return( OK ); } //end ack_ret if } //end read_ret if else{ if( read_ret == DISCONNECT ) return( DISCONNECT ); } } //end send_ret if else{ if( send_ret == DISCONNECT ) return( DISCONNECT ); } Sleep(0); Sleep( TICKS_PER_SECOND*3 ); } // end for return ( ERROR ); } int MatchACK(char *buf) { if( strstr(buf, "ACK") != NULL ) return( ACK ); else if( strstr(buf, "NAK") != NULL ) return( NAK ); else return( ERROR ); }