* Allow scaleValue() for 32bit values * Victron: Implement CAN message 0x360 This one-byte message is set to 0xff to request charging below a certain SoC threshold (10% in my tests). * Pytes: Add support for native CAN protocol The recently added PytesCanReceiver.cpp implements the Victron CAN protocol. This change additionally adds support for the native Pytes CAN protocol messages. Features only supported in Pytes protocol: - High-resolution state of charge / full and remaining mAh - Charge cycle counter - Balancing state Features only supported in Victron protocol: - FW version - Serial number Note that the only known way to select the native Pytes protocol is via the serial console (Cisco-compatible cables work): ``` login config setprt PYTES logout ``` to return to Victron protocol use: ``` login config setprt VICTRON logout ``` to return to DIP-switch based protocol setting: ``` login config setprt DIP logout ```
30 lines
786 B
C++
30 lines
786 B
C++
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
#pragma once
|
|
|
|
#include "Battery.h"
|
|
#include <driver/twai.h>
|
|
#include <Arduino.h>
|
|
|
|
class BatteryCanReceiver : public BatteryProvider {
|
|
public:
|
|
bool init(bool verboseLogging, char const* providerName);
|
|
void deinit() final;
|
|
void loop() final;
|
|
|
|
virtual void onMessage(twai_message_t rx_message) = 0;
|
|
|
|
protected:
|
|
uint8_t readUnsignedInt8(uint8_t *data);
|
|
uint16_t readUnsignedInt16(uint8_t *data);
|
|
int16_t readSignedInt16(uint8_t *data);
|
|
uint32_t readUnsignedInt32(uint8_t *data);
|
|
int32_t readSignedInt24(uint8_t *data);
|
|
float scaleValue(int32_t value, float factor);
|
|
bool getBit(uint8_t value, uint8_t bit);
|
|
|
|
bool _verboseLogging = true;
|
|
|
|
private:
|
|
char const* _providerName = "Battery CAN";
|
|
};
|