Pylontech enhancement (#239)
This commit is contained in:
parent
a3e7439181
commit
52af52eb3a
@ -36,7 +36,7 @@
|
|||||||
#define POWERMETER_MAX_HTTP_JSON_PATH_STRLEN 256
|
#define POWERMETER_MAX_HTTP_JSON_PATH_STRLEN 256
|
||||||
#define POWERMETER_HTTP_TIMEOUT 1000
|
#define POWERMETER_HTTP_TIMEOUT 1000
|
||||||
|
|
||||||
#define JSON_BUFFER_SIZE 12288
|
#define JSON_BUFFER_SIZE 15360
|
||||||
|
|
||||||
struct CHANNEL_CONFIG_T {
|
struct CHANNEL_CONFIG_T {
|
||||||
uint16_t MaxChannelPower;
|
uint16_t MaxChannelPower;
|
||||||
|
|||||||
@ -19,6 +19,7 @@ class PylontechCanReceiverClass {
|
|||||||
public:
|
public:
|
||||||
void init(int8_t rx, int8_t tx);
|
void init(int8_t rx, int8_t tx);
|
||||||
void enable();
|
void enable();
|
||||||
|
void disable();
|
||||||
void loop();
|
void loop();
|
||||||
void parseCanPackets();
|
void parseCanPackets();
|
||||||
void mqtt();
|
void mqtt();
|
||||||
@ -31,9 +32,10 @@ private:
|
|||||||
float scaleValue(int16_t value, float factor);
|
float scaleValue(int16_t value, float factor);
|
||||||
bool getBit(uint8_t value, uint8_t bit);
|
bool getBit(uint8_t value, uint8_t bit);
|
||||||
|
|
||||||
|
bool _isEnabled = false;
|
||||||
uint32_t _lastPublish;
|
uint32_t _lastPublish;
|
||||||
twai_general_config_t g_config;
|
twai_general_config_t g_config;
|
||||||
|
esp_err_t twaiLastResult;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern PylontechCanReceiverClass PylontechCanReceiver;
|
extern PylontechCanReceiverClass PylontechCanReceiver;
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
#include "PylontechCanReceiver.h"
|
#include "PylontechCanReceiver.h"
|
||||||
#include "Battery.h"
|
#include "Battery.h"
|
||||||
#include "Configuration.h"
|
#include "Configuration.h"
|
||||||
@ -13,34 +14,78 @@ PylontechCanReceiverClass PylontechCanReceiver;
|
|||||||
void PylontechCanReceiverClass::init(int8_t rx, int8_t tx)
|
void PylontechCanReceiverClass::init(int8_t rx, int8_t tx)
|
||||||
{
|
{
|
||||||
CONFIG_T& config = Configuration.get();
|
CONFIG_T& config = Configuration.get();
|
||||||
if (!config.Battery_Enabled) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_config = TWAI_GENERAL_CONFIG_DEFAULT((gpio_num_t)tx, (gpio_num_t)rx, TWAI_MODE_NORMAL);
|
g_config = TWAI_GENERAL_CONFIG_DEFAULT((gpio_num_t)tx, (gpio_num_t)rx, TWAI_MODE_NORMAL);
|
||||||
|
if (config.Battery_Enabled) {
|
||||||
enable();
|
enable();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PylontechCanReceiverClass::enable()
|
void PylontechCanReceiverClass::enable()
|
||||||
{
|
{
|
||||||
|
if (_isEnabled) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
// Initialize configuration structures using macro initializers
|
// Initialize configuration structures using macro initializers
|
||||||
twai_timing_config_t t_config = TWAI_TIMING_CONFIG_500KBITS();
|
twai_timing_config_t t_config = TWAI_TIMING_CONFIG_500KBITS();
|
||||||
twai_filter_config_t f_config = TWAI_FILTER_CONFIG_ACCEPT_ALL();
|
twai_filter_config_t f_config = TWAI_FILTER_CONFIG_ACCEPT_ALL();
|
||||||
|
|
||||||
// Install TWAI driver
|
// Install TWAI driver
|
||||||
if (twai_driver_install(&g_config, &t_config, &f_config) == ESP_OK) {
|
twaiLastResult = twai_driver_install(&g_config, &t_config, &f_config);
|
||||||
MessageOutput.printf("[Pylontech] Twai driver installed\n");
|
switch (twaiLastResult) {
|
||||||
} else {
|
case ESP_OK:
|
||||||
MessageOutput.printf("[Pylontech] Failed to install Twai driver\n");
|
MessageOutput.println(F("[Pylontech] Twai driver installed"));
|
||||||
|
break;
|
||||||
|
case ESP_ERR_INVALID_ARG:
|
||||||
|
MessageOutput.println(F("[Pylontech] Twai driver install - invalid arg"));
|
||||||
|
break;
|
||||||
|
case ESP_ERR_NO_MEM:
|
||||||
|
MessageOutput.println(F("[Pylontech] Twai driver install - no memory"));
|
||||||
|
break;
|
||||||
|
case ESP_ERR_INVALID_STATE:
|
||||||
|
MessageOutput.println(F("[Pylontech] Twai driver install - invalid state"));
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start TWAI driver
|
// Start TWAI driver
|
||||||
if (twai_start() == ESP_OK) {
|
twaiLastResult = twai_start();
|
||||||
MessageOutput.printf("[Pylontech] Twai driver started\n");
|
switch (twaiLastResult) {
|
||||||
} else {
|
case ESP_OK:
|
||||||
MessageOutput.printf("[Pylontech] Failed to start Twai driver\n");
|
MessageOutput.println(F("[Pylontech] Twai driver started"));
|
||||||
|
_isEnabled = true;
|
||||||
|
break;
|
||||||
|
case ESP_ERR_INVALID_STATE:
|
||||||
|
MessageOutput.println(F("[Pylontech] Twai driver start - invalid state"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PylontechCanReceiverClass::disable()
|
||||||
|
{
|
||||||
|
if (!_isEnabled) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stop TWAI driver
|
||||||
|
twaiLastResult = twai_stop();
|
||||||
|
switch (twaiLastResult) {
|
||||||
|
case ESP_OK:
|
||||||
|
MessageOutput.println(F("[Pylontech] Twai driver stopped"));
|
||||||
|
break;
|
||||||
|
case ESP_ERR_INVALID_STATE:
|
||||||
|
MessageOutput.println(F("[Pylontech] Twai driver stop - invalid state"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uninstall TWAI driver
|
||||||
|
twaiLastResult = twai_driver_uninstall();
|
||||||
|
switch (twaiLastResult) {
|
||||||
|
case ESP_OK:
|
||||||
|
MessageOutput.println(F("[Pylontech] Twai driver uninstalled"));
|
||||||
|
_isEnabled = false;
|
||||||
|
break;
|
||||||
|
case ESP_ERR_INVALID_STATE:
|
||||||
|
MessageOutput.println(F("[Pylontech] Twai driver uninstall - invalid state"));
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -98,11 +143,18 @@ void PylontechCanReceiverClass::mqtt()
|
|||||||
|
|
||||||
void PylontechCanReceiverClass::parseCanPackets()
|
void PylontechCanReceiverClass::parseCanPackets()
|
||||||
{
|
{
|
||||||
|
// Check for messages. twai_receive is blocking when there is no data so we return if there are no frames in the buffer
|
||||||
// Check for messages. twai_recive is blocking when there is no data so we return if there are no frames in the buffer
|
|
||||||
twai_status_info_t status_info;
|
twai_status_info_t status_info;
|
||||||
if (twai_get_status_info(&status_info) != ESP_OK) {
|
twaiLastResult = twai_get_status_info(&status_info);
|
||||||
MessageOutput.printf("[Pylontech]Failed to get Twai status info\n");
|
if (twaiLastResult != ESP_OK) {
|
||||||
|
switch (twaiLastResult) {
|
||||||
|
case ESP_ERR_INVALID_ARG:
|
||||||
|
MessageOutput.println(F("[Pylontech] Twai driver get status - invalid arg"));
|
||||||
|
break;
|
||||||
|
case ESP_ERR_INVALID_STATE:
|
||||||
|
MessageOutput.println(F("[Pylontech] Twai driver get status - invalid state"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (status_info.msgs_to_rx == 0) {
|
if (status_info.msgs_to_rx == 0) {
|
||||||
@ -112,7 +164,7 @@ void PylontechCanReceiverClass::parseCanPackets()
|
|||||||
// Wait for message to be received, function is blocking
|
// Wait for message to be received, function is blocking
|
||||||
twai_message_t rx_message;
|
twai_message_t rx_message;
|
||||||
if (twai_receive(&rx_message, pdMS_TO_TICKS(100)) != ESP_OK) {
|
if (twai_receive(&rx_message, pdMS_TO_TICKS(100)) != ESP_OK) {
|
||||||
MessageOutput.printf("[Pylontech] Failed to receive message\n");
|
MessageOutput.println(F("[Pylontech] Failed to receive message"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -235,14 +287,12 @@ void PylontechCanReceiverClass::parseCanPackets()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint16_t PylontechCanReceiverClass::readUnsignedInt16(uint8_t *data)
|
uint16_t PylontechCanReceiverClass::readUnsignedInt16(uint8_t *data)
|
||||||
{
|
{
|
||||||
uint8_t bytes[2];
|
uint8_t bytes[2];
|
||||||
bytes[0] = *data;
|
bytes[0] = *data;
|
||||||
bytes[1] = *(data + 1);
|
bytes[1] = *(data + 1);
|
||||||
return (bytes[1] << 8) + bytes[0];
|
return (bytes[1] << 8) + bytes[0];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t PylontechCanReceiverClass::readSignedInt16(uint8_t *data)
|
int16_t PylontechCanReceiverClass::readSignedInt16(uint8_t *data)
|
||||||
|
|||||||
@ -109,5 +109,7 @@ void WebApiBatteryClass::onAdminPost(AsyncWebServerRequest* request)
|
|||||||
|
|
||||||
if (config.Battery_Enabled) {
|
if (config.Battery_Enabled) {
|
||||||
PylontechCanReceiver.enable();
|
PylontechCanReceiver.enable();
|
||||||
|
} else {
|
||||||
|
PylontechCanReceiver.disable();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user