Files

142 lines
3.8 KiB
C++

#pragma once
#include <espchrono.h>
#include "globals.h"
namespace {
#if defined(FEATURE_BLUETOOTH) && defined(FEATURE_BMS)
namespace bms {
constexpr auto autoReconnect = false; // causes hangs when not available
bool lastConnected;
espchrono::millis_clock::time_point lastSend;
espchrono::millis_clock::time_point lastReceive;
float voltage;
float current;
float capacity;
int8_t soc;
float cycle;
int16_t power;
float batt[12];
bool send6Bit(int zhen_tou, int address, int data)
{
uint8_t buffer[6];
buffer[0] = (char)((zhen_tou>>8)&255);
buffer[1] = (char)(zhen_tou&255);
buffer[2] = (char)(address&255);
buffer[3] = (char)((data>>8)&255);
buffer[4] = (char)(data&255);
buffer[5] = (char)(buffer[2]+buffer[3]+buffer[4]);
const auto sent = bluetoothSerial.write(buffer, 6);
if (sent != 6)
{
//Serial.printf("send: %u\r\n", sent);
}
return sent == 6;
}
void init()
{
}
void update()
{
const auto now = espchrono::millis_clock::now();
if (bluetoothSerial.hasClient() != lastConnected)
{
lastSend = 0;
lastConnected = bluetoothSerial.hasClient();
}
if (bluetoothSerial.hasClient())
{
if (bluetoothSerial.available() >= 140)
{
uint8_t buffer[140];
const auto read = bluetoothSerial.readBytes(buffer, 140);
if (read != 140)
{
//Serial.printf("bms read buffer too short %u\r\n", read);
for (int i = 0; i < read; i++)
{
//Serial.printf("%i ", buffer[i]);
}
//Serial.println();
goto after_read;
}
if (buffer[0] != 170 ||
buffer[1] != 85 ||
buffer[2] != 170 ||
buffer[3] != 255)
{
//Serial.println("bms read buffer wrong sequence");
for (const auto &x : buffer)
{
//Serial.printf("%i ", x);
}
//Serial.println();
goto after_read;
}
lastReceive = now;
voltage = static_cast<int16_t>((buffer[4] << 8) | buffer[5]) / 10.f;
current = static_cast<int16_t>((buffer[72] << 8) | buffer[73]) / 10.f;
capacity = static_cast<int32_t>((((((buffer[79] << 8) | buffer[80]) << 8) | buffer[81]) << 8) | buffer[82]) / 1000.f;
soc = buffer[74];
cycle = static_cast<int32_t>((((((buffer[83] << 8) | buffer[84]) << 8) | buffer[85]) << 8) | buffer[86]) / 1000.f;
power = (buffer[113] << 8) | buffer[114];
for (int i = 0; i < 12; i++)
batt[i] = ((buffer[(i*2)+6] * 256) + buffer[(i*2)+7]) / 1000.f;
}
// else if (bluetoothSerial.available())
// {
// //Serial.printf("available() = %i\r\n", bluetoothSerial.available());
// while (bluetoothSerial.available())
// {
// //Serial.printf("%i ", bluetoothSerial.read());
// }
// //Serial.println();
// }
after_read:
if (!lastSend || now-lastSend >= 1000)
{
//Serial.println("requresting bms live values");
if (!send6Bit(56283, 0, 0))
{
//Serial.println("could not request bms live values");
}
lastSend = now;
}
}
else if (autoReconnect)
{
if (!lastSend || now-lastSend >= 500)
{
uint8_t remoteAddress[ESP_BD_ADDR_LEN] = {0xAA, 0xBB, 0xCC, 0xA1, 0x23, 0x45};
//Serial.println("connect()");
const auto result = bluetoothSerial.connect(remoteAddress);
//Serial.printf("connect() returned %s\r\n", result?"true":"false");
lastSend = now;
}
}
}
}
#endif
}