u8 modem_sms( u8 *ucBuffer ) { PYGMYCOMMAND pygmyCmd1, pygmyCmd2, pygmyCmdCMGF; //streamSetActionChars( MODEM_COM, "\r>" ); //cmdInitQueue( &globalModemQueue ); copyString( getNextSubString( ucBuffer, WHITESPACE ), globalModemSMS.PhoneNumber ); copyString( getNextSubString( NULL, NEWLINE ), globalModemSMS.Message ); //print( MODEM_DEBUG, "\rSending \"%s\"", globalModemSMS.Message ); // set SMS format //pygmyCmdCMGF.Name = (u8*)AT_CMGF; //pygmyCmdCMGF.PrintHandler = print_CMGF; //pygmyCmdCMGF.EventHandler = handler_ATCMGF; //pygmyCmdCMGF.Expire = 2; //pygmyCmdCMGF.Retry = 1; pygmyCmd1.Name = ">"; pygmyCmd1.Expire = 2; pygmyCmd1.Retry = 0; pygmyCmd1.EventHandler = handler_ATSMSPROMPT; pygmyCmd1.PrintHandler = print_CMGS; pygmyCmd2.Name = (u8*)AT_CMGS; pygmyCmd2.Expire = 2; pygmyCmd2.Retry = 1; pygmyCmd2.EventHandler = handler_ATCMGS; pygmyCmd2.PrintHandler = print_CMGSMessage; //cmdQueue( &globalModemQueue, &pygmyCmdCMGF ); cmdQueue( &globalModemQueue, &pygmyCmd1 ); cmdQueue( &globalModemQueue, &pygmyCmd2 ); return( TRUE ); }
u8 handler_ATCCLK( u8 *ucBuffer ) { u8 *ucParam, *ucTime;//[ 2 ]; ucParam = getNextSubString( ucBuffer, WHITESPACE ); ucTime = getNextSubString( NULL, NEWLINE ); print( MODEM_DEBUG, "\rATCCLK( %s, %s )", ucParam, ucTime ); if( isStringSame( ucParam, (u8*)AT_CCLK ) ){//&& set_time( ucParams[ 1 ] ) ){ print( MODEM_DEBUG, "TIME( %s )" ); return( TRUE ); } // if return( FALSE ); }
u8 bootTestAndLoad( u32 Address, u8 *FileName ) { PYGMYFILE *File; u32 i, Length; u8 Buffer[ 64 ], *SubString, Status; File = fileOpen( FileName, READ, 0 ); if( !File ){ return( FALSE ); } // if //Length = fpecGetIHEXLength( FileName ); print( STDIO, "\rFlashing %d bytes to 0x%08", Length, Address ); fpecEraseProgramMemory(); print( STDIO, "..." ); for( Status = 0; !( File->Properties.Attributes & EOF ) && Status != 0xFF; ){ for( i = 0; i < 64; i++ ){ Buffer[ i ] = fileGetChar( File ); if( Buffer[ i ] == '\r' ){ Buffer[ i ] = '\0'; SubString = getNextSubString( (u8*)Buffer, WHITESPACE|NEWLINE ); // Add 1 to pointer before passing to skip the ':' packet start char Status = fpecProcessIHEX( (u8*)( SubString + 1 ) ); break; // Time to fetch next IHEX entry } // if } // for } // for }
void main( void ) { PYGMYFILE pygmyFile; u8 i, ucStatus, ucBuffer[ 65 ], *ucSubString; sysInit(); print( COM3, "\rUpdating bootloader, cancel boot after completion" ); print( COM3, "\rOpening Resource..." ); if( !fileOpenResource( &pygmyFile, (u8*)PYGMY_boothex ) ){ print( COM3, "\rFile Failed to Open" ); } else{ print( COM3, "\rErasing..." ); for( i = 0; i < 8; i++ ){ fpecErasePage( i ); } // for; print( COM3, "\rFlashing..." ); for( ucStatus = 0; !( fileIsEOF( &pygmyFile ) ) && ucStatus != 0xFF; ){ for( i = 0; i < 64; i++ ){ ucBuffer[ i ] = fileGetChar( &pygmyFile ); if( ucBuffer[ i ] == '\r' ){ ucBuffer[ i ] = '\0'; ucSubString = getNextSubString( (u8*)ucBuffer, WHITESPACE|NEWLINE ); // Add 1 to pointer before passing to skip the ':' packet start char ucStatus = fpecProcessIHEX( (u8*)( ucSubString + 1 ) ); break; // Time to fetch next IHEX entry } // if } // for } // for } // else print( COM3, "\rBootloader Updated" ); print( COM3, "\rReseting..." ); delay( 100 ); PYGMY_RESET; //boot(); }
u8 handler_ATCGDCONT( u8 *ucBuffer ) { if( isStringSame( getNextSubString( ucBuffer, WHITESPACE|PUNCT ), (u8*)AT_OK ) ){ return( TRUE ); } // if return( FALSE ); }
u8 handler_ATSH( u8 *ucBuffer ) { u8 *ucSubString; ucSubString = getNextSubString( ucBuffer, WHITESPACE|PUNCT|NEWLINE ); if( isStringSame( ucSubString, (u8*)AT_OK ) || isStringSame( ucSubString, (u8*)AT_ERROR ) ){ return( TRUE ); // if already disconnected ERROR is valid } // if return( FALSE ); }
u8 handler_ATESCAPE( u8 *ucBuffer ) { u8 *ucParam, ucLen; ucParam = getNextSubString( ucBuffer, WHITESPACE|PUNCT ); if( isStringSame( ucParam, (u8*)AT_OK ) ){ return( TRUE ); } return( FALSE ); }
u8 handler_ATCMGF( u8 *ucBuffer ) { u8 *ucParam; ucParam = getNextSubString( ucBuffer, WHITESPACE|PUNCT|SEPARATORS ); //print( MODEM_COM, "\rATCMGF( %s )", ucParam ); if( isStringSame( ucParam, (u8*)AT_OK ) ){ return( TRUE ); } // if return( FALSE ); }
u8 handler_ATATOFF( u8 *ucBuffer ) { u8 *ucSubString; ucSubString = getNextSubString( ucBuffer, WHITESPACE|NEWLINE ); if( ucSubString ){ // cell_onoff( "" ); return( TRUE ); // if cell responded then it's not off yet } return( FALSE ); }
u8 handler_ATSGACT( u8 *ucBuffer ) { u8 *ucSubString; ucSubString = getNextSubString( ucBuffer, WHITESPACE|PUNCT|NEWLINE ); if( isStringSame( ucSubString, (u8*)AT_SGACT ) || isStringSame( ucSubString, (u8*)AT_OK ) ){ return( TRUE ); } // if return( FALSE ); }
u8 handler_ATOK( u8 *ucBuffer ) { // Waits for OK response // Returns TRUE for "OK" FALSE for anything else u8 *ucSubString; ucSubString = getNextSubString( ucBuffer, WHITESPACE|PUNCT ); if( ucSubString && isStringSame( ucSubString, (u8*)AT_OK ) ){ return( TRUE ); } return( FALSE ); }
u8 handler_ATSMSPROMPT( u8 *ucBuffer ) { u8 *ucParam; ucParam = getNextSubString( ucBuffer, NEWLINE ); if( replaceChars( ucParam, ">", ' ' ) ){ print( MODEM_COM, "\rATSMSPROMPT", ucParam ); return( TRUE ); } // if return( TRUE ); }
u8 handler_ATSD( u8 *ucBuffer ) { u8 *ucSubString; ucSubString = getNextSubString( ucBuffer, WHITESPACE|PUNCT ); if( isStringSame( ucSubString, (u8*)AT_CONNECT ) ){ return( TRUE ); } else if( isStringSame( ucSubString, (u8*)AT_ERROR ) ){ //cell_close( (u8*)PYGMY_CMD_now ); //cell_at( "" ); } // else if return( FALSE ); }
u8 handler_ATCMGS( u8 *ucBuffer ) { u8 *ucSubString; ucSubString = getNextSubString( ucBuffer, WHITESPACE|PUNCT|NEWLINE ); // print( MODEM_COM, "\rATCMGS( %s )", ucSubString ); if( isStringSame( ucSubString, (u8*)AT_CMGS ) || isStringSame( ucSubString, (u8*)AT_CMS ) ){ // Message fail if( cmdIsQueued( &globalModemQueue, (u8*)AT_CMGS ) == 1 ){ return( TRUE ); } // if } // if return( FALSE ); }
u8 modem_echo( u8 *ucBuffer ) { u8 *ucParam; ucParam = getNextSubString( ucBuffer, WHITESPACE | PUNCT ); modem_close( "now" ); if( isStringSame( ucParam, "on" ) ){ println( MODEM_COM, "ATE1&W" ); return( TRUE ); } else if( isStringSame( ucParam, "off" ) ){ println( MODEM_COM, "ATE0&W" ); return( TRUE ); } // else if return( FALSE ); }
u8 bootTest( void ) { // This function pre-tests every row in firmware file for corruption before erase and program u32 i; u8 ucBuffer[ 64 ], *ucSubString; //if( !fileOpen( &pygmyFile, (u8*)BOOT_filename, READ ) ){ // return( FALSE ); //} for( ; !( pygmyFile.Properties.Attributes & EOF ); ){ // Get an IHEX packet for( i = 0; i < 64; i++ ){ ucBuffer[ i ] = fileGetChar( &pygmyFile ); if( ucBuffer[ i ] == '\r' ){ ucBuffer[ i ] = '\0'; break; } // if } // for ucSubString = getNextSubString( ucBuffer, WHITESPACE|NEWLINE ); if( *(ucSubString++) != ':' ){ return( 0 ); } // if // Following works because the output cannot be longer than the input being converted convertHexEncodedStringToBuffer( ucSubString, ucSubString ); if( ucSubString[ 3 ] == IHEX_EOF ){ break; // We have reached EOF without error } //for( i = 0, ucCalculatedSum = 0; i < ucSubString[ 0 ]+4; i++ ){ // ucCalculatedSum += ucSubString[ i ]; //} // for //ucCalculatedSum = 1 + ( 0xFF ^ (u8)ucCalculatedSum ); //if( (u8)ucCalculatedSum != ucSubString[ i ] ){ // Last short is checksum if( sysCRC8( ucSubString, ucSubString[ 0 ]+4 ) != ucSubString[ i ] ){ // Last short is checksum return( FALSE ); // Corrupt HEX Row } // if i = ( (u16)ucSubString[ 1 ] << 8 ) + ucSubString[ 2 ]; if( ucSubString[ 3 ] == IHEX_DATA && i < 0x2000 ){ return( 0 ); } // if } // for //putstr( (u8*)BOOT_OK ); print( STDIO, (u8*)BOOT_OK ); return( 1 ); }
u8 handler_ATAT( u8 *ucBuffer ) { u8 *ucSubString; ucSubString = getNextSubString( ucBuffer, WHITESPACE|PUNCT ); if( ucSubString ){ if( isStringSame( ucSubString, (u8*)AT_OK ) || isStringSame( ucSubString, (u8*)AT_ERROR ) || isStringSame( ucSubString, (u8*)AT_MWI ) ){ print( MODEM_COM, "\rRadio On\r" ); deleteTask( "AT", 0 ); return( TRUE ); } // if } // if return( FALSE ); }
u8 bootTest( PYGMYFILE *pygmyFile ) { // This function pre-tests every row in firmware file for corruption before erase and program u32 i; u8 ucBuffer[ 64 ], ucCalculatedSum, *ucSubString; for( ; !( fileIsEOF( pygmyFile ) ); ){ // Get an IHEX packet for( i = 0; i < 64; i++ ){ ucBuffer[ i ] = fileGetChar( pygmyFile ); if( ucBuffer[ i ] == '\r' ){ ucBuffer[ i ] = '\0'; break; } // if } // for ucSubString = getNextSubString( ucBuffer, WHITESPACE|NEWLINE ); if( *(ucSubString++) != ':' ){ return( 0 ); } // if // Following works because the output cannot be longer than the input being converted convertHexEncodedStringToBuffer( ucSubString, ucSubString ); if( ucSubString[ 3 ] == IHEX_EOF ){ break; // We have reached EOF without error } for( i = 0, ucCalculatedSum = 0; i < ucSubString[ 0 ]+4; i++ ){ ucCalculatedSum += ucSubString[ i ]; } // for ucCalculatedSum = 1 + ( 0xFF ^ (u8)ucCalculatedSum ); if( (u8)ucCalculatedSum != ucSubString[ i ] ){ // Last short is checksum return( 0 ); // Corrupt HEX Row } // if i = ( (u16)ucSubString[ 1 ] << 8 ) + ucSubString[ 2 ]; //if( ucSubString[ 3 ] == IHEX_DATA && i > 0x2000 ){ // return( 0 ); //} // if } // for return( 1 ); }
u8 email_get( u8 *ucBuffer ) { // This function doesn't "get" an e-mail, rather it acts as the equivalent to HTTP GET u8 *ucParam; ucParam = getNextSubString( ucBuffer, WHITESPACE|PUNCT ); if( ucParam ){ if( isStringSame( ucParam, (u8*)EMAIL_220 ) || // Greeting isStringSame( ucParam, (u8*)EMAIL_235 ) || // Authentication accepted isStringSame( ucParam, (u8*)EMAIL_250 ) || // Ack isStringSame( ucParam, (u8*)EMAIL_334 ) || // Ready for Login isStringSame( ucParam, (u8*)EMAIL_354 ) ){ // Ready for Data return( TRUE ); } else if( isStringSame( ucParam, "500" ) || isStringSame( ucParam, "503" ) ){ modem_close( "now" ); } else if( isStringSame( ucParam, (u8*)EMAIL_221 ) ){ modem_close( "now" ); return( TRUE ); } //else if } return( FALSE ); }
u8 handler_ATCMGL( u8 *ucBuffer ) { print( MODEM_DEBUG, "SMS( %s )", getNextSubString( ucBuffer, NEWLINE ) ); return( TRUE ); }