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