diff Discovery/Src/bonexConnect.c @ 38:5f11787b4f42

include in ostc4 repository
author heinrichsweikamp
date Sat, 28 Apr 2018 11:52:34 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Discovery/Src/bonexConnect.c	Sat Apr 28 11:52:34 2018 +0200
@@ -0,0 +1,460 @@
+/**
+  ******************************************************************************
+	* @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>&copy; 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****/