Mercurial > public > ostc4
view Discovery/Src/bonexConnect.c @ 104:22a1094545f3 kittz
Tested and alive.
author | Dmitry Romanov <kitt@bk.ru> |
---|---|
date | Mon, 24 Dec 2018 16:15:02 +0300 |
parents | 5f11787b4f42 |
children |
line wrap: on
line source
/** ****************************************************************************** * @copyright heinrichs weikamp gmbh * @file bonexConnect.c * @author heinrichs weikamp gmbh * @date 29-Sept-2015 * @version 0.2 * @since 01-Okt-2015 * @brief connect to bluetooth LTE of BonexInfoSystem * @bug * @warning @verbatim ============================================================================== BLE: first of all: AT+LEROLE=1 // set BLE role of the device to Central it is invisible and does not accept incoming BLE connections then: AT+LESCAN AT+LENAME=<bdaddr> request remote device name over BLE ATD <brad>,TIO Initiate Bluetooth Link (for outgoing connections) ============================================================================== @endverbatim ****************************************************************************** * @attention * * <h2><center>© COPYRIGHT(c) 2015 heinrichs weikamp</center></h2> * ****************************************************************************** */ #include "bonexConnect.h" #ifndef BONEXBLUETOOTH void bonexControl(void) { return; } void bC_setConnectRequest(void) { return; } uint8_t bC_getStatus(void) { return BC_DISCONNECTED; } uint8_t bC_getName(char *name) { *name = 0; return 0; } uint8_t bC_getData(float *watt, float *temperature, uint16_t *drehzahl, uint8_t *residualcapacity) { *watt = 0; *temperature = 0; *drehzahl = 0; *residualcapacity = 0; return BC_DISCONNECTED; } #else /* Includes ------------------------------------------------------------------*/ #include "settings.h" #include "ostc.h" #include "string.h" #include "data_central.h" union tempFloat16{ uint16_t u16; uint8_t u8[2]; } temp; /* Private function prototypes -----------------------------------------------*/ void bC_connect(void); uint8_t bC_connect_sub_Search(void); uint8_t bC_connect_sub_Connect(void); void bC_call(void); void bC_evaluateData(void); /* Private variables with external access ------------------------------------*/ uint8_t status = 0; uint8_t searchrequest = 0; char nameOfScooter[20]; uint8_t dataBuffer[9]; uint8_t StartListeningToUARTscooter = 1; float scooterWattstunden = 0; float scooterTemperature = 0; uint8_t scooterRestkapazitaet = 0; uint16_t scooterDrehzahl = 0; /* Exported functions --------------------------------------------------------*/ uint8_t bC_evaluateData(void) { for pStateReal->lifeData.wireless_data[i].data[j] } uint8_t bC_getData(float *watt, float *temperature, uint16_t *drehzahl, uint8_t *residualcapacity) { if(watt) *watt = scooterWattstunden; if(temperature) *temperature = scooterTemperature; if(drehzahl) *drehzahl = scooterDrehzahl; if(residualcapacity) *residualcapacity = scooterRestkapazitaet; return status; } uint8_t bC_getStatus(void) { return status; } void bC_setConnectRequest(void) { searchrequest = 1; } uint8_t bC_getName(char *name) { if(status != BC_CONNECTED) *name = 0; strncpy(name,nameOfScooter,20); name[19] = 0; return strlen(name); } /* void bonexControl(void) { static uint32_t time = 0; if(settingsGetPointer()->scooterControl == 0) { status = BC_DISCONNECTED; time = 0; return; } if(settingsGetPointer()->bluetoothActive == 0) { status = BC_DISCONNECTED; time = 0; return; } if(searchrequest) { searchrequest = 0; // maybe we have to disconnect first? bC_connect(); StartListeningToUARTscooter = 1; time = 0; return; } if(status != BC_CONNECTED) { time = 0; return; } if(UartReady == SET) { UartReady = RESET; StartListeningToUARTscooter = 1; bC_evaluateData(); return; } if(time_elapsed_ms(time, HAL_GetTick()) < 1000) { return; } */ // test /* const char request[4] = {0xA3, 5, 0, 0xA6}; HAL_UART_Transmit(&UartHandle, (uint8_t*)request, 4, 1000); time = HAL_GetTick(); return; */ if((UartReady == RESET) && StartListeningToUARTscooter) { bC_call(); time = HAL_GetTick(); } } /* Private functions ---------------------------------------------------------*/ void BONEX_to_16bit(uint16_t *dataOutUint16, int16_t *dataOutInt16, uint8_t *dataIn) { union tempU16{ int16_t i16; uint16_t u16; uint8_t u8[2]; } temp; temp.u8[0] = dataIn[0]; temp.u8[1] = dataIn[1]; if(dataOutUint16) *dataOutUint16 = temp.u16; if(dataOutInt16) *dataOutInt16 = temp.i16; } void bC_evaluateData(void) { uint8_t crc = dataBuffer[0]; for(int i=1;i<=8;i++) crc ^= dataBuffer[i]; if(crc != 0) return; uint16_t watt; int16_t temperatureL; BONEX_to_16bit(&watt,0, &dataBuffer[1]); BONEX_to_16bit(0,&temperatureL, &dataBuffer[4]); BONEX_to_16bit(&scooterDrehzahl,0, &dataBuffer[6]); // scooterWattstunden = ((float)(dataBuffer[3]))/100; // scooterWattstunden += watt; scooterWattstunden = watt; // neu ohne milliWattSekunden hw 160113 scooterRestkapazitaet = dataBuffer[3]; scooterTemperature = ((float)(temperatureL))/10; /* aTxBuffer[0] = uartSendNext; // 0 UINT8_T BONEX_16to8(&aTxBuffer[1],&WattStunden); // 1+2 LSB first UINT16_T alt: aTxBuffer[3] = (uint8_t)(milliWattSekunden/36000);// 3 UINT8_T neu: aTxBuffer[3] = (uint8_t)(RestKapazitaet); // 3 UINT8_T BONEX_16to8(&aTxBuffer[4],&TemperaturLStufe); // 4+5 LSB first INT16_T BONEX_16to8(&aTxBuffer[6],&DrehzahlNeu); // 6+7 LSB first UINT16_T crc UINT8_T */ } void bC_call(void) { const char request[4] = {0xA3, 1, 0, 0xA2}; uint8_t answer = BONEX_OK; answer = HAL_UART_Transmit(&UartHandle, (uint8_t*)request, 4, 1000); if(answer != HAL_OK) return; StartListeningToUARTscooter = 0; answer = HAL_UART_Receive_IT(&UartHandle, dataBuffer, 9); } void bC_connect(void) { status = BC_SEARCHING; uint8_t answer = BONEX_OK; answer = BONEX_OK; if(settingsGetPointer()->scooterDeviceAddress[0] == 0) { answer = bC_connect_sub_Search(); } if(answer == BONEX_OK) { answer = bC_connect_sub_Connect(); } if(answer == BONEX_OK) status = BC_CONNECTED; else status = BC_DISCONNECTED; } uint8_t bC_connect_sub_Search(void) { uint8_t answer = BONEX_OK; char buffer[256]; uint8_t bufferPtr = 0; uint8_t length; uint32_t time; char *startOfBONEXString; char *startOfRemoteDeviceAddress; uint8_t okayNotSend; strncpy(buffer,"AT+BINQ\r",256); length = strlen(buffer); answer = HAL_UART_Transmit(&UartHandle, (uint8_t*)buffer, length, 1000); time = HAL_GetTick(); bufferPtr = 0; okayNotSend = 6; while((time_elapsed_ms(time, HAL_GetTick()) < 20000) && (bufferPtr < 255) && (okayNotSend)) { answer = HAL_UART_Receive(&UartHandle, (uint8_t*)&buffer[bufferPtr], 1, 1000); if(answer == HAL_OK) { switch(okayNotSend) { case 1: if(buffer[bufferPtr] == '\n') { okayNotSend = 0; break; } case 2: if(buffer[bufferPtr] == '\r') { okayNotSend = 1; break; } case 3: if(buffer[bufferPtr] == 'K') { okayNotSend = 2; break; } case 4: if(buffer[bufferPtr] == 'O') { okayNotSend = 3; break; } case 5: if(buffer[bufferPtr] == '\n') { okayNotSend = 4; break; } case 6: if(buffer[bufferPtr] == '\r') { okayNotSend = 5; break; } default: okayNotSend = 6; break; } bufferPtr++; } } buffer[bufferPtr] = 0; // just for safety of search routines length = bufferPtr; if(length < 1) return BONEX_NOTFOUND; startOfBONEXString = strstr(buffer,"BONEX"); if(!startOfBONEXString) return BONEX_NOTFOUND; // copy to scooterDeviceAddress startOfRemoteDeviceAddress = startOfBONEXString - 1; while(startOfRemoteDeviceAddress >= buffer) { if(*startOfRemoteDeviceAddress == '\r') break; startOfRemoteDeviceAddress--; } /* startOfBONEXString = 0; // for strrchr startOfRemoteDeviceAddress = strrchr(buffer, '\r'); */ // first in list? if(!startOfRemoteDeviceAddress) startOfRemoteDeviceAddress = buffer; else { startOfRemoteDeviceAddress += 1; if(*startOfRemoteDeviceAddress == '\n') startOfRemoteDeviceAddress += 1; } strncpy(settingsGetPointer()->scooterDeviceAddress, startOfRemoteDeviceAddress, 12); for(int i=0;i<19;i++) { if((startOfBONEXString[i] == 0) || (startOfBONEXString[i] == '\r')) { settingsGetPointer()->scooterDeviceName[i] = 0; break; } else settingsGetPointer()->scooterDeviceName[i] = startOfBONEXString[i]; } return BONEX_OK; } uint8_t bC_connect_sub_Connect(void) { uint8_t answer = BONEX_OK; char buffer2[256]; uint8_t bufferPtr = 0; uint8_t length; uint32_t time; strncpy(buffer2,"ATD ",256); length = strlen(buffer2); strncpy(&buffer2[length], settingsGetPointer()->scooterDeviceAddress, 12); length += 12; buffer2[length++] = '\r'; buffer2[length++] = 0; answer = HAL_UART_Transmit(&UartHandle, (uint8_t*)buffer2, length, 1000); time = HAL_GetTick(); bufferPtr = 0; while((time_elapsed_ms(time, HAL_GetTick()) < 5000) && (bufferPtr < 255)) { answer = HAL_UART_Receive(&UartHandle, (uint8_t*)&buffer2[bufferPtr], 1, 1000); if(answer == HAL_OK) bufferPtr++; } if(bufferPtr < 7) return BONEX_NOTFOUND; if(strstr(buffer2,"CONNECT")) { strncpy(nameOfScooter, settingsGetPointer()->scooterDeviceName, 19); nameOfScooter[19] = 0; return BONEX_OK; } else return BONEX_NOCONNECT; } #endif // BONEXBLUETOOTH /************************ (C) COPYRIGHT heinrichs weikamp *****END OF FILE****/