Library for Bluetooth Low Energy Module ble 4.0 HM-11
Diff: hm11.cpp
- Revision:
- 7:aa4675590203
- Parent:
- 6:16801af75937
--- a/hm11.cpp Sun Feb 07 18:27:04 2016 +0000 +++ b/hm11.cpp Thu Feb 25 02:44:30 2016 +0000 @@ -98,46 +98,43 @@ return mSerial.readable(); } - bool HM11::copyAvailableDataToBuf(uint8_t *buf, uint8_t bufLength) + int HM11::copyAvailableDataToBuf(uint8_t *buf, uint8_t bufLength) { int lenCounter =0; if(buf==NULL||bufLength<1) - return false; + return -1; while(isRxDataAvailable()&&lenCounter<bufLength){ buf[lenCounter++]=getDataFromRx(); } - if(lenCounter==bufLength) - return true; - else - return false; + return lenCounter; } - - void HM11::hexToString(uint32_t hex, char*str,uint8_t len) + bool HM11:: hexToString(uint32_t hex, char*str,uint8_t nrOfNibblesInHex) { - if(len>8||str==NULL) - return; - for(int i=0;i<len;i++){ + if(nrOfNibblesInHex>8||nrOfNibblesInHex==0||str==NULL) + return false; + for(int i=0;i<nrOfNibblesInHex;i++){ int temp =(hex>>(i*4))&0x0F; if(temp>=0&&temp<=9) { - str[i]=temp+'0'; + str[nrOfNibblesInHex-i-1]=temp+'0'; } else { - str[i]=temp+'A'-10; + str[nrOfNibblesInHex-i-1]=temp+'A'-10; } } + return true; } //returns hex in reverse direction - uint32_t HM11::strToHex(char*str,uint8_t len) + uint32_t HM11::strToHex(char*const str,uint8_t len) //len - nr of nibbles in str { uint32_t ret=0; uint8_t temp; - if(len<1||str==NULL) - return -1; + if(len<1||len>8||str==NULL) + return 0xFFFFFFFF; for(int i=0;i<len&&str[i]!='\0';i++) { @@ -157,7 +154,7 @@ ret|=temp<<(i*4); } else - return -1; //0xFFFFFFFF + return 0xFFFFFFFF; //-1 :-) } return ret; } @@ -188,6 +185,7 @@ flushBuffers(); char buf[9]={"AT+ADVI"}; hexToString((uint32_t)advInt, &buf[7],1); + buf[8]='\0'; sendDataToDevice(buf); if(!waitForData(WAIT_FOR_DATA_TIMEOUT_MS)) return false; @@ -231,6 +229,7 @@ flushBuffers(); char buf[9]={"AT+ADTY"}; hexToString((uint32_t)advInt, &buf[7],1); + buf[8]='\0'; sendDataToDevice(buf); if(!waitForData(WAIT_FOR_DATA_TIMEOUT_MS)) return false; @@ -273,6 +272,7 @@ flushBuffers(); char buf[9]={"AT+ANCS"}; hexToString(enable, &buf[7],1); + buf[8]='\0'; sendDataToDevice(buf); if(!waitForData(WAIT_FOR_DATA_TIMEOUT_MS)) return false; @@ -316,6 +316,7 @@ flushBuffers(); char buf[9]={"AT+ALLO"}; hexToString(enable, &buf[7],1); + buf[8]='\0'; sendDataToDevice(buf); if(!waitForData(WAIT_FOR_DATA_TIMEOUT_MS)) return false; @@ -352,16 +353,61 @@ return retVal; } -//TODO - // bool HM11::setWhitelistMacAddress (uint8_t nrOfMacAddrLinkedToModule, const char* macAddress); + + bool HM11::setWhitelistMacAddress (uint8_t nrOfMacAddrLinkedToModule, const char* const macAddress) + { + if(nrOfMacAddrLinkedToModule>3 ||macAddress ==NULL) + { + return false; + } + char buf[19]={"AT+AD"}; + flushBuffers(); + hexToString(nrOfMacAddrLinkedToModule, &buf[5],1); + memcpy(&buf[6],macAddress,12); + buf[18]='\0'; + sendDataToDevice(buf); + if(!waitForData(WAIT_FOR_DATA_TIMEOUT_MS)) + return false; + else + { + copyAvailableDataToBuf((uint8_t*)buf,sizeof(buf)); + if(strncmp(buf,"OK+AD",5) == 0){ + return true; + } + return false; + } + } - // char* HM11::queryWhitelistMacAddress(uint8_t nrOfMacAddrLinkedToModule); + bool HM11::queryWhitelistMacAddress(uint8_t nrOfMacAddrLinkedToModule, char* const macAddrBuf, uint8_t macAddrBufLen) + { + + if(macAddrBuf==NULL||nrOfMacAddrLinkedToModule>3||macAddrBufLen<12) //12 -len of macAddr eg. 001122334455 + return false; + flushBuffers(); + char buf[20]={"AT+ADx??"}; + buf[8]='\0'; + hexToString(nrOfMacAddrLinkedToModule, &buf[5],1); + sendDataToDevice(buf); + if(!waitForData(WAIT_FOR_DATA_TIMEOUT_MS)) + return false; + else + { + copyAvailableDataToBuf((uint8_t*)buf,sizeof(buf)); + if(strncmp(buf,"OK+AD",5) == 0){ + memcpy(macAddrBuf,&buf[8],12); + return true; + } + return false; + } + + } bool HM11::setBatteryMonitorSwitch(uint8_t battSwitchEnable) { flushBuffers(); - char buf[9]={"AT+BATC"}; + char buf[9]={"AT+BATCx"}; + buf[8]='\0'; hexToString(battSwitchEnable, &buf[7],1); sendDataToDevice(buf); if(!waitForData(WAIT_FOR_DATA_TIMEOUT_MS)) @@ -400,90 +446,368 @@ } -#if 0 - uint8_t HM11::queryBatteryInformation(void); + + uint8_t HM11::queryBatteryInformation(void) + { + flushBuffers(); + uint8_t retVal=0xFF; + char respBuf[12]; + sendDataToDevice("AT+BATT?"); + if(!waitForData(WAIT_FOR_DATA_TIMEOUT_MS)) + { + retVal=0xFF; + } + else + { + copyAvailableDataToBuf((uint8_t*)respBuf,sizeof(respBuf)); + if(strncmp(respBuf,"OK+BATT:",7) == 0){ + retVal=strToHex(&respBuf[7],3); + } + } + return retVal; + + } - bool HM11::setIBeaconIntoServiceMode(void); - - - - bool HM11::setBitFormat(uint8_t bit7Format); - - - uint8_t HM11::queryBitFormat(void); - - - - bool HM11::setBaudRate(BaudRate_t baud); - - - - BaudRate_t HM11::queryBaudRate(void); - - - bool HM11::setCharacteristic(uint16_t chValue); - - - - uint16_t HM11::queryCharacteristic(void); - - - ConnectionStatus_t HM11::connectToLastDevice(void); - - - - ConnectionStatus_t HM11::connectToAnAddress(const char* address); - - - uint8_t HM11::queryInputOutputState(void); - - - bool HM11::setPioCollectionRate (uint8_t colRateSec); - - - uint8_t HM11::queryPioCollectionRate(void); - - - bool HM11::startDeviceDiscoveryScan(ScanResult_t* scanRes); + bool HM11::setIBeaconIntoServiceMode(void) //NOT USED ANYMORE + { + flushBuffers(); + sendDataToDevice("AT+BUSHU"); + char respBuf[10]; + if(!waitForData(WAIT_FOR_DATA_TIMEOUT_MS)) + { + return false; + } + else + { + copyAvailableDataToBuf((uint8_t*)respBuf,sizeof(respBuf)); + if(strncmp(respBuf,"OK+BUSHU",7) == 0) + { + return true; + } + } + return false; + + } - bool HM11::connectToDiscoveryDevice(ScanResult_t* scanRes); + bool HM11::setBitFormat(uint8_t bit7Format) + { + if(bit7Format>1) + return false; + flushBuffers(); + char buf[9]={"AT+BIT7x"}; + buf[8]='\0'; + hexToString(bit7Format, &buf[7],1); + sendDataToDevice(buf); + if(!waitForData(WAIT_FOR_DATA_TIMEOUT_MS)) + return false; + else + { + copyAvailableDataToBuf((uint8_t*)buf,sizeof(buf)); + if(strncmp(buf,"OK+Set:",7) == 0){ + if(strToHex(&buf[7],1)<0x2){ + return true; + } + } + return false; + } + } + + + uint8_t HM11::queryBitFormat(void) + { + flushBuffers(); + uint8_t retVal=0xFF; + char respBuf[8]; + sendDataToDevice("AT+BIT7?"); + if(!waitForData(WAIT_FOR_DATA_TIMEOUT_MS)) + { + retVal=0xFF; + } + else + { + copyAvailableDataToBuf((uint8_t*)respBuf,sizeof(respBuf)); + if(strncmp(respBuf,"OK+Get:",7) == 0){ + retVal=strToHex(&respBuf[7],1); + } + } + return retVal; + } + + + + bool HM11::setBaudRate(BaudRate_t baud) + { + if(baud >=_INVALID_BAUDRATE) + return false; + flushBuffers(); + char buf[9]={"AT+BAUDx"}; + hexToString((uint32_t)baud, &buf[7],1); + buf[8]='\0'; + sendDataToDevice(buf); + if(!waitForData(WAIT_FOR_DATA_TIMEOUT_MS)) + return false; + else + { + copyAvailableDataToBuf((uint8_t*)buf,sizeof(buf)); + if(strncmp(buf,"OK+Set:",7) == 0){ + if(strToHex(&buf[7],1)<_INVALID_BAUDRATE){ + return true; + } + } + return false; + } + } + + + BaudRate_t HM11::queryBaudRate(void) + { + flushBuffers(); + BaudRate_t retVal=_INVALID_BAUDRATE; + char respBuf[8]; + sendDataToDevice("AT+BAUD?"); + if(!waitForData(WAIT_FOR_DATA_TIMEOUT_MS)) + { + //nothing + } + else + { + copyAvailableDataToBuf((uint8_t*)respBuf,sizeof(respBuf)); + if(strncmp(respBuf,"OK+Get:",7) == 0){ + retVal=(BaudRate_t)strToHex(&respBuf[7],1); + } + + } + return retVal; + } + + + bool HM11::setCharacteristic(uint16_t chValue) + { + if(chValue <0x0001||chValue>0xFFFE) + return false; + flushBuffers(); + char buf[14]={"AT+CHAR0xiiii"}; + hexToString((uint32_t)chValue, &buf[9],4); + buf[13]='\0'; + sendDataToDevice(buf); + if(!waitForData(WAIT_FOR_DATA_TIMEOUT_MS)) + return false; + else + { + copyAvailableDataToBuf((uint8_t*)buf,sizeof(buf)); + if(strncmp(buf,"OK+Set:0x",9) == 0){ + return true; + + } + return false; + } + } + uint16_t HM11::queryCharacteristic(void) + { + flushBuffers(); + uint16_t retVal=0xFFFF; + char respBuf[14]; + sendDataToDevice("AT+CHAR?"); + if(!waitForData(WAIT_FOR_DATA_TIMEOUT_MS)) + { + //nothing + } + else + { + copyAvailableDataToBuf((uint8_t*)respBuf,sizeof(respBuf)); + if(strncmp(respBuf,"OK+Get:0x",9) == 0){ + retVal=(uint16_t)strToHex(&respBuf[9],4); + } + } + return retVal; + } + + + ConnectionStatus_t HM11::connectToLastDevice(void) + { + + ConnectionStatus_t retVal= _INVALID_CONECTIONSTATUS; + flushBuffers(); + char buf[9]={"AT+CONNL"}; + buf[8]='\0'; + sendDataToDevice(buf); + if(!waitForData(WAIT_FOR_DATA_TIMEOUT_MS*5)) + { + //nothing + } + else + { + copyAvailableDataToBuf((uint8_t*)buf,sizeof(buf)); + if(strncmp(buf,"OK+CONN",7) == 0){ + for(int i=0; i<_INVALID_CONECTIONSTATUS ;++i){ + if(strncmp(&buf[7],&ConnectionStatusArr[i],1) == 0) + retVal= ( ConnectionStatus_t)i; + } + } + } + return retVal; + } + + ConnectionStatus_t HM11::connectToAnAddress(const char* const macAddress) + { + ConnectionStatus_t retVal= _INVALID_CONECTIONSTATUS; + if(macAddress ==NULL) + { + return retVal; + } + flushBuffers(); + char buf[19]={"AT+CON"}; + memcpy(&buf[6],macAddress,12); + buf[18]='\0'; + sendDataToDevice(buf); + if(!waitForData(WAIT_FOR_DATA_TIMEOUT_MS*5)) + { + //nothing + } + else + { + copyAvailableDataToBuf((uint8_t*)buf,sizeof(buf)); + if(strncmp(buf,"OK+CONN",7) == 0){ + for(int i=0; i<_INVALID_CONECTIONSTATUS ;++i){ + if(strncmp(&buf[7],&ConnectionStatusArr[i],1) == 0) + retVal= ( ConnectionStatus_t)i; + } + } + } + return retVal; + } + + + uint8_t HM11::queryInputOutputState(void) + { + flushBuffers(); + uint8_t retVal=0xFF; + char respBuf[12]; + sendDataToDevice("AT+COL??"); + if(!waitForData(WAIT_FOR_DATA_TIMEOUT_MS)) + { + //nothing + } + else + { + copyAvailableDataToBuf((uint8_t*)respBuf,sizeof(respBuf)); + if(strncmp(respBuf,"OK+Col:0x",9) == 0){ + retVal=(uint8_t)strToHex(&respBuf[9],2); + } + } + return retVal; + + + } + + + bool HM11::setPioCollectionRate (uint8_t colRateSec) + { + if(colRateSec>90) + return false; + flushBuffers(); + char buf[9]={"AT+CYCxx"}; + hexToString((uint32_t)colRateSec, &buf[6],2); + buf[8]='\0'; + sendDataToDevice(buf); + if(!waitForData(WAIT_FOR_DATA_TIMEOUT_MS)) + return false; + else + { + copyAvailableDataToBuf((uint8_t*)buf,sizeof(buf)); + if(strncmp(buf,"OK+Set:",7) == 0){ + uint8_t secVal= (uint8_t)strToHex(&buf[7],2); + //if(secVal==colRateSec) + return true; + } + } + return false; + } + + + uint8_t HM11::queryPioCollectionRate(void) + { + flushBuffers(); + uint8_t retVal=0xFF; + char respBuf[12]; + sendDataToDevice("AT+CYC??"); + if(!waitForData(WAIT_FOR_DATA_TIMEOUT_MS)) + { + //nothing + } + else + { + copyAvailableDataToBuf((uint8_t*)respBuf,sizeof(respBuf)); + if(strncmp(respBuf,"OK+Get:",7) == 0){ + retVal=(uint8_t)strToHex(&respBuf[7],2); + } + } + return retVal; + } + + + #if 0 + bool HM11::startDeviceDiscoveryScan(ScanResult_t* scanRes) + { + + } + + + bool HM11::connectToDiscoveryDevice(ScanResult_t* scanRes) + { + + } - bool HM11::setIBeaconDeployMode(DeployMode_t depMode); - + bool HM11::setIBeaconDeployMode(DeployMode_t depMode) + { + + } - bool HM11::setFilterOfHmModules(FilterOfHmModules_t filter); - + bool HM11::setFilterOfHmModules(FilterOfHmModules_t filter) + { + + } - FilterOfHmModules_t HM11::queryFilterOfHmModules(void); - + FilterOfHmModules_t HM11::queryFilterOfHmModules(void) + { + + } - bool HM11::removeBondInformation(void); - + bool HM11::removeBondInformation(void) + { + + } - bool HM11::getSystemHelpInformation(char* helpInformationBuf); - + bool HM11::getSystemHelpInformation(char* helpInformationBuf) + { + + } - bool HM11::setModuleWorkType(ModuleWorkType_t modWorkType); - + bool HM11::setModuleWorkType(ModuleWorkType_t modWorkType) + { + + } - ModuleWorkType_t HM11::queryModuleWorkType(void); - + ModuleWorkType_t HM11::queryModuleWorkType(void) + { + + } - bool HM11::setModuleIBeaconSwitch (uint8_t turnOnOff); + bool HM11::setModuleIBeaconSwitch (uint8_t turnOnOff) uint8_t HM11::queryModuleIBeaconSwitch (void); @@ -644,7 +968,7 @@ - SensorType_t HM11::querySensorTypeOnModulePio(void); + SensorType_t HM11::querySensorTypeOnModulePio(void); bool HM11::setDiscoveryParameter (SensorType_t discoverParam); @@ -697,7 +1021,24 @@ uint8_t HM11::queryUartSleepType(void); - - char* HM11::querySoftwareVersion(void); +#endif + + bool HM11::querySoftwareVersion(char* verBuf, uint8_t bufLen) + { + if(!verBuf) + { + return false; + } + flushBuffers(); + sendDataToDevice("AT+VERR?"); + if(!waitForData(WAIT_FOR_DATA_TIMEOUT_MS)) + return false; + else + { + copyAvailableDataToBuf((uint8_t*)verBuf,bufLen); + return true; + } + + + } -#endif \ No newline at end of file