#include "bcomdef.h" #include "OSAL.h" #include "OSAL_PwrMgr.h" #include "OnBoard.h" #include "hal_led.h" #include "hal_key.h" #include "hal_lcd.h" #include "gatt.h" #include "ll.h" #include "hci.h" #include "gapgattserver.h" #include "gattservapp.h" #include "central.h" #include "peripheral.h" #include "gapbondmgr.h" #include "simpleGATTprofile.h" #include "npi.h" #include "osal_snv.h" #include "simpleBLE.h" #include "stdio.h" SYS_CONFIG sys_config; static bool g_bToConnect = FALSE; extern gaprole_States_t gapProfileState; static void simpleBLE_NpiSerialCallback( uint8 port, uint8 events ); static void simpleBLE_UartDataMain(uint8 *buf, uint8 numBytes); static bool simpleBLE_AT_CMD_Handle(uint8 *pBuffer, uint16 length); #if defined (AUTO_UART2UART) static void simpleBLE_SendMyData_ForTest(); #endif void Serial_Delay(int times) { while(times--) { int i=0; for(i=6000; i>0; i--) { asm("nop"); } } } static uint8 str_cmp(uint8 *p1,uint8 *p2,uint8 len) { uint8 i=0; while(i 0; i-- ) { *pStr++ = hex[*--pAddr >> 4]; *pStr++ = hex[*pAddr & 0x0F]; } *pStr = 0; return str; } void simpleBLE_SaveAllDataToFlash() { osal_snv_write(0x80, sizeof(SYS_CONFIG), &sys_config); } void simpleBLE_SetAllParaDefault(PARA_SET_FACTORY flag) { if(flag == PARA_ALL_FACTORY) { sys_config.baudrate = HAL_UART_BR_9600; // sys_config.baudrate = HAL_UART_BR_115200; sys_config.parity = 0; sys_config.stopbit = 0; sys_config.mode = BLE_MODE_SERIAL; sprintf((char*)sys_config.name, "VMI_TEST"); sys_config.role = BLE_ROLE_PERIPHERAL; // sys_config.role = BLE_ROLE_CENTRAL; sprintf((char*)sys_config.pass, "000000"); sys_config.type = 0; // sys_config.mac_addr[16]; sys_config.connl_status = 0; sys_config.connect_mac_status = 0; // sys_config.ever_connect_mac_status[MAX_PERIPHERAL_MAC_ADDR][13]; osal_memset(sys_config.ever_connect_mac_status, 0, MAX_PERIPHERAL_MAC_ADDR*13); sprintf((char*)sys_config.verion, "%s", VERSION); sys_config.try_connect_time_ms = 0; sys_config.rssi = 0; sys_config.rxGain = HCI_EXT_RX_GAIN_STD; sys_config.txPower = 0; sys_config.ibeacon_adver_time_ms = 500; sys_config.workMode = 0; } else if(flag == PARA_PARI_FACTORY) { osal_memset(sys_config.ever_connect_mac_status, 0, MAX_PERIPHERAL_MAC_ADDR*13); sprintf((char*)sys_config.verion, "%s", VERSION); } } void PrintAllPara(void) { #define SERIAL_DELAY Serial_Delay(10) char strTemp[32]; uint8 i; sprintf(strTemp, "sys_config.baudrate = %d\r\n", sys_config.baudrate); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); SERIAL_DELAY; sprintf(strTemp, "sys_config.parity = %d\r\n", sys_config.parity); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); SERIAL_DELAY; sprintf(strTemp, "sys_config.stopbit = %d\r\n", sys_config.stopbit); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); SERIAL_DELAY; sprintf(strTemp, "sys_config.mode = %d\r\n", sys_config.mode); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); SERIAL_DELAY; sprintf(strTemp, "sys_config.name = %s\r\n", sys_config.name); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); SERIAL_DELAY; sprintf(strTemp, "sys_config.role = %d\r\n", sys_config.role); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); SERIAL_DELAY; sprintf(strTemp, "sys_config.pass = %s\r\n", sys_config.pass); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); SERIAL_DELAY; sprintf(strTemp, "sys_config.type = %d\r\n", sys_config.type); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); SERIAL_DELAY; sprintf(strTemp, "sys_config.mac_addr = %s\r\n", sys_config.mac_addr); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); SERIAL_DELAY; sprintf(strTemp, "sys_config.connl_status = %d\r\n", sys_config.connl_status); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); SERIAL_DELAY; sprintf(strTemp, "sys_config.connect_mac_status = %d\r\n", sys_config.connect_mac_status); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); SERIAL_DELAY; //sys_config.ever_connect_mac_status[MAX_PERIPHERAL_MAC_ADDR][13]; for(i = 0; i readMaxBytes) { sendBytes = readMaxBytes; } else { sendBytes = numBytes; } if(!simpleBLE_IfConnected()) { //numBytes = NpiReadBuffer(buf, sizeof(buf)); //NpiClearBuffer(); NPI_ReadTransport(buffer,sendBytes); if(sendBytes > 2 && buffer[sendBytes-2] == '\r' && buffer[sendBytes-1] == '\n') { ret = simpleBLE_AT_CMD_Handle(buffer, sendBytes); } else { ret = FALSE; } if(ret == FALSE) { char strTemp[12]; sprintf(strTemp, "ERROR\r\n"); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); } } else { if((GetBleRole() == BLE_ROLE_CENTRAL) && simpleBLEChar6DoWrite && simpleBLECentralCanSend ) { char strTemp[24]; NPI_ReadTransport(buffer,sendBytes); if((sendBytes == 10) && str_cmp(buffer, "AT+RSSI?\r\n", 10))//AT+RSSI\r\n { sprintf(strTemp, "OK+RSSI:%d\r\n", sys_config.rssi); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); } else { //LCD_WRITE_STRING_VALUE( "sendBytes=", sendBytes, 10, HAL_LCD_LINE_1 ); simpleBLE_UartDataMain(buffer,sendBytes); } } else if((GetBleRole() == BLE_ROLE_PERIPHERAL) && simpleBLEChar6DoWrite2) { //LCD_WRITE_STRING_VALUE( "sendBytes=", sendBytes, 10, HAL_LCD_LINE_1 ); NPI_ReadTransport(buffer,sendBytes); simpleBLE_UartDataMain(buffer,sendBytes); } else { NPI_ReadTransport(buffer,sendBytes); } } old_time = new_time; old_time_data_len = numBytes - sendBytes; osal_mem_free(buffer); } } } } void simpleBLE_UartDataMain(uint8 *buf, uint8 numBytes) { if(GetBleRole() == BLE_ROLE_CENTRAL ) { if(simpleBLEChar6DoWrite && ( simpleBLECharHd6 != 0) && simpleBLECentralCanSend) { attWriteReq_t AttReq; LCD_WRITE_STRING_VALUE( "s=", numBytes, 10, HAL_LCD_LINE_1 ); simpleBLEChar6DoWrite = FALSE; AttReq.handle = simpleBLECharHd6; AttReq.len = numBytes; AttReq.sig = 0; AttReq.cmd = 0; osal_memcpy(AttReq.value,buf,numBytes); GATT_WriteCharValue( 0, &AttReq, simpleBLETaskId ); } else { LCD_WRITE_STRING_VALUE( "simpleBLEChar6DoWrite=", simpleBLEChar6DoWrite, 10, HAL_LCD_LINE_1 ); LCD_WRITE_STRING_VALUE( "simpleBLECharHd6=", simpleBLECharHd6, 10, HAL_LCD_LINE_1 ); } } else { if(simpleBLEChar6DoWrite2) { #if 0 simpleBLEChar6DoWrite2 = FALSE; SimpleProfile_SetParameter( SIMPLEPROFILE_CHAR6,numBytes, buf ); #else static attHandleValueNoti_t pReport; pReport.len = numBytes; pReport.handle = 0x0035; osal_memcpy(pReport.value, buf, numBytes); GATT_Notification( 0, &pReport, FALSE ); #endif } else { LCD_WRITE_STRING_VALUE( "simpleBLEChar6DoWrite=", simpleBLEChar6DoWrite2, 10, HAL_LCD_LINE_1 ); } } } #endif #if 1 bool simpleBLE_AT_CMD_Handle(uint8 *pBuffer, uint16 length) { bool ret = TRUE; char strTemp[64]; uint8 i; uint8 temp8; bool restart = FALSE; //NPI_WriteTransport((uint8*)pBuffer, length); if((length == 4) && str_cmp(pBuffer, "AT\r\n", 4))//AT { sprintf(strTemp, "OK\r\n"); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); } else if((length == 8) && str_cmp(pBuffer, "AT+ALL\r\n", 8))//AT { PrintAllPara(); } else if((length == 10) && str_cmp(pBuffer, "AT+BAUD", 7)) { switch(pBuffer[7]) { case '?': sprintf(strTemp, "OK+Get:%d\r\n", sys_config.baudrate); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); break; case '0': case '1': case '2': case '3': case '4': sys_config.baudrate = pBuffer[7] - '0'; osal_snv_write(0x80, sizeof(SYS_CONFIG), &sys_config); sprintf(strTemp, "OK+Set:%d\r\n", sys_config.baudrate); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); restart = TRUE; break; default: ret = FALSE; break; } } else if((length == 10) && str_cmp(pBuffer, "AT+PARI", 7)) { switch(pBuffer[7]) { case '?': sprintf(strTemp, "OK+Get:%d\r\n", sys_config.parity); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); break; case '0': case '1': case '2': sys_config.parity = pBuffer[7] - '0'; osal_snv_write(0x80, sizeof(SYS_CONFIG), &sys_config); sprintf(strTemp, "OK+Set:%d\r\n", sys_config.parity); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); restart = TRUE; break; default: ret = FALSE; break; } } else if((length == 10) && str_cmp(pBuffer, "AT+STOP", 7)) { switch(pBuffer[7]) { case '?': sprintf(strTemp, "OK+Get:%d\r\n", sys_config.stopbit); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); break; case '0': case '1': sys_config.stopbit = pBuffer[7] - '0'; osal_snv_write(0x80, sizeof(SYS_CONFIG), &sys_config); sprintf(strTemp, "OK+Set:%d\r\n", sys_config.stopbit); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); restart = TRUE; break; default: ret = FALSE; break; } } else if((length == 10) && str_cmp(pBuffer, "AT+MODE", 7)) { switch(pBuffer[7]) { case '?': sprintf(strTemp, "OK+Get:%d\r\n", sys_config.mode); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); break; case '0': case '1': case '2': sys_config.mode = pBuffer[7] - '0'; osal_snv_write(0x80, sizeof(SYS_CONFIG), &sys_config); sprintf(strTemp, "OK+Set:%d\r\n", sys_config.mode); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); restart = TRUE; break; default: ret = FALSE; break; } } else if((length >=10 && length <= 20) && str_cmp(pBuffer, "AT+NAME", 7)) { //int nameLen = length - 7; switch(pBuffer[7]) { case '?': sprintf(strTemp, "OK+Get:%s\r\n", sys_config.name); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); break; default: osal_memset(sys_config.name, 0, sizeof(sys_config.name)); osal_memcpy(sys_config.name, pBuffer + 7, length - 7); osal_snv_write(0x80, sizeof(SYS_CONFIG), &sys_config); sprintf(strTemp, "OK+Set:%s\r\n", sys_config.name); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); restart = TRUE; break; } } else if((length == 10) && str_cmp(pBuffer, "AT+RENEW", 8)) { sprintf(strTemp, "OK+RENEW\r\n"); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); simpleBLE_SetAllParaDefault(PARA_ALL_FACTORY); osal_snv_write(0x80, sizeof(SYS_CONFIG), &sys_config); restart = TRUE; } else if((length == 10) && str_cmp(pBuffer, "AT+RESET", 8)) { restart = TRUE; } else if((length == 10) && str_cmp(pBuffer, "AT+ROLE", 7)) { switch(pBuffer[7]) { case '?': sprintf(strTemp, "OK+Get:%d\r\n", sys_config.role); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); break; case '0': case '1': temp8 = pBuffer[7] - '0'; if(temp8 == 0) { sys_config.role = BLE_ROLE_PERIPHERAL; } else { sys_config.role = BLE_ROLE_CENTRAL; } osal_snv_write(0x80, sizeof(SYS_CONFIG), &sys_config); sprintf(strTemp, "OK+Set:%d\r\n", sys_config.role); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); restart = TRUE; break; default: ret = FALSE; break; } } else if(((length == 10) && str_cmp(pBuffer, "AT+PASS?", 8)) || ((length == 15) && str_cmp(pBuffer, "AT+PASS", 7))) { switch(pBuffer[7]) { case '?': sprintf(strTemp, "OK+PASS:%s\r\n", sys_config.pass); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); break; default: osal_memcpy(sys_config.pass, pBuffer + 7, 6); sys_config.pass[6] = 0; osal_snv_write(0x80, sizeof(SYS_CONFIG), &sys_config); sprintf(strTemp, "OK+Set:%s\r\n", sys_config.pass); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); break; } } else if((length == 10) && str_cmp(pBuffer, "AT+TYPE", 7)) { switch(pBuffer[7]) { case '?': sprintf(strTemp, "OK+Get:%d\r\n", sys_config.type); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); break; case '0': case '1': sys_config.type = pBuffer[7] - '0'; osal_snv_write(0x80, sizeof(SYS_CONFIG), &sys_config); sprintf(strTemp, "OK+Set:%d\r\n", sys_config.type); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); restart = TRUE; break; default: ret = FALSE; break; } } else if((length >= 10) && str_cmp(pBuffer, "AT+ADDR?", 8)) { sprintf(strTemp, "OK+LADD:%s\r\n", sys_config.mac_addr); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); } else if((length == 10) && str_cmp(pBuffer, "AT+CONNL", 8)) { uint8 para[4] = {'L','N','E','F'}; int8 id = 0; if(sys_config.connect_mac_addr[0] != 0) { id = 0; simpleBLE_SetToConnectFlag(TRUE); } else { id = 3; } sprintf(strTemp, "AT+CONN%c\r\n", para[id]); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); } else if((length == 20) && str_cmp(pBuffer, "AT+CON", 6)) { uint8 para[3] = {'A','E','F'}; uint8 id = 0; osal_memcpy(sys_config.connect_mac_addr, pBuffer+6, MAC_ADDR_CHAR_LEN); osal_snv_write(0x80, sizeof(SYS_CONFIG), &sys_config); //if(simpleBLE_GetToConnectFlag == FALSE) { simpleBLE_SetToConnectFlag(TRUE); id = 0; } //if(sys_config.connect_mac_status > 2) // sys_config.connect_mac_status = 2; sprintf(strTemp, "AT+CONN%c\r\n", para[id]); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); } else if((length == 10) && str_cmp(pBuffer, "AT+CLEAR", 8)) { simpleBLE_SetAllParaDefault(PARA_PARI_FACTORY); osal_snv_write(0x80, sizeof(SYS_CONFIG), &sys_config); //PrintAllPara(); sprintf(strTemp, "OK+CLEAR\r\n"); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); } else if((length == 10) && str_cmp(pBuffer, "AT+RADD?", 8)) { for(i = 0; i 3) sys_config.txPower = 0; osal_snv_write(0x80, sizeof(SYS_CONFIG), &sys_config); sprintf(strTemp, "OK+Set:%d\r\n", sys_config.txPower); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); HCI_EXT_SetTxPowerCmd(sys_config.txPower); restart = TRUE; } } else if((length == 10 || length == 15) && str_cmp(pBuffer, "AT+TIBE", 7)) { if(pBuffer[7] == '?') { sprintf(strTemp, "AT+TIBE:%06d\r\n", sys_config.ibeacon_adver_time_ms); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); } else { sys_config.ibeacon_adver_time_ms = str2Num(pBuffer+7, 6); if(sys_config.ibeacon_adver_time_ms <= 9999) { osal_snv_write(0x80, sizeof(SYS_CONFIG), &sys_config); sprintf(strTemp, "OK+Set:%06d\r\n", sys_config.ibeacon_adver_time_ms); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); restart = TRUE; } } } else if((length == 10) && str_cmp(pBuffer, "AT+IMME", 7)) { if(pBuffer[7] == '?') { sprintf(strTemp, "OK+Get:%d\r\n", sys_config.workMode); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); } else { sys_config.workMode = str2Num(pBuffer+7, 1); if(sys_config.workMode <= 1) { osal_snv_write(0x80, sizeof(SYS_CONFIG), &sys_config); sprintf(strTemp, "OK+Set:%d\r\n", sys_config.workMode); NPI_WriteTransport((uint8*)strTemp, osal_strlen(strTemp)); } restart = TRUE; } } else { ret = FALSE; } if(restart) { Serial_Delay(100); HAL_SYSTEM_RESET(); } return ret; } #endif #if defined (AUTO_UART2UART) void simpleBLE_SendMyData_ForTest() { static uint8 count_100ms = 0; uint8 numBytes; count_100ms++; if(count_100ms == 10) { char strTemp[24] = {0}; if((GetBleRole() == BLE_ROLE_CENTRAL) && simpleBLEChar6DoWrite && simpleBLECentralCanSend) { sprintf(strTemp, "[%8ldms]Amo1\r\n", osal_GetSystemClock()); numBytes = (osal_strlen(strTemp) > SIMPLEPROFILE_CHAR6_LEN) ? SIMPLEPROFILE_CHAR6_LEN : osal_strlen(strTemp); simpleBLE_UartDataMain((uint8*)strTemp, numBytes); } else if((GetBleRole() == BLE_ROLE_PERIPHERAL) && simpleBLEChar6DoWrite2) { sprintf(strTemp, "[%8ldms]Amo2\r\n", osal_GetSystemClock()); simpleBLE_UartDataMain((uint8*)strTemp, numBytes); } count_100ms = 0; } } #endif