Download this file
#include "protocol.h"
#include "ui.h"
#include "heater_controller_master.h"
Protocol::Protocol(Speaker* speaker):
TimedTask(0), speaker(speaker), timer_armed(false)
{ }
bool Protocol::canRun(uint32_t now) {
return timer_armed && TimedTask::canRun(now);
}
void Protocol::run(uint32_t now) {
timer_armed = false;
ui->write_error(NO_REPLY_ERROR);
}
void Protocol::set_ui(UI* _ui) {
ui = _ui;
}
void Protocol::handle(uint8_t * buffer, uint8_t buffer_len) {
switch(buffer[0]) {
case 0x80:
process_status_reply(buffer+1, buffer_len-1);
break;
}
}
void Protocol::status_request() {
uint8_t* buf = speaker->get_buffer();
uint8_t i = 0;
buf[i++] = 0x00; // status request
buf[i++] = 0;
speaker->send(i, true);
setRunTime(millis() + REPLY_TIMEOUT);
timer_armed = true;
}
void Protocol::relay_close_request() {
uint8_t* buf = speaker->get_buffer();
uint8_t i = 0;
buf[i++] = 0x01; // relay close request
buf[i++] = 0;
speaker->send(i, true);
}
void Protocol::relay_open_request() {
uint8_t* buf = speaker->get_buffer();
uint8_t i = 0;
buf[i++] = 0x02; // relay open request
buf[i++] = 0;
speaker->send(i, true);
}
void Protocol::process_status_reply(uint8_t * buffer, uint8_t buffer_len) {
timer_armed = false;
uint8_t data_len = buffer[0];
if (data_len == buffer_len - 1) {
uint8_t relay_status = buffer[1] >> 7;
unsigned short temp = 0x00FF & buffer[2];
if (buffer[1] & 0x01) temp |= 0xFF00;
float temperature = (signed short)temp/2.0;
uint16_t current = ((buffer[3] << 8) | (buffer[4]));
ui->write_status(relay_status, temperature, current/1000.0);
}
else {
ui->write_error(BAD_MESSAGE_ERROR);
}
}
void Protocol::got_ack() {
speaker->got_ack();
ui->write_OK();
}
void Protocol::got_nack() {
ui->write_error(NACK_ERROR);
timer_armed = false;
}
// vim:ft=arduino