Senior-Design / software / elevate / elevate.ino
elevate.ino
Raw
/**
 * @file elevate.ino
 * 
 * @brief main code for running elevate system
 * 
 * @author Jonathan Lee
 * Contact: jonlee27@seas.upenn.edu
 */
#include <WiFi.h>
#include <esp_now.h>
#include "src/elevate_constants.h"
#include "src/elevate_module.h"
#include "src/button_panel.h"
#include "src/elevate_system.h"

/**
 * Struct for messages from encoder minion
 * 
 * id:                         minion ID
 * height:                     module height
 * lower_limit_switch_pressed: whether or not the lower limit switch is pressed
 * upper_limit_switch_pressed: whether or not the upper limit switch is pressed
 */
struct MinionMessage {
  unsigned int id;
  int height;
  bool lower_limit_switch_pressed;
  bool upper_limit_switch_pressed;
};
MinionMessage message;

ElevateModule module_0 = ElevateModule(
  PWM_PIN_0,
  PWM_CHANNEL_0,
  DIRECTION_PIN_0
);
ElevateModule module_1 = ElevateModule(
  PWM_PIN_1,
  PWM_CHANNEL_1,
  DIRECTION_PIN_1
);
ElevateModule module_2 = ElevateModule(
  PWM_PIN_2,
  PWM_CHANNEL_2,
  DIRECTION_PIN_2
);
ElevateModule module_3 = ElevateModule(
  PWM_PIN_3,
  PWM_CHANNEL_3,
  DIRECTION_PIN_3
);

int const NUMBER_OF_MODULES = 4;

ElevateModule modules[NUMBER_OF_MODULES] = {
  module_0,
  module_1,
  module_2,
  module_3
};

ButtonPanel button_panel = ButtonPanel(UP_SWITCH_PIN_, DOWN_SWITCH_PIN_);

ElevateSystem elevate = ElevateSystem(modules, NUMBER_OF_MODULES, &button_panel);

portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED;

/**
 * Callback when data is received from minion
 */
void receive_callback(const uint8_t* mac_address, const uint8_t* data, int len) {
  portENTER_CRITICAL_ISR(&mux);
  memcpy(&message, data, sizeof(message));
  modules[message.id].update(
    message.height,
    message.lower_limit_switch_pressed,
    message.upper_limit_switch_pressed
  );
  portEXIT_CRITICAL_ISR(&mux);
}

void setup() {
  WiFi.mode(WIFI_STA);
  WiFi.setSleep(false);
  if (esp_now_init() != ESP_OK) return;
  esp_now_register_recv_cb(receive_callback);
  elevate.setup();
}

void loop() {
  elevate.update();
  elevate.control();
}