示例#1
0
/*
+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;
}
示例#2
0
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;
}
示例#3
0
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);
			}
		}
}
示例#5
0
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);
	}
}
示例#7
0
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;
}
示例#8
0
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;
}
示例#10
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;
}
示例#11
0
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;
}
示例#12
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;
}
示例#13
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;
}
示例#14
0
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;
}
示例#15
0
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;
}
示例#16
0
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;
}
示例#17
0
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)
	{
	}
}
示例#18
0
void MODEM_FlushBuffer(void)
{
	uint8_t c;
	while(RINGBUF_Get(&commBuf, &c)==0);
}
示例#19
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);
}
示例#21
0
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;
		}
	}
}