first version of aircon response msg.

This commit is contained in:
Your Name 2023-03-14 12:02:58 +01:00
parent 14802abf0f
commit 565f96ef33
2 changed files with 91 additions and 10 deletions

View File

@ -101,6 +101,10 @@ void TrumaiNetBoxApp::lin_reset_device() {
this->update_status_heater_unsubmitted_ = false; this->update_status_heater_unsubmitted_ = false;
this->update_status_heater_stale_ = false; this->update_status_heater_stale_ = false;
this->update_status_aircon_prepared_ = false;
this->update_status_aircon_unsubmitted_ = false;
this->update_status_aircon_stale_ = false;
this->update_status_timer_prepared_ = false; this->update_status_timer_prepared_ = false;
this->update_status_timer_unsubmitted_ = false; this->update_status_timer_unsubmitted_ = false;
this->update_status_timer_stale_ = false; this->update_status_timer_stale_ = false;
@ -188,6 +192,19 @@ StatusFrameTimerResponse *TrumaiNetBoxApp::update_timer_prepare() {
return &this->update_status_timer_; return &this->update_status_timer_;
} }
StatusFrameAirconResponse *TrumaiNetBoxApp::update_aircon_prepare() {
// An update is currently going on.
if (this->update_status_aircon_prepared_ || this->update_status_aircon_stale_) {
return &this->update_status_aircon_;
}
// prepare status response
this->update_status_aircon_ = {};
this->update_status_aircon_prepared_ = true;
return &this->update_status_aircon_;
}
bool TrumaiNetBoxApp::answer_lin_order_(const u_int8_t pid) { bool TrumaiNetBoxApp::answer_lin_order_(const u_int8_t pid) {
// Alive message // Alive message
if (pid == LIN_PID_TRUMA_INET_BOX) { if (pid == LIN_PID_TRUMA_INET_BOX) {
@ -278,6 +295,36 @@ const u_int8_t *TrumaiNetBoxApp::lin_multiframe_recieved(const u_int8_t *message
this->update_status_timer_unsubmitted_ = false; this->update_status_timer_unsubmitted_ = false;
this->update_status_timer_stale_ = true; this->update_status_timer_stale_ = true;
return response; return response;
} else if (this->update_status_aircon_unsubmitted_) {
ESP_LOGD(TAG, "Requested read: Sending aircon update");
status_frame_create_empty(response_frame, STATUS_FRAME_AIRCON_RESPONSE, sizeof(StatusFrameAirconResponse),
this->message_counter++);
response_frame->inner.airconResponse.unknown_01 = this->update_status_aircon_.unknown_01;
response_frame->inner.airconResponse.unknown_02 = this->update_status_aircon_.unknown_02;
response_frame->inner.airconResponse.unknown_03 = this->update_status_aircon_.unknown_03;
response_frame->inner.airconResponse.unknown_04 = this->update_status_aircon_.unknown_04;
response_frame->inner.airconResponse.target_temp_room = this->update_status_aircon_.target_temp_room;
response_frame->inner.airconResponse.unknown_07 = this->update_status_aircon_.unknown_07;
response_frame->inner.airconResponse.unknown_08 = this->update_status_aircon_.unknown_08;
response_frame->inner.airconResponse.current_temp_aircon = this->update_status_aircon_.current_temp_aircon;
response_frame->inner.airconResponse.unknown_11 = this->update_status_aircon_.unknown_11;
response_frame->inner.airconResponse.unknown_12 = this->update_status_aircon_.unknown_12;
response_frame->inner.airconResponse.unknown_13 = this->update_status_aircon_.unknown_13;
response_frame->inner.airconResponse.unknown_14 = this->update_status_aircon_.unknown_14;
response_frame->inner.airconResponse.unknown_15 = this->update_status_aircon_.unknown_15;
response_frame->inner.airconResponse.unknown_16 = this->update_status_aircon_.unknown_16;
response_frame->inner.airconResponse.current_temp_room = this->update_status_aircon_.current_temp_room;
status_frame_calculate_checksum(response_frame);
(*return_len) = sizeof(StatusFrameHeader) + sizeof(StatusFrameAirconResponse);
this->update_time_ = 0;
this->update_status_aircon_prepared_ = false;
this->update_status_aircon_unsubmitted_ = false;
this->update_status_aircon_stale_ = true;
return response;
#ifdef USE_TIME #ifdef USE_TIME
} else if (this->update_status_clock_unsubmitted_) { } else if (this->update_status_clock_unsubmitted_) {
if (this->time_ != nullptr) { if (this->time_ != nullptr) {
@ -358,8 +405,7 @@ const u_int8_t *TrumaiNetBoxApp::lin_multiframe_recieved(const u_int8_t *message
// SID<---------PREAMBLE---------->|<---MSG_HEAD---->| // SID<---------PREAMBLE---------->|<---MSG_HEAD---->|
// BB.00.1F.00.1E.00.00.22.FF.FF.FF.54.01.16.3F.00.E2.00.00.71.01.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00 // BB.00.1F.00.1E.00.00.22.FF.FF.FF.54.01.16.3F.00.E2.00.00.71.01.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00
return response; return response;
} else if (header->message_type == STATUS_FRAME_AIRCON2 && } else if (header->message_type == STATUS_FRAME_AIRCON2 && header->message_length == sizeof(StatusFrameAircon2)) {
header->message_length == sizeof(StatusFrameAircon2)) {
ESP_LOGI(TAG, "StatusFrameAircon2"); ESP_LOGI(TAG, "StatusFrameAircon2");
// Example: // Example:
// SID<---------PREAMBLE---------->|<---MSG_HEAD---->| // SID<---------PREAMBLE---------->|<---MSG_HEAD---->|
@ -510,7 +556,7 @@ bool TrumaiNetBoxApp::has_update_to_submit_() {
return true; return true;
} }
} else if (this->update_status_heater_unsubmitted_ || this->update_status_timer_unsubmitted_ || } else if (this->update_status_heater_unsubmitted_ || this->update_status_timer_unsubmitted_ ||
this->update_status_clock_unsubmitted_) { this->update_status_clock_unsubmitted_ || this->update_status_aircon_unsubmitted_) {
if (this->update_time_ == 0) { if (this->update_time_ == 0) {
// ESP_LOGD(TAG, "Notify CP Plus I got updates."); // ESP_LOGD(TAG, "Notify CP Plus I got updates.");
this->update_time_ = micros(); this->update_time_ = micros();

View File

@ -237,13 +237,13 @@ struct StatusFrameAircon { // NOLINT(altera-struct-pack-align)
u_int8_t unknown_03; u_int8_t unknown_03;
// 0x01 // 0x01
u_int8_t unknown_04; u_int8_t unknown_04;
u_int16_t target_temp_room; TargetTemp target_temp_room;
// 0x00 // 0x00
u_int8_t unknown_07; u_int8_t unknown_07;
// 0x00 // 0x00
u_int8_t unknown_08; u_int8_t unknown_08;
// No idea why two current_temp // No idea why two current_temp
u_int16_t current_temp_aircon; TargetTemp current_temp_aircon;
// 0x00 // 0x00
u_int8_t unknown_11; u_int8_t unknown_11;
// 0x00 // 0x00
@ -256,12 +256,39 @@ struct StatusFrameAircon { // NOLINT(altera-struct-pack-align)
u_int8_t unknown_15; u_int8_t unknown_15;
// 0x00 // 0x00
u_int8_t unknown_16; u_int8_t unknown_16;
u_int16_t current_temp_room; TargetTemp current_temp_room;
} __attribute__((packed)); } __attribute__((packed));
// TODO // TODO
struct StatusFrameAirconResponse { // NOLINT(altera-struct-pack-align) struct StatusFrameAirconResponse { // NOLINT(altera-struct-pack-align)
// TODO // Mode? 00 - OFF, 04 - AC Ventilation, 05 - AC Cooling
u_int8_t unknown_01;
// 0x00
u_int8_t unknown_02;
// 0x71
u_int8_t unknown_03;
// 0x01
u_int8_t unknown_04;
TargetTemp target_temp_room;
// 0x00
u_int8_t unknown_07;
// 0x00
u_int8_t unknown_08;
// No idea why two current_temp
TargetTemp current_temp_aircon;
// 0x00
u_int8_t unknown_11;
// 0x00
u_int8_t unknown_12;
// 0x00
u_int8_t unknown_13;
// 0x00
u_int8_t unknown_14;
// 0x00
u_int8_t unknown_15;
// 0x00
u_int8_t unknown_16;
TargetTemp current_temp_room;
} __attribute__((packed)); } __attribute__((packed));
// Length 24 (0x18) // Length 24 (0x18)
@ -424,8 +451,8 @@ struct StatusFrameAircon2 { // NOLINT(altera-struct-pack-align)
u_int8_t unknown_12; // 0x00 u_int8_t unknown_12; // 0x00
u_int8_t unknown_13; // 0x00 u_int8_t unknown_13; // 0x00
u_int8_t unknown_14; // 0x00 u_int8_t unknown_14; // 0x00
u_int16_t current_temp; TargetTemp current_temp;
u_int16_t target_temp; TargetTemp target_temp;
} __attribute__((packed)); } __attribute__((packed));
union StatusFrame { // NOLINT(altera-struct-pack-align) union StatusFrame { // NOLINT(altera-struct-pack-align)
@ -434,7 +461,6 @@ union StatusFrame { // NOLINT(altera-struct-pack-align)
StatusFrameHeader genericHeader; StatusFrameHeader genericHeader;
union { // NOLINT(altera-struct-pack-align) union { // NOLINT(altera-struct-pack-align)
StatusFrameHeater heater; StatusFrameHeater heater;
StatusFrameAircon aircon;
StatusFrameHeaterResponse heaterResponse; StatusFrameHeaterResponse heaterResponse;
StatusFrameTimer timer; StatusFrameTimer timer;
StatusFrameTimerResponse timerResponse; StatusFrameTimerResponse timerResponse;
@ -442,6 +468,8 @@ union StatusFrame { // NOLINT(altera-struct-pack-align)
StatusFrameClock clock; StatusFrameClock clock;
StatusFrameConfig config; StatusFrameConfig config;
StatusFrameDevice device; StatusFrameDevice device;
StatusFrameAircon aircon;
StatusFrameAirconResponse airconResponse;
StatusFrameAirconInit airconInit; StatusFrameAirconInit airconInit;
StatusFrameAircon2 aircon2; StatusFrameAircon2 aircon2;
} __attribute__((packed)); } __attribute__((packed));
@ -485,6 +513,10 @@ class TrumaiNetBoxApp : public LinBusProtocol {
StatusFrameHeaterResponse *update_heater_prepare(); StatusFrameHeaterResponse *update_heater_prepare();
void update_heater_submit() { this->update_status_heater_unsubmitted_ = true; } void update_heater_submit() { this->update_status_heater_unsubmitted_ = true; }
bool truma_aircon_can_update() { return this->status_aircon_valid_; }
StatusFrameAirconResponse *update_aircon_prepare();
void update_aircon_submit() { this->update_status_aircon_unsubmitted_ = true; }
bool truma_timer_can_update() { return this->status_timer_valid_; } bool truma_timer_can_update() { return this->status_timer_valid_; }
StatusFrameTimerResponse *update_timer_prepare(); StatusFrameTimerResponse *update_timer_prepare();
void update_timer_submit() { this->update_status_timer_unsubmitted_ = true; } void update_timer_submit() { this->update_status_timer_unsubmitted_ = true; }
@ -564,7 +596,10 @@ class TrumaiNetBoxApp : public LinBusProtocol {
bool update_status_heater_stale_ = false; bool update_status_heater_stale_ = false;
StatusFrameHeaterResponse update_status_heater_; StatusFrameHeaterResponse update_status_heater_;
bool update_status_aircon_prepared_ = false;
bool update_status_aircon_unsubmitted_ = false;
bool update_status_aircon_stale_ = false; bool update_status_aircon_stale_ = false;
StatusFrameAirconResponse update_status_aircon_;
// Prepared means `update_status_timer_` was copied from `status_timer_`. // Prepared means `update_status_timer_` was copied from `status_timer_`.
bool update_status_timer_prepared_ = false; bool update_status_timer_prepared_ = false;