/* +UULOC: 27/09/2012,18:26:13.363,21.0213870,105.8091050,0,127,0,0� nmea_scanf((char *)buff,128,"%d/%d/%d,%d:%d:%d.%d,%f,%f,%f,%f,%f,%f",&t1,&t2,&t3,&t4,&t5,&t6,&t7, cellLocateType.lat,cellLocateType.lon,cellLocateType.alt,cellLocateType.uncertainty, cellLocateType.speed,cellLocateType.dir; ); */ uint8_t GetCellLocate(uint8_t *buff) { COMPARE_TYPE cmp1; Timeout_Type tOut; uint8_t c,i; uint32_t t1,t2,t3,t4,t5,t6,t7; DelayMs(100); MODEM_FlushBuffer(); MODEM_Info("\r\nGSM->GET CELL LOCATE\r\n"); sprintf((char *)buff, "AT+ULOC=2,2,1,500,1\r"); COMM_Puts(buff); InitFindData(&cmp1,"+UULOC: "); InitTimeout(&tOut,TIME_SEC(3)); i = 0; while(CheckTimeout(&tOut)) { if(RINGBUF_Get(&commBuf,&c) == 0) { if(FindData(&cmp1,c) == 0) { i = 1; break; } } } if(i) { InitFindData(&cmp1,"\r\n"); InitTimeout(&tOut,TIME_SEC(3)); i = 0; while(CheckTimeout(&tOut)) { if(RINGBUF_Get(&commBuf,&c) == 0) { buff[i++] = c; if(FindData(&cmp1,c) == 0) { nmea_scanf((char *)buff,128,"%d/%d/%d,%d:%d:%d.%d,%f,%f,%f,%f,%f,%f",&t1,&t2,&t3,&t4,&t5,&t6,&t7, &cellLocate.lat,&cellLocate.lon,&cellLocate.alt,&cellLocate.uncertainty, &cellLocate.speed,&cellLocate.dir); cellLocate.ew = 'E'; cellLocate.ns = 'N'; if(cellLocate.lat < 0) cellLocate.ns = 'S'; if(cellLocate.lon < 0) cellLocate.ew = 'W'; cellLocate.lon = neamFormatLatLng(cellLocate.lon); cellLocate.lat = neamFormatLatLng(cellLocate.lat); cellLocate.time.mday = t1; cellLocate.time.month = t2; cellLocate.time.year = t3; cellLocate.time.hour = t4; cellLocate.time.min = t5; cellLocate.time.sec = t6; return 0; } } } } return 0xff; }
uint8_t MODEM_CloseSocket(uint8_t socket) { COMPARE_TYPE cmp1,cmp2; Timeout_Type tOut; uint8_t c; uint8_t buf[32]; DelayMs(100); MODEM_FlushBuffer(); MODEM_Info("\r\nGSM->CLOSE SOCKET:%d\r\n",socket); sprintf((char *)buf, "AT+USOCL=%d\r",socket); COMM_Puts(buf); InitFindData(&cmp1,"OK"); InitFindData(&cmp2,"ERROR"); InitTimeout(&tOut,TIME_MS(3000)); while(CheckTimeout(&tOut)) { if(RINGBUF_Get(&commBuf,&c) == 0) { if(FindData(&cmp1,c) == 0) { //MODEM_Info("\r\nGSM->CLOSE SOCKET OK\r\n"); return 0; } if(FindData(&cmp2,c) == 0) { break; } } } //MODEM_Info("\r\nGSM->CLOSE SOCKET FAILS\r\n"); return 0xff; }
uint8_t MODEM_GetCSQ(void) { uint8_t i,c; DelayMs(100); MODEM_FlushBuffer(); COMM_Puts("AT+CSQ\r"); // cancel calling if busy. if(!MODEM_CheckResponse("+CSQ:", 2000)) { i = 0; while(RINGBUF_Get(&commBuf,&c) == 0) { if((c == '\r') || (c == '\n')) break; csqBuff[i] = c; i++; if(i >= sizeof(csqBuff)) { break; } } csqBuff[i] = '\0'; sscanf((char *)csqBuff,"%f",&csqValue); return 0; } return 0xff; }
void vGSM_GPRS_Task(void *arg) { Timeout_Type tApp_100MS; uint32_t timer100msCnt = 0; InitTimeout(&tApp_100MS,SYSTICK_TIME_MS(100)); AMPM_GSM_Init("internet","mms","mms",vTcpIpTask,vTcpIpTaskInit); while(1) { AMPM_GSM_MainTask(); //Call and dtmf test if(incomingCall.state == CALL_INCOMING) { if(ampm_GotIncomingNumberFlag) { if(Ampm_ComparePhoneNumber((char *)ampm_IncomingCallPhoneNo,BOSS_PHONE_NUMBER)) { incomingCall.dtmf = &dtmfRingBuf; Ampm_VoiceCallSetAction(&incomingCall,CALL_PICKUP_WHEN_INCOMING); } else { Ampm_VoiceCallCancel(&incomingCall); } } } if(incomingCall.state == CALL_ACTIVE) { if(RINGBUF_Get(&dtmfRingBuf,&c) == 0) { DbgCfgPrintf("\r\nDTMF:%c",c); if(c == '1') { Ampm_VoiceCallCancel(&incomingCall); Ampm_VoiceCallSetup(&callUser,(uint8_t *)BOSS_PHONE_NUMBER,&dtmfRingBuf,CALL_HANGUP_WHEN_ALERTING,NULL,6,60,1); //Ampm_VoiceCallSetup(&callUser,BOSS_PHONE_NUMBER,&dtmfRingBuf,CALL_HANGUP_WHEN_ACTIVE,NULL,6,60,1); } } } //SMS test //Send Sms with interval = 3600s if(CheckTimeout(&tSendSmsTime) == SYSTICK_TIMEOUT) { InitTimeout(&tSendSmsTime,SYSTICK_TIME_SEC(3600)); smsLen = sprintf((char *)pdu2uniBuf,"Xin chào!\n"); smsLen = utf8s_to_ucs2s((int16_t *)replySmsBuf,pdu2uniBuf); big2litel_endian((uint16_t *)replySmsBuf,unilen((uint16_t *)replySmsBuf)); smsLen *= 2; Ampm_Sms_SendMsg(&smsUser,(uint8_t *)BOSS_PHONE_NUMBER,(uint8_t *)replySmsBuf,smsLen,SMS_PDU16_MODE,30/*interval resend*/,3/*resend times*/); } // 0.1 sec process if(CheckTimeout(&tApp_100MS) == SYSTICK_TIMEOUT) { InitTimeout(&tApp_100MS,SYSTICK_TIME_MS(100)); timer100msCnt += 100; CtrLed(timer100msCnt); } } }
uint32_t MODEM_CheckAccount(void) { uint8_t c, state=0; uint8_t buf[16], *pbuf = buf; COMM_Puts("ATD*101#\r"); if(!MODEM_CheckResponse("+CUSD:", 5000) == 0) return 0; DelayMs(1000); while(RINGBUF_Get(&commBuf, &c)==0){ switch(state){ case 0: if(c == 'a') state ++; break; case 1: if(c == ' ') state ++; break; case 2: if(c == ' '){ *pbuf = 0; // buffer should be empty MODEM_CheckResponse("OK", 1000); return atol((char *)buf); } *pbuf++ = c; break; } } return 0; }
static void UART2_RxTxHandler(void) { uint32_t IntStatus, byteCnt, timeout = 1000000; uint8_t c; IntStatus = UARTIntStatus(UART2_BASE, true); UARTIntClear(UART2_BASE, IntStatus); if(IntStatus & UART_INT_TX) { byteCnt = RINGBUF_GetFill(&long_Uart2_TxRingBuf); if (byteCnt) { RINGBUF_Get(&long_Uart2_TxRingBuf, &c); UARTCharPutNonBlocking(UART2_BASE, c); if (byteCnt == 1) { UARTIntDisable(UART2_BASE, UART_INT_TX); } } else { UARTIntDisable(UART2_BASE, UART_INT_TX); } } else if (IntStatus & (UART_INT_RX | UART_INT_RT)) { while(!UARTCharsAvail(UART2_BASE) && (timeout--)); c = UARTCharGet(UART2_BASE); RINGBUF_Put(&long_Uart0_RxRingBuf,c); } else { c = UARTCharGet(UART2_BASE); } }
uint16_t MODEM_CheckGPRSDataOut(uint8_t socket) { COMPARE_TYPE cmp1,cmp2; Timeout_Type tOut; uint8_t buf[32],c; DelayMs(100); MODEM_FlushBuffer(); MODEM_Info("\r\nGSM->CHECK OUTCOMING UNACK SOCKET:%d\r\n",socket); sprintf((char *)buf, "AT+USOCTL=%d,11\r",socketMask[socket]); COMM_Puts(buf); InitFindData(&cmp1,"OK"); InitFindData(&cmp2,"ERROR"); InitTimeout(&tOut,TIME_MS(1000)); while(CheckTimeout(&tOut)) { if(RINGBUF_Get(&commBuf,&c) == 0) { if(FindData(&cmp1,c) == 0) { MODEM_Info("\r\nGPRS->UNACK:%dBytes\r\n",GPRS_dataUnackLength[socket]); return GPRS_dataUnackLength[socket]; } if(FindData(&cmp2,c) == 0) { MODEM_Info("\r\nGPRS->ERROR\r\n"); //tcpSocketStatus[socket] = SOCKET_CLOSE; break; } } } //num of data will check in at_command_parser.c // return GPRS_dataUnackLength MODEM_Info("\r\nGPRS->UNACK:%dBytes\r\n",GPRS_dataUnackLength[socket]); return 0xffff; }
static void ICACHE_FLASH_ATTR CMD_Task(os_event_t *events) { uint8_t c; while(RINGBUF_Get(&rxRb, &c) == 0){ PROTO_ParseByte(&rxProto, c); } }
sint8 ICACHE_FLASH_ATTR RINGBUF_Pull(RINGBUF* r,uint8* buf,uint16 length) { if(r->fill_cnt < length) return -1; int i; uint8* pdata = buf; for(i=0;i<length;i++){ RINGBUF_Get(r,pdata); pdata++; } return 0; }
I16 PROTO_ParseRb(RINGBUF* rb, U8 *bufOut, U16* len, U16 maxBufLen) { U8 c; PROTO_PARSER proto; PROTO_Init(&proto, NULL, bufOut, maxBufLen); while(RINGBUF_Get(rb, &c) == 0){ if(PROTO_ParseByte(&proto, c) == 0){ *len = proto.dataLen; return 0; } } return -1; }
sint8 ICACHE_FLASH_ATTR RINGBUF_PullRaw(RINGBUF* r,uint8* buf,uint16 length,uint16 offset) { if(r->fill_cnt < length) return -1; int i; uint8* volatile p_r = r->p_r; volatile uint32 fcnt = r->fill_cnt; uint8 tmp; for(i=0;i<offset;i++){ RINGBUF_Get(r,&tmp); } uint8* pdata = buf; for(i=0;i<length;i++){ RINGBUF_Get(r,pdata); pdata++; } r->p_r=p_r; r->fill_cnt = fcnt; return 0; }
// wait for reponse from modem within specific time out // maximum waiting period = (time / 10) seconds uint8_t MODEM_Wait(const uint8_t *res, uint32_t time) { uint8_t c, i=0; time *= 100; while(time--){ DelayMs(1); while(RINGBUF_Get(&commBuf, &c)==0){ if(c==res[i]){ if(res[++i]==0)return 1; }else if(c==res[0]) i = 1; else i = 0; } } return 0; }
uint8_t MODEM_Gets(uint8_t *buf, uint16_t bufSize, uint8_t match) { uint8_t c; uint16_t i = 0; if(bufSize <= 1 || buf == NULL) return 0; while(RINGBUF_Get(&commBuf, &c)==0){ if(c == match) break; if(buf != NULL) buf[i++] = c; if(i>=bufSize-1) break; } buf[i] = 0; return i; }
uint8_t MODEM_CheckResponse(uint8_t *str,uint32_t t) { COMPARE_TYPE cmp; uint8_t c; InitFindData(&cmp,str); while(t--) { DelayMs(1); if(RINGBUF_Get(&commBuf,&c) == 0) { if(FindData(&cmp,c) == 0) { return 0; } } } return 0xff; }
uint8_t MODEM_GetOperatorName(uint8_t *buf, uint16_t bufSize) { uint8_t c; COMM_Puts("AT+COPS?\r"); // if(MODEM_CheckResponse("+COPS: 0,0,\"", 5000) == 0) return 0xff; //thienhailbue note:need modifi to LPC17xx DelayMs(1000); while(RINGBUF_Get(&commBuf, &c)==0){ if(c == '\"' || bufSize-- == 1){ *buf = 0; // buffer should be empty MODEM_CheckResponse("OK", 1000); return 0; } *buf++ = c; } return 0xff; }
uint8_t MODEM_CreateSocket(uint8_t socket) { COMPARE_TYPE cmp1,cmp2; Timeout_Type tOut; uint8_t c; DelayMs(100); MODEM_FlushBuffer(); socketMask[socket] = 0xff; createSocketNow = socket; MODEM_Info("\r\nGSM->CREATE SOCKET\r\n"); COMM_Puts("AT+USOCR=6\r"); InitFindData(&cmp1,"OK"); InitFindData(&cmp2,"ERROR"); InitTimeout(&tOut,TIME_MS(3000)); while(CheckTimeout(&tOut)) { if(RINGBUF_Get(&commBuf,&c) == 0) { if(FindData(&cmp1,c) == 0) { if((socketMask[socket] == 0xff)) { break; } MODEM_Info("\r\nGSM->CREATE SOCKET OK\r\n"); return 0; } if(FindData(&cmp2,c) == 0) { break; } } } MODEM_Info("\r\nGSM->CREATE SOCKET FAILS\r\n"); return 0xff; }
int main(void) { uint32_t *u32Pt = (uint32_t *)buff; uint8_t *u8pt,u8temp; int32_t i = 10000000,j = 0; uint32_t u32temp; uint16_t u16temp; uint32_t res; uint8_t c; uint32_t timeOut = 3000000; uint8_t tryNum,exit; SysInit(); // RS232_PIN_SET_OUTPUT; // RS232_PIN_CLR; USART3_PutString("\r\n************************AMPM*********************\r\n"); USART3_PutString("\r\nHello!\r\n"); USART3_PutString("\r\nI'm GSM_STM32_BOOTLOADER\r\n"); USART3_PutString("\r\nMy Ver:V1.0\r\n"); USART3_PutString("\r\nhttp://ampm.com.vn\r\n"); USART3_PutString("\r\n************************START MAIN***************\r\n"); DelayMs(1000); InitTimeout(&bootDisTimeout,TIME_SEC(3)); InitTimeout(&bootLoginTimeout,TIME_SEC(1)); InitTimeout(&bootExitTimeout,TIME_SEC(10)); UART_ProtoRecv.dataPt = &USB_rxBuff[4]; UART_parserPacket.state = CFG_CMD_WAITING_SATRT_CODE; UART_parserPacket.lenMax = UART_PACKET_SIZE; FLASH_Unlock(); while((CheckTimeout(&bootDisTimeout) != TIMEOUT || bootMode) && CheckTimeout(&bootExitTimeout) != TIMEOUT ) // while(0) { if(bootMode == 0 && CheckTimeout(&bootLoginTimeout) == TIMEOUT) { USB_txBuff[0] = 0xCA; USB_txBuff[1] = 4; //length USB_txBuff[3] = 0x88; //opcode USB_txBuff[4] = 0xA5; USB_txBuff[5] = 0xA5; USB_txBuff[6] = 0xA5; USB_txBuff[7] = 0xA5; USB_txBuff[USB_txBuff[1] + 4] = CfgCalcCheckSum((uint8_t *)&USB_txBuff[4],USB_txBuff[1]); for(i = 0;i < USB_txBuff[1] + 4 + 1; i++) { USART3_PutChar(USB_txBuff[i]); } USB_rxBuff[0] = 0; InitTimeout(&bootLoginTimeout,TIME_SEC(2)); } while(RINGBUF_Get(&USART3_RxRingBuff,&c) == 0) { if(CfgParserPacket(&UART_parserPacket,&UART_ProtoRecv,c) == 0) { USB_rxBuff[0] = 0xCA; USB_rxBuff[1] = ((uint8_t *)&UART_ProtoRecv.length)[0]; USB_rxBuff[2] = ((uint8_t *)&UART_ProtoRecv.length)[1]; USB_rxBuff[3] = UART_ProtoRecv.opcode; UART_ProtoRecv.dataPt = &USB_rxBuff[4]; UART_parserPacket.state = CFG_CMD_WAITING_SATRT_CODE; UART_parserPacket.lenMax = UART_PACKET_SIZE; break; } } if(USB_rxBuff[0] == 0xCA) { USB_txBuff[1] = 0; USB_txBuff[2] = 0; USB_txBuff[3] = 0; switch(USB_rxBuff[3]) { case 0x12: InitTimeout(&bootExitTimeout,TIME_SEC(60)); u32Pt = (uint32_t *)&USB_rxBuff[4]; packetNo = *u32Pt; if(packetNo == 0xA5A5A5A5) { firmwareFileOffSet = 0; u32Pt = (uint32_t *)&USB_rxBuff[8]; firmwareFileSize = *u32Pt; USB_txBuff[1] = 12; //length USB_txBuff[3] = 0x12; //opcode USB_txBuff[4] = USB_rxBuff[4]; USB_txBuff[5] = USB_rxBuff[5]; USB_txBuff[6] = USB_rxBuff[6]; USB_txBuff[7] = USB_rxBuff[7]; //Max file size USB_txBuff[8] = USB_rxBuff[8]; USB_txBuff[9] = USB_rxBuff[9]; USB_txBuff[10] = USB_rxBuff[10]; USB_txBuff[11] = USB_rxBuff[11]; //Max packet size u16temp = UART_PACKET_SIZE - 4; USB_txBuff[12] = ((uint8_t *)&u16temp)[0]; //max packet size USB_txBuff[13] = ((uint8_t *)&u16temp)[1]; //max packet size USB_txBuff[14] = 0; //max packet size USB_txBuff[15] = 0; //max packet size } else { InitTimeout(&bootExitTimeout,TIME_SEC(10)); if(packetNo == firmwareFileOffSet) { firmwareFileOffSet += (UART_ProtoRecv.length - 4); u32temp = firmwareFileOffSet % FLASH_BUF_SIZE; for(i = 0;i < (UART_ProtoRecv.length - 4);i++) { flashBuff[(packetNo % FLASH_BUF_SIZE) + i] = USB_rxBuff[i + 8]; } if(u32temp == 0) { u32temp = USER_FLASH_START + firmwareFileOffSet - FLASH_BUF_SIZE; phase = 5; u32Pt = (uint32_t *)flashBuff; __disable_irq(); myFMC_Erase(u32temp); FMC_ProgramPage(u32temp,u32Pt); __enable_irq(); phase = 6; for(i = 0;i < FLASH_BUF_SIZE; i++) flashBuff[i] = 0xff; } else if(firmwareFileOffSet >= firmwareFileSize) { i = (firmwareFileOffSet / FLASH_BUF_SIZE)*FLASH_BUF_SIZE; u32temp = USER_FLASH_START + i; u32Pt = (uint32_t *)flashBuff; __disable_irq(); myFMC_Erase(u32temp); FMC_ProgramPage(u32temp,u32Pt); __enable_irq(); } } packetNo = firmwareFileOffSet; if(firmwareFileOffSet >= firmwareFileSize) { firmwareFileOffSet = 0; packetNo = 0x5A5A5A5A; InitTimeout(&bootExitTimeout,TIME_SEC(1)); } u8pt = (uint8_t *)&packetNo; USB_txBuff[1] = 4; //length USB_txBuff[3] = 0x12; //opcode USB_txBuff[4] = u8pt[0]; USB_txBuff[5] = u8pt[1]; USB_txBuff[6] = u8pt[2]; USB_txBuff[7] = u8pt[3]; } break; case 0xA5: FLASH_Lock(); SysDeInit(); execute_user_code(); break; case 0x88: bootMode = 1; break; default: USB_txBuff[1] = 4; //length USB_txBuff[3] = 0x33; //opcode USB_txBuff[4] = 0xA5; USB_txBuff[5] = 0xA5; USB_txBuff[6] = 0xA5; USB_txBuff[7] = 0xA5; break; } if(USB_txBuff[3]) { USB_txBuff[0] = 0xCA; USB_txBuff[USB_txBuff[1] + 4] = CfgCalcCheckSum((uint8_t *)&USB_txBuff[4],USB_txBuff[1]); for(i = 0;i < USB_txBuff[1] + 4 + 1; i++) { USART3_PutChar(USB_txBuff[i]); } } USB_rxBuff[0] = 0; UART_ProtoRecv.opcode = 0; } } u32Pt = (uint32_t *)buff; SST25_Init(); SST25_Read(FIRMWARE_INFO_ADDR + FIRMWARE_STATUS_OFFSET*4,buff,4); if(*u32Pt != 0x5A5A5A5A) { execute_user_code(); } USART3_PutString("\r\nPROGRAM NEW FIRMWARE*\r\n"); tryNum = 10; exit = 0; while(!exit && tryNum--) { SST25_Read(FIRMWARE_INFO_ADDR + FIRMWARE_CRC_OFFSET*4,buff,4); fileCrc = *u32Pt; SST25_Read(FIRMWARE_INFO_ADDR + FIRMWARE_FILE_SIZE_OFFSET*4,buff,4); fileSize = *u32Pt; if(fileSize < FIRMWARE_MAX_SIZE) { flashCheckSum = 0; for(i = 0; i < fileSize;i += PAGE_SIZE) { USART3_PutChar('*'); SST25_Read(i + FIRMWARE_BASE_ADDR,buff, PAGE_SIZE); for(j = 0 ; j < PAGE_SIZE;j++) { if(i + j < fileSize) flashCheckSum += buff[j]; else break; } myFMC_Erase(USER_FLASH_START + i); FMC_ProgramPage(USER_FLASH_START + i,u32Pt); SST25_Read(i + FIRMWARE_BASE_ADDR,buff, PAGE_SIZE); memAddr = USER_FLASH_START + i; if(memcmp(buff, (void*)memAddr , PAGE_SIZE) != NULL) break; } if(flashCheckSum == fileCrc) { USART3_PutString("\r\nFINISHED!\r\n"); SST25_Read(BASE_FIRMWARE_INFO_ADDR + FIRMWARE_STATUS_OFFSET*4,buff,4); if(*u32Pt != 0x5A5A5A5A) { tryNum = 10; while(tryNum--) { flashCheckSum = 0; for(i = 0; i < fileSize;i += 256) { SST25_Read(i + FIRMWARE_BASE_ADDR,buff, 256); SST25_Write(i + BASE_FIRMWARE_BASE_ADDR,buff, 256); SST25_Read(i + BASE_FIRMWARE_BASE_ADDR,flashBuff, 256); if(memcmp(buff,flashBuff,256) != NULL) { break; } } if(i >= fileSize) for(i = 0; i < fileSize;i += 256) { SST25_Read(i + BASE_FIRMWARE_BASE_ADDR,buff, 256); for(j = 0 ; j < 256;j++) { if(i + j < fileSize) flashCheckSum += buff[j]; else break; } } if(flashCheckSum == fileCrc) { SST25_Read(FIRMWARE_INFO_ADDR,buff, 256); SST25_Write(BASE_FIRMWARE_INFO_ADDR,buff, 256); SST25_Read(BASE_FIRMWARE_INFO_ADDR,flashBuff, 256); if(memcmp(buff,flashBuff,256) == NULL) { break; } } } } exit = 1; } } } if(exit == 0 && tryNum == 0xff) { USART3_PutString("\r\nFAIL!\r\n"); USART3_PutString("\r\nDOWNLOAD BACKUP FIRMWARE*\r\n"); tryNum = 10; exit = 0; while(!exit && tryNum--) { SST25_Read(BASE_FIRMWARE_INFO_ADDR + FIRMWARE_CRC_OFFSET*4,buff,4); fileCrc = *u32Pt; SST25_Read(BASE_FIRMWARE_INFO_ADDR + FIRMWARE_FILE_SIZE_OFFSET*4,buff,4); fileSize = *u32Pt; if(fileSize < FIRMWARE_MAX_SIZE) { flashCheckSum = 0; for(i = 0; i < fileSize;i += PAGE_SIZE) { USART3_PutChar('*'); SST25_Read(i + BASE_FIRMWARE_BASE_ADDR,buff, PAGE_SIZE); for(j = 0 ; j < PAGE_SIZE;j++) { if(i + j < fileSize) flashCheckSum += buff[j]; else break; } myFMC_Erase(USER_FLASH_START + i); FMC_ProgramPage(USER_FLASH_START + i,u32Pt); SST25_Read(i + BASE_FIRMWARE_BASE_ADDR,buff, PAGE_SIZE); memAddr = USER_FLASH_START + i; if(memcmp(buff, (void*)memAddr , PAGE_SIZE) != NULL) break; } if(flashCheckSum == fileCrc) { exit = 1; USART3_PutString("\r\nDOWNLOAD BACKUP FINISHED!\r\n"); } } } } SST25_Erase(FIRMWARE_INFO_ADDR,block4k); execute_user_code(); while(1) { } }
void MODEM_FlushBuffer(void) { uint8_t c; while(RINGBUF_Get(&commBuf, &c)==0); }
uint8_t MODEM_ConnectSocket(uint8_t socket,uint8_t *ip,uint16_t port,uint8_t useIp) { COMPARE_TYPE cmp1,cmp2; Timeout_Type tOut; uint8_t c,i; uint8_t buf[32]; DelayMs(100); MODEM_FlushBuffer(); socketMask[socket] = 0; for(i = 0; i < SOCKET_NUM;) { if(tcpSocketStatus[i] == SOCKET_OPEN) { if((socketMask[i] == socketMask[socket]) && (i != socket)) { socketMask[socket]++; i = 0; continue; } } i++; } MODEM_CloseSocket(socketMask[socket]); if(MODEM_CreateSocket(socket)) return 0xff; DelayMs(500); if(useIp == 0) { MODEM_Info("\r\nGSM->GET DOMAIN\r\n"); sprintf((char *)buf, "AT+UDNSRN=0,\"%s\"\r",ip); COMM_Puts(buf); if(MODEM_CheckResponse("OK", 5000)) { MODEM_Info("\r\nGSM->GET DOMAIN FAILS\r\n"); return 0xff; } ip = DNS_serverIp; } MODEM_Info("\r\nGSM->IP:%s\r\n",ip); MODEM_Info("\r\nGSM->CONNECT SOCKET:%d:%s:%d\r\n",socketMask[socket],ip,port); sprintf((char *)buf, "AT+USOCO=%d,\"%s\",%d\r",socketMask[socket],ip,port); COMM_Puts(buf); InitFindData(&cmp1,"OK"); InitFindData(&cmp2,"ERROR"); InitTimeout(&tOut,TIME_SEC(10)); while(CheckTimeout(&tOut)) { if(RINGBUF_Get(&commBuf,&c) == 0) { if(FindData(&cmp1,c) == 0) { MODEM_Info("\r\nGSM->CONNECT SOCKET OK\r\n"); return 0; } if(FindData(&cmp2,c) == 0) { break; } } } MODEM_Info("\r\nGSM->CONNECT SOCKET FAILS\r\n"); return 0xff; }
int32_t Long_Uart2_GetChar(char *c) { return RINGBUF_Get(&long_Uart0_RxRingBuf,c); }
uint8_t MODEM_GprsSendData(uint8_t socket,uint8_t *data,uint32_t length) { COMPARE_TYPE cmp1; Timeout_Type tOut; uint8_t buf[32],c; uint32_t i; uint32_t tryNum = 5; MODEM_FlushBuffer(); sprintf((char *)buf, "AT+USOWR=%d,%d\r",socketMask[socket],length); for(;;) { DelayMs(100); COMM_Puts(buf); InitTimeout(&tOut,TIME_MS(5000)); InitFindData(&cmp1,"@"); while(CheckTimeout(&tOut)) { if(RINGBUF_Get(&commBuf,&c) == 0) { if(FindData(&cmp1,c) == 0) { break; } } } if(CheckTimeout(&tOut) == TIMEOUT) { tryNum --; if(tryNum == 0) { tcpSocketStatus[socket] = SOCKET_CLOSE; return 0xff; } continue; } i = length; for(i = 0; i < length ;i++) { COMM_Putc(data[i]); } InitTimeout(&tOut,TIME_MS(5000)); InitFindData(&cmp1,"OK"); while(CheckTimeout(&tOut)) { if(RINGBUF_Get(&commBuf,&c) == 0) { if(FindData(&cmp1,c) == 0) { MODEM_Info("\r\nGSM->%s OK\r\n",buf); DelayMs(100); return 0; } } } MODEM_Info("\r\nGSM->%s FAILS\r\n",buf); tryNum --; if(tryNum == 0) { tcpSocketStatus[socket] = SOCKET_CLOSE; return 0xff; } } }