diff --git a/software/firmware/AtmosphericNodeV2/AtmosphericNodeV2.ino b/software/firmware/AtmosphericNodeV2/AtmosphericNodeV2.ino new file mode 100644 index 0000000..502cebd --- /dev/null +++ b/software/firmware/AtmosphericNodeV2/AtmosphericNodeV2.ino @@ -0,0 +1,216 @@ +#define RS485 Serial1 //Select RS-485 Serial Port. //This needs to be changed based on the design +//#define POTHOS_DEBUG //Comment this out for extra efficiency. Leave as is for verbose debug statements over USB. +//#define DEBUG //uncomment this line for a serial print of sensor data +#include //Include pothos library +#include // Include I2C Comms Library +#include // include sensor library (UV light) +#include // include sensor library (Temp / Humidity) + + +enum PIN{ //Enum of pinouts + EN485 = 5, //RS485 Enable Pin + RGB_R = 32, //RGB LED pins (logic low) + RGB_G = 25, + RGB_B = 6, + BLUE_LED = 13, //onboard blue LED + WIND_SENSOR = A0, // Anemometer sends analog voltage + DUST_SENSOR = 23, // Dust sensor sends PWM + I2C_SCL = 19, // CO2, UV, and humid/temp sensors all on I2C + I2C_SDA = 18 +}; + +enum REGISTER{ //Enum of register addresses + DUST = 0, // Pts/L //unknown range + UV = 1, // No units //unknown range + + //CO2 sensor datasheet: https://cdn.shopify.com/s/files/1/0406/7681/files/Manual-CU-1107-N-Dual-Beam-NDIR-CO2-Sensor-Cubic.pdf?v=1613695364 + CO2 = 2, // pts/mil //Integer ranging from ranges from 0 to 5000 + CO2_SENSOR_STATUS = 3, // 0: preheating, 1: normal operation, 2: operating issue, 3: out of FS, 5: not calibrated + + TEMP = 4, // degrees C +/- .4C Floating point number. Ranges from -10C to 85C + HUMIDITY = 5, // RH% +/- 3% //ranges from 0%-80% + WIND = 6 // analog voltage. 0.4V (0 m/s wind) up to 2.0V (for 32.4m/s wind speed) + // ADC value will be converted to float representing wind speed assuming + // perfectly linear correlation between voltage and corresponding wind speed + // (datasheet seems to confirm this) +}; + +/*************************** GLOBAL VARIABLES **************************************/ +int pothosTimeout = 50; //The recomended pothos timeout is 50 ms +uint8_t slaveID = 12; //The slave ID for the node (1-255) + +//Dust Sensor Variables// +unsigned long duration; +unsigned long starttime; +unsigned long sampletime_ms = 30000;//recomended sample time: 30s +unsigned long lowpulseoccupancy = 0; +float ratio = 0; +float concentration = 0; + + +//Wind Sensor Variables// +float wind_ADC; + +//CO2 Sensor Variables// +unsigned char buf[5]; +int CO2_data; + + + +/*************************** CLASS INSTANTIATION **************************************/ +Adafruit_VEML6070 uv = Adafruit_VEML6070(); //define Adafruit sensor objects as global variables to use Adafruit libraries +Adafruit_Si7021 tempAndHumidity = Adafruit_Si7021(); +pothos comms(slaveID, PIN::EN485, pothosTimeout, PIN::RGB_R, PIN::RGB_G, PIN::RGB_B); //init the pothos library + + + + + +void setup(){ + comms.setup(500000); //Pothos will communicate at a baudrate of 500Kbps //This is high enough to ensure that data speeds will never be the bottleneck. + + #ifdef POTHOS_DEBUG + Serial.begin(115200); + #endif + + #ifdef DEBUG + Serial.begin(115200); + #endif + + setup_sensors(); // does hardware setup for sensors + setPinModes(); //Sets all pinmodes + setDataTypes(); //Sets all pothos data types +} + +void loop(){ + comms.update(); //maintains communication over pothos + update_sensor_data(); //update data for dust, wind, UV, CO2, temp, and humidity + + #ifdef DEBUG + Serial.print("Dust: "); + Serial.print(comms.data.get_float_data(REGISTER::DUST)); + Serial.print("pcs/L UV: "); + Serial.print(comms.data.get_int_data(REGISTER::UV)); + Serial.print(" humidity: "); + Serial.print(comms.data.get_float_data(REGISTER::HUMIDITY)); + Serial.print(" temperature: "); + Serial.print(comms.data.get_float_data(REGISTER::TEMP)); + Serial.print("C CO2: "); + Serial.print(comms.data.get_int_data(REGISTER::CO2)); + Serial.print("ppm CO2 sensor status: "); + Serial.print(comms.data.get_char_data(REGISTER::CO2_SENSOR_STATUS)); + Serial.print(" wind: "); + Serial.print(comms.data.get_float_data(REGISTER::WIND)); + Serial.println("m/s"); + #endif +} + + +void setup_sensors(){ + + starttime = millis(); //sets start time variable + uv.begin(VEML6070_1_T); // setup UV sensor using library + #ifdef DEBUG + if (!tempAndHumidity.begin()) + Serial.println("Sensor (Temperature & Humidity) failed to be found."); + #else + tempAndHumidity.begin(); // setup temp / humiditity sensor (Si7021) using library + #endif + + Wire.begin(); // begin I2C comms for CO2 sensor + +} + + +void setPinModes(){ //This function will set the pinmode of all non-pothos pins (exclude 485-enable, Rx, Tx, and RGBLED pins) + pinMode(PIN::BLUE_LED, OUTPUT); //Sets the blue LED on pin 13 to an output + pinMode(PIN::DUST_SENSOR, INPUT); + pinMode(PIN::WIND_SENSOR, INPUT); +} + +void setDataTypes(){ //This function is for setting the data type of each register + comms.data.set_type(REGISTER::DUST, "float"); //float representing pts/L of dust + comms.data.set_type(REGISTER::UV, "int"); //int representing UV intensity. Unitless. + comms.data.set_type(REGISTER::CO2, "int"); //int representing ppm CO2 from 0-5000 + comms.data.set_type(REGISTER::CO2_SENSOR_STATUS, "char"); // char representing CO2 sensor status + comms.data.set_type(REGISTER::TEMP, "float"); //float representing degrees C -10 to 85 +/- 0.4C + comms.data.set_type(REGISTER::HUMIDITY, "float"); //float representing humidity 0%-80% + comms.data.set_type(REGISTER::WIND, "float"); //float representing wind speed 0 m/s to 32.4 m/s +} + + + +// This function goes through each sensor and collects data from each +// All functions called are defined below +void update_sensor_data(){ + if(get_dust() >1) + comms.data.set_data(REGISTER::DUST, concentration); + get_humidity(); + get_temperature(); + get_CO2(); + get_UV(); + get_wind(); +} + +float get_dust() { + duration = pulseIn(PIN::DUST_SENSOR, LOW); + lowpulseoccupancy = lowpulseoccupancy + duration; + if ((millis() - starttime) > sampletime_ms) //if the sampel time == 30s + { + ratio = lowpulseoccupancy / (sampletime_ms * 10.0); // Integer percentage 0=>100 + concentration = (1000.0 / 283.0) * 1.1 * pow(ratio, 3) - 3.8 * pow(ratio, 2) + 520 * ratio + 0.62; // using spec sheet curve + lowpulseoccupancy = 0; + starttime = millis(); + } + return concentration; +} + +void get_humidity() { + comms.data.set_data(REGISTER::HUMIDITY, tempAndHumidity.readHumidity()); // send humidity reading data to Pothos register +} + +void get_temperature() { + comms.data.set_data(REGISTER::TEMP, tempAndHumidity.readTemperature()); // send temp reading data to Pothos register +} + +void get_UV(){ + comms.data.set_data(REGISTER::UV, uv.readUV()); // send UV reading data to Pothos register +} + +void get_CO2() { + // first write a measure command to the CO2 sensor + // measure command is 0x01 + Wire.beginTransmission(0x31); // start transmission to 0x31 (CO2 sensor slave address) + Wire.write(0x01); // send command to take measurement + Wire.endTransmission(); + + // then read the resulting data from the CO2 sensor + // the sensor echos command byte (0x01), then sends + // 2 measurement bytes, status byte, and checksum byte (5 bytes sent total) + Wire.requestFrom(0x31, 5); // request data from 0x31 (CO2 sensor slave address) + + int i = 0; + while(Wire.available()) { // read command, data1, data2, status, and checksum bytes (in this order) + buf[i] = Wire.read(); // buf[1] and buf[2] now contain our data + i++; + } + + CO2_data = buf[1] * 256; // convert the two data bytes into an integer + CO2_data = CO2_data + buf[2]; // note that data is sent in big endian format + + comms.data.set_data(REGISTER::CO2, CO2_data); // send CO2 reading data to Pothos register + comms.data.set_data(REGISTER::CO2_SENSOR_STATUS, (char) buf[3]); // send CO2 sensor status to Pothos register +} + +void get_wind() { + // assuming linear relationship betweeen wind speed and voltage, + // which is implied by datasheet. + // Our max ADC value is 1023, voltage reference is 2.5 volts + + wind_ADC = analogRead(PIN::WIND_SENSOR); // get analog reading from anemometer + wind_ADC = wind_ADC - 163.84; // subtract 163.84 (0.4v) to remove base voltage offset of anemometer. + wind_ADC = wind_ADC / 819.2; // divide by 819.2 (maximum value: 2v ADC output) to normalize value between 0 and 1 + wind_ADC = wind_ADC * 32.4; // normalize WIND between 0 and 32.4, now this value represents wind speed in m/s! + + comms.data.set_data(REGISTER::WIND, wind_ADC); //send wind speed float data to Pothos register +} diff --git a/software/firmware/MotorNodeV4/MotorNodeV4.ino b/software/firmware/MotorNodeV4/MotorNodeV4.ino new file mode 100644 index 0000000..0a687b3 --- /dev/null +++ b/software/firmware/MotorNodeV4/MotorNodeV4.ino @@ -0,0 +1,98 @@ +#define RS485 Serial1 //Select RS-485 Serial Port. //This needs to be changed based on the design +//#define POTHOS_DEBUG //Comment this out for extra efficiency. Leave as is for verbose debug statements over USB. +#include //Include pothos library + +enum PIN{ //Enum of pinouts + EN485 = 0, //RS485 Enable Pin + RGB_R = 1, //RGB LED pins (logic low) + RGB_G = 11, + RGB_B = 12, + PWM = A2, + CS = A3, + INA = 4, + INB = 5, + SEL = 8, + TEMP = A9 +}; + +enum REGISTER{ //Enum of register addresses + SPEED = 0, + DIR = 1, + TMP = 2, //example register 0 for reading temperature data + CURRENT = 3, //example register 0 for reading current data +}; + +uint32_t updateTimer = 0; +int updateTime = 50; + +int pothosTimeout = 200; //The recomended pothos timeout is 50 ms +uint8_t slaveID = 6; //The slave ID for the node + +pothos comms(slaveID, PIN::EN485, pothosTimeout, PIN::RGB_R, PIN::RGB_G, PIN::RGB_B); //init the pothos library + +void setup(){ + comms.setup(500000); //Pothos will communicate at a baudrate of 500Kbps //This is high enough to ensure that data speeds will never be the bottleneck. + + #ifndef POTHOS_DEBUG + Serial.begin(115200); + #endif + + setPinModes(); //Sets all pinmodes + setDataTypes(); //Sets all pothos data types +} + +void loop(){ + comms.update(); //maintains communication over pothos + if(millis()-updateTimer >= updateTime){ //update timer to trigger at 20Hz, This saves a vast majority of processing power for watching communicatrions + updateTimer = millis(); + driveMotors(); + comms.data.set_data(REGISTER::TMP, readTemp()); + comms.data.set_data(REGISTER::CURRENT, readCurrent()); + } +} + +void setPinModes(){ //This function will set the pinmode of all non-pothos pins (exclude 485-enable, Rx, Tx, and RGBLED pins) + //Sets the blue LED on pin 13 to an output + pinMode(PIN::PWM,OUTPUT); + pinMode(PIN::INA,OUTPUT); + pinMode(PIN::INB,OUTPUT); + pinMode(PIN::SEL,OUTPUT); + + pinMode(PIN::CS,INPUT); + pinMode(PIN::TEMP,INPUT); +} + +void setDataTypes(){ //This function is for setting the data type of each register + + + //comms.data.set_type(REGISTER::LED, "char"); //chars are actually unsigned 8bit integers in disquise and are the closest thing to a bool that's supported by pothos + //comms.data.set_type(REGISTER::TMP, "int"); //the temperature data is an int + //comms.data.set_type(REGISTER::TIME_DATA, "long"); //longs are also supported. time is often a long. + //comms.data.set_type(REGISTER::TMP_DATA, "float"); //floats are also supported + + comms.data.set_type(REGISTER::SPEED, "int"); + comms.data.set_type(REGISTER::DIR, "char"); + comms.data.set_type(REGISTER::TMP, "float"); + comms.data.set_type(REGISTER::CURRENT, "float"); +} + +float readTemp(){ + int raw = analogRead(PIN::TEMP); + float tempC = (((raw/1023.0)*3.3)-0.4)/.0195; + return(tempC); +} + +void driveMotors(){ + bool direct = (comms.data.get_char_data(REGISTER::DIR) != '\0'); + uint8_t motorSpeed = comms.data.get_int_data(REGISTER::SPEED); + digitalWrite(PIN::INA, direct); + digitalWrite(PIN::SEL, direct); + digitalWrite(PIN::INB, !direct); + analogWrite(PIN::PWM, motorSpeed); +} + +float readCurrent(){ //current reading is only accurate at > 200mA + int raw = analogRead(PIN::CS); + float current = ((raw/1023.0)*3.3)*(112.0/43.0); + return(current); +} diff --git a/software/firmware/PanTiltNodeChassisV2/PanTiltNodeChassisV2.ino b/software/firmware/PanTiltNodeChassisV2/PanTiltNodeChassisV2.ino new file mode 100644 index 0000000..642a08e --- /dev/null +++ b/software/firmware/PanTiltNodeChassisV2/PanTiltNodeChassisV2.ino @@ -0,0 +1,101 @@ +#define RS485 Serial2 //Select RS-485 Serial Port. //This needs to be changed based on the design +#define POTHOS_DEBUG //Comment this out for extra efficiency. Leave as is for verbose debug statements over USB. +#include //Include pothos library +#include + +enum PIN{ //Enum of pinouts + EN485 = 2, //RS485 Enable Pin + RGB_R = 1, //RGB LED pins (logic low) + RGB_G = 32, + RGB_B = 6, + TP_PWM1 = 22, + TP_PWM2 = 20, + TP_RX = 7, + TP_TX = 8, + TP_D1 = 15, + TP_D2 = 14, + TP_D3 = 12, + TP_D4 = 11, + SERVO_PAN = 5, + SERVO_TILT = 4, + SERVO_1 = 23, + SERVO_2 = 21, + BLUE_LED = 13, +}; + +enum REGISTER{ //Enum of register addresses + SERVO_PAN_POS = 0, + SERVO_TILT_POS = 1, + SERVO_1_POS = 2, + SERVO_2_POS = 3 +}; + +int updateTime = 50; +unsigned long timer = 0; +int pothosTimeout = 200; //The recomended pothos timeout is 50 ms +uint8_t slaveID = 8; //The slave ID for the node (1-255) +uint8_t defTilt = 110; +uint8_t defPan = 100; + +pothos comms(slaveID, PIN::EN485, pothosTimeout, PIN::RGB_R, PIN::RGB_G, PIN::RGB_B); //init the pothos library +Servo Pan; +Servo Tilt; +Servo SOne; +Servo STwo; + + +void setup(){ + comms.setup(500000); //Pothos will communicate at a baudrate of 500Kbps //This is high enough to ensure that data speeds will never be the bottleneck. + + #ifdef POTHOS_DEBUG + Serial.begin(115200); + #endif + + setPinModes(); //Sets all pinmodes + setDataTypes(); //Sets all pothos data types + comms.data.set_data(REGISTER::SERVO_PAN_POS, defPan); + comms.data.set_data(REGISTER::SERVO_TILT_POS, defTilt); +} + +void loop(){ + comms.update(); //maintains communication over pothos + + if (millis() - timer >= updateTime) { + timer = millis(); + setServos(); + } + +} + +void setPinModes(){ //This function will set the pinmode of all non-pothos pins (exclude 485-enable, Rx, Tx, and RGBLED pins) + //pinMode(PIN::SERVO_PAN, OUTPUT); //Sets the blue LED on pin 13 to an output pinMode(PIN::SERVO_PAN, OUTPUT): //seTS + //pinMode(PIN::SERVO_TILT, OUTPUT); //Sets the blue LED on pin 13 to an output + //pinMode(PIN::SERVO_1, OUTPUT); //Sets the blue LED on pin 13 to an output + //pinMode(PIN::SERVO_2, OUTPUT); //Sets the blue LED on pin 13 to an output + Pan.attach(PIN::SERVO_PAN); + Tilt.attach(PIN::SERVO_TILT); + SOne.attach(PIN::SERVO_1); + STwo.attach(PIN::SERVO_2); +} + +void setDataTypes(){ //This function is for setting the data type of each register + //comms.data.set_type(REGISTER::LED, "char"); //chars are actually unsigned 8bit integers in disquise and are the closest thing to a bool that's supported by pothos + //comms.data.set_type(REGISTER::TMP, "int"); //the temperature data is an int + //comms.data.set_type(REGISTER::TIME_DATA, "long"); //longs are also supported. time is often a long. + //comms.data.set_type(REGISTER::TMP_DATA, "float"); //floats are also supported + + comms.data.set_type(REGISTER::SERVO_PAN_POS, "int"); + comms.data.set_type(REGISTER::SERVO_TILT_POS, "int"); + comms.data.set_type(REGISTER::SERVO_1_POS, "int"); + comms.data.set_type(REGISTER::SERVO_2_POS, "int"); +} + + +void setServos() { + + Pan.write(comms.data.get_int_data(REGISTER::SERVO_PAN_POS)); + Tilt.write(comms.data.get_int_data(REGISTER::SERVO_TILT_POS)); + SOne.write(comms.data.get_int_data(REGISTER::SERVO_1_POS)); + STwo.write(comms.data.get_int_data(REGISTER::SERVO_2_POS)); + +} diff --git a/software/firmware/PanTiltNodeTowerV2/PanTiltNodeTowerV2.ino b/software/firmware/PanTiltNodeTowerV2/PanTiltNodeTowerV2.ino new file mode 100644 index 0000000..2689ac3 --- /dev/null +++ b/software/firmware/PanTiltNodeTowerV2/PanTiltNodeTowerV2.ino @@ -0,0 +1,101 @@ +#define RS485 Serial2 //Select RS-485 Serial Port. //This needs to be changed based on the design +#define POTHOS_DEBUG //Comment this out for extra efficiency. Leave as is for verbose debug statements over USB. +#include //Include pothos library +#include + +enum PIN{ //Enum of pinouts + EN485 = 2, //RS485 Enable Pin + RGB_R = 1, //RGB LED pins (logic low) + RGB_G = 32, + RGB_B = 6, + TP_PWM1 = 22, + TP_PWM2 = 20, + TP_RX = 7, + TP_TX = 8, + TP_D1 = 15, + TP_D2 = 14, + TP_D3 = 12, + TP_D4 = 11, + SERVO_PAN = 5, + SERVO_TILT = 4, + SERVO_1 = 23, + SERVO_2 = 21, + BLUE_LED = 13, +}; + +enum REGISTER{ //Enum of register addresses + SERVO_PAN_POS = 0, + SERVO_TILT_POS = 1, + SERVO_1_POS = 2, + SERVO_2_POS = 3 +}; + +int updateTime = 50; +unsigned long timer = 0; +int pothosTimeout = 200; //The recomended pothos timeout is 50 ms +uint8_t slaveID = 9; //The slave ID for the node (1-255) +uint8_t defTilt = 123; +uint8_t defPan = 180; // 92-103-114 center + +pothos comms(slaveID, PIN::EN485, pothosTimeout, PIN::RGB_R, PIN::RGB_G, PIN::RGB_B); //init the pothos library +Servo Pan; +Servo Tilt; +Servo SOne; +Servo STwo; + + +void setup(){ + comms.setup(500000); //Pothos will communicate at a baudrate of 500Kbps //This is high enough to ensure that data speeds will never be the bottleneck. + + #ifdef POTHOS_DEBUG + Serial.begin(115200); + #endif + + setPinModes(); //Sets all pinmodes + setDataTypes(); //Sets all pothos data types + comms.data.set_data(REGISTER::SERVO_PAN_POS, defPan); + comms.data.set_data(REGISTER::SERVO_TILT_POS, defTilt); +} + +void loop(){ + comms.update(); //maintains communication over pothos + + if (millis() - timer >= updateTime) { + timer = millis(); + setServos(); + } + +} + +void setPinModes(){ //This function will set the pinmode of all non-pothos pins (exclude 485-enable, Rx, Tx, and RGBLED pins) + //pinMode(PIN::SERVO_PAN, OUTPUT); //Sets the blue LED on pin 13 to an output pinMode(PIN::SERVO_PAN, OUTPUT): //seTS + //pinMode(PIN::SERVO_TILT, OUTPUT); //Sets the blue LED on pin 13 to an output + //pinMode(PIN::SERVO_1, OUTPUT); //Sets the blue LED on pin 13 to an output + //pinMode(PIN::SERVO_2, OUTPUT); //Sets the blue LED on pin 13 to an output + Pan.attach(PIN::SERVO_PAN); + Tilt.attach(PIN::SERVO_TILT); + SOne.attach(PIN::SERVO_1); + STwo.attach(PIN::SERVO_2); +} + +void setDataTypes(){ //This function is for setting the data type of each register + //comms.data.set_type(REGISTER::LED, "char"); //chars are actually unsigned 8bit integers in disquise and are the closest thing to a bool that's supported by pothos + //comms.data.set_type(REGISTER::TMP, "int"); //the temperature data is an int + //comms.data.set_type(REGISTER::TIME_DATA, "long"); //longs are also supported. time is often a long. + //comms.data.set_type(REGISTER::TMP_DATA, "float"); //floats are also supported + + comms.data.set_type(REGISTER::SERVO_PAN_POS, "int"); + comms.data.set_type(REGISTER::SERVO_TILT_POS, "int"); + comms.data.set_type(REGISTER::SERVO_1_POS, "int"); + comms.data.set_type(REGISTER::SERVO_2_POS, "int"); +} + + +void setServos() { + + Pan.write(map(comms.data.get_int_data(REGISTER::SERVO_PAN_POS),0,360,92,114)); + Tilt.write(comms.data.get_int_data(REGISTER::SERVO_TILT_POS)); + SOne.write(comms.data.get_int_data(REGISTER::SERVO_1_POS)); + STwo.write(comms.data.get_int_data(REGISTER::SERVO_2_POS)); + +} diff --git a/software/firmware/MR1819_science/MR1819_science.ino b/software/firmware/archive/MR1819_science/MR1819_science.ino similarity index 96% rename from software/firmware/MR1819_science/MR1819_science.ino rename to software/firmware/archive/MR1819_science/MR1819_science.ino index cf4af81..d3dff65 100644 --- a/software/firmware/MR1819_science/MR1819_science.ino +++ b/software/firmware/archive/MR1819_science/MR1819_science.ino @@ -1,226 +1,226 @@ -#include -#include -#include -#include -#include -#include - -#define DEBUG //uncomment this line for a serial print of sensor data - -//Hardware// -enum HARDWARE{ - RS485_RX = 7, - RS485_TX = 8, - RS485_EN = 5, - - I2C_SDA = 18, - i2c_SCL = 19, - - DUST_PIN = 23, - - LED_BLUE_EXTRA = 13, - LED_GREEN = 32, - LED_RED = 1, - LED_BLUE = 6, - - WIND_PIN = A0, - W_TEMP_PIN = A8 -}; - -//Modbus// -enum MODBUS_REGISTERS{ - DUST = 0, //Pts/L //unkown range - UV = 1, //unitless //unknown range - CO2 = 2, //pts/mil //ranges from 400 to 8192 - TVOC = 3, //pts/bil //ranges from 0 to 1187 - CC_TEMP = 4, //C //EARLY TESTING SHOWS CC_TEMP TO BE EXTREMLY INACURATE. - SI_TEMP = 5, //C +/- .4C // SI_TEMP IS FAR MORE ACURATE. ranges from -10C to 85C - HUMIDITY = 6, //RH% +/- 3% //ranges from 0%-80% - WIND = 7, - W_TEMP = 8 -}; - -const uint8_t node_id = 1; -const uint8_t modbus_serial_port_number = 3; -uint16_t modbus_data[] = {0,0,0,0,0,0,0,0,0}; -uint8_t num_modbus_registers = 0; -int8_t poll_state =0; -bool communication_good = false; -uint8_t message_count = 0; - -//Dust Sensor// -unsigned long duration; -unsigned long starttime; -unsigned long sampletime_ms = 30000;//recomended sample time: 30s -unsigned long lowpulseoccupancy = 0; -float ratio = 0; -float concentration = 0; - -//sensor registors// -float dust_raw =0.0; -int UV_raw = 0; -int CO2_raw = 0; -int TVOC_raw = 0; -float CC_temp_raw = 0.0; -float si_temp_raw = 0.0; -float humidity_raw = 0.0; -float wind_raw = 0.0; -float w_temp_raw = 0.0; - -//Class Instantiations// -Modbus slave(node_id, modbus_serial_port_number, HARDWARE::RS485_EN); -Adafruit_CCS811 ccs; -Adafruit_Si7021 tempAndHumidity = Adafruit_Si7021(); -Adafruit_VEML6070 uv = Adafruit_VEML6070(); -WindTemp MD(HARDWARE::WIND_PIN,HARDWARE::W_TEMP_PIN); - - -void setup() { - #ifdef DEBUG - Serial.begin(9600); - #endif - setup_hardware(); - - //setup modbus - num_modbus_registers = sizeof(modbus_data) / sizeof(modbus_data[0]); - slave.begin(115200); - slave.setTimeOut(3000); //timeout of 3 seconds because sensors don't need to be pulled often. -} - -void loop() { - update_sensor_data(); - - #ifdef DEBUG - Serial.print("Dust: "); - Serial.print(dust_raw); - Serial.print("pcs/L UV: "); - Serial.print(UV_raw); - Serial.print(" humidity: "); - Serial.print(humidity_raw); - Serial.print(" si_temperature: "); - Serial.print(si_temp_raw); - Serial.print("C CO2: "); - Serial.print(CO2_raw); - Serial.print("ppm TVOC: "); - Serial.print(TVOC_raw); - Serial.print("ppb cc_temperature: "); - Serial.print(CC_temp_raw); - Serial.print("C wind: "); - Serial.print(wind_raw); - Serial.print(" w_temperature: "); - Serial.println(w_temp_raw); - #endif - - // Do normal polling - poll_modbus(); - set_leds(); -} - -void setup_hardware(){ - - //sensors// - pinMode(HARDWARE::DUST_PIN, INPUT); //set to read pulses from dust sensor - starttime = millis(); //sets start time - uv.begin(VEML6070_1_T); - #ifdef DEBUG - if (!ccs.begin()) - Serial.println("Sensor (CCS811) failed to be found."); - if (!tempAndHumidity.begin()) - Serial.println("Sensor (Temperature & Humidity) failed to be found."); - #else - ccs.begin(); - tempAndHumidity.begin(); - #endif - while(!ccs.available()); - float temp = ccs.calculateTemperature(); - ccs.setTempOffset(temp - 25.0); //default temperature calibration - - //LEDs// - pinMode(HARDWARE::LED_RED, OUTPUT); - pinMode(HARDWARE::LED_GREEN, OUTPUT); - pinMode(HARDWARE::LED_BLUE, OUTPUT); - pinMode(HARDWARE::LED_BLUE_EXTRA, OUTPUT); - digitalWrite(HARDWARE::LED_RED, LOW); - digitalWrite(HARDWARE::LED_GREEN, HIGH); - digitalWrite(HARDWARE::LED_BLUE, HIGH); - digitalWrite(HARDWARE::LED_BLUE_EXTRA, LOW); -} - -void update_sensor_data(){ - if(get_dust() >1) - dust_raw = concentration; - get_humidity(humidity_raw); - get_temperature(si_temp_raw); - get_airQuality(CO2_raw,TVOC_raw,CC_temp_raw); - get_UV(UV_raw); - MD.update(wind_raw,w_temp_raw); - - modbus_data[MODBUS_REGISTERS::DUST] = uint16_t(dust_raw); - modbus_data[MODBUS_REGISTERS::UV] = uint16_t(UV_raw); - modbus_data[MODBUS_REGISTERS::CO2] = uint16_t(CO2_raw); - modbus_data[MODBUS_REGISTERS::TVOC] = uint16_t(TVOC_raw); - modbus_data[MODBUS_REGISTERS::CC_TEMP] = uint16_t(CC_temp_raw*100.0); - modbus_data[MODBUS_REGISTERS::SI_TEMP] = uint16_t(si_temp_raw*100.0); - modbus_data[MODBUS_REGISTERS::HUMIDITY] = uint16_t(humidity_raw*100.0); - modbus_data[MODBUS_REGISTERS::WIND] = uint16_t(wind_raw*100.0); - modbus_data[MODBUS_REGISTERS::W_TEMP] = uint16_t(w_temp_raw*100.0); -} - -float get_dust() { - duration = pulseIn(HARDWARE::DUST_PIN, LOW); - lowpulseoccupancy = lowpulseoccupancy + duration; - if ((millis() - starttime) > sampletime_ms) //if the sampel time == 30s - { - ratio = lowpulseoccupancy / (sampletime_ms * 10.0); // Integer percentage 0=>100 - concentration = (1000.0 / 283.0) * 1.1 * pow(ratio, 3) - 3.8 * pow(ratio, 2) + 520 * ratio + 0.62; // using spec sheet curve - lowpulseoccupancy = 0; - starttime = millis(); - } - return concentration; -} - -void get_humidity(float& humidity) { - humidity = tempAndHumidity.readHumidity(); -} - -void get_temperature(float& si_temp) { - si_temp = tempAndHumidity.readTemperature(); -} - -void get_UV(int & UV){ - UV = uv.readUV(); -} - -void get_airQuality(int& CO2, int& TVOC, float& temp) { - if (ccs.available() && !ccs.readData()) { - CO2 = ccs.geteCO2(); - TVOC = ccs.getTVOC(); - temp = ccs.calculateTemperature(); - } - #ifdef DEBUG - else - Serial.println("CCS811 reading failed"); - #endif -} - -void poll_modbus() { - poll_state = slave.poll(modbus_data, num_modbus_registers); - communication_good = !slave.getTimeOutState(); -} - -void set_leds(){ - if(poll_state > 4){ - message_count++; - if(message_count > 2){ - digitalWrite(HARDWARE::LED_BLUE_EXTRA, !digitalRead(HARDWARE::LED_BLUE_EXTRA)); - message_count = 0; - } - - digitalWrite(HARDWARE::LED_GREEN, LOW); - digitalWrite(HARDWARE::LED_RED, HIGH); - }else if(!communication_good){ - digitalWrite(HARDWARE::LED_BLUE_EXTRA, LOW); - digitalWrite(HARDWARE::LED_GREEN, HIGH); - digitalWrite(HARDWARE::LED_RED, LOW); - } -} +#include +#include +#include +#include +#include +#include + +#define DEBUG //uncomment this line for a serial print of sensor data + +//Hardware// +enum HARDWARE{ + RS485_RX = 7, + RS485_TX = 8, + RS485_EN = 5, + + I2C_SDA = 18, + i2c_SCL = 19, + + DUST_PIN = 23, + + LED_BLUE_EXTRA = 13, + LED_GREEN = 32, + LED_RED = 1, + LED_BLUE = 6, + + WIND_PIN = A0, + W_TEMP_PIN = A8 +}; + +//Modbus// +enum MODBUS_REGISTERS{ + DUST = 0, //Pts/L //unkown range + UV = 1, //unitless //unknown range + CO2 = 2, //pts/mil //ranges from 400 to 8192 + TVOC = 3, //pts/bil //ranges from 0 to 1187 + CC_TEMP = 4, //C //EARLY TESTING SHOWS CC_TEMP TO BE EXTREMLY INACURATE. + SI_TEMP = 5, //C +/- .4C // SI_TEMP IS FAR MORE ACURATE. ranges from -10C to 85C + HUMIDITY = 6, //RH% +/- 3% //ranges from 0%-80% + WIND = 7, + W_TEMP = 8 +}; + +const uint8_t node_id = 1; +const uint8_t modbus_serial_port_number = 3; +uint16_t modbus_data[] = {0,0,0,0,0,0,0,0,0}; +uint8_t num_modbus_registers = 0; +int8_t poll_state =0; +bool communication_good = false; +uint8_t message_count = 0; + +//Dust Sensor// +unsigned long duration; +unsigned long starttime; +unsigned long sampletime_ms = 30000;//recomended sample time: 30s +unsigned long lowpulseoccupancy = 0; +float ratio = 0; +float concentration = 0; + +//sensor registors// +float dust_raw =0.0; +int UV_raw = 0; +int CO2_raw = 0; +int TVOC_raw = 0; +float CC_temp_raw = 0.0; +float si_temp_raw = 0.0; +float humidity_raw = 0.0; +float wind_raw = 0.0; +float w_temp_raw = 0.0; + +//Class Instantiations// +Modbus slave(node_id, modbus_serial_port_number, HARDWARE::RS485_EN); +Adafruit_CCS811 ccs; +Adafruit_Si7021 tempAndHumidity = Adafruit_Si7021(); +Adafruit_VEML6070 uv = Adafruit_VEML6070(); +WindTemp MD(HARDWARE::WIND_PIN,HARDWARE::W_TEMP_PIN); + + +void setup() { + #ifdef DEBUG + Serial.begin(9600); + #endif + setup_hardware(); + + //setup modbus + num_modbus_registers = sizeof(modbus_data) / sizeof(modbus_data[0]); + slave.begin(115200); + slave.setTimeOut(3000); //timeout of 3 seconds because sensors don't need to be pulled often. +} + +void loop() { + update_sensor_data(); + + #ifdef DEBUG + Serial.print("Dust: "); + Serial.print(dust_raw); + Serial.print("pcs/L UV: "); + Serial.print(UV_raw); + Serial.print(" humidity: "); + Serial.print(humidity_raw); + Serial.print(" si_temperature: "); + Serial.print(si_temp_raw); + Serial.print("C CO2: "); + Serial.print(CO2_raw); + Serial.print("ppm TVOC: "); + Serial.print(TVOC_raw); + Serial.print("ppb cc_temperature: "); + Serial.print(CC_temp_raw); + Serial.print("C wind: "); + Serial.print(wind_raw); + Serial.print(" w_temperature: "); + Serial.println(w_temp_raw); + #endif + + // Do normal polling + poll_modbus(); + set_leds(); +} + +void setup_hardware(){ + + //sensors// + pinMode(HARDWARE::DUST_PIN, INPUT); //set to read pulses from dust sensor + starttime = millis(); //sets start time + uv.begin(VEML6070_1_T); + #ifdef DEBUG + if (!ccs.begin()) + Serial.println("Sensor (CCS811) failed to be found."); + if (!tempAndHumidity.begin()) + Serial.println("Sensor (Temperature & Humidity) failed to be found."); + #else + ccs.begin(); + tempAndHumidity.begin(); + #endif + while(!ccs.available()); + float temp = ccs.calculateTemperature(); + ccs.setTempOffset(temp - 25.0); //default temperature calibration + + //LEDs// + pinMode(HARDWARE::LED_RED, OUTPUT); + pinMode(HARDWARE::LED_GREEN, OUTPUT); + pinMode(HARDWARE::LED_BLUE, OUTPUT); + pinMode(HARDWARE::LED_BLUE_EXTRA, OUTPUT); + digitalWrite(HARDWARE::LED_RED, LOW); + digitalWrite(HARDWARE::LED_GREEN, HIGH); + digitalWrite(HARDWARE::LED_BLUE, HIGH); + digitalWrite(HARDWARE::LED_BLUE_EXTRA, LOW); +} + +void update_sensor_data(){ + if(get_dust() >1) + dust_raw = concentration; + get_humidity(humidity_raw); + get_temperature(si_temp_raw); + get_airQuality(CO2_raw,TVOC_raw,CC_temp_raw); + get_UV(UV_raw); + MD.update(wind_raw,w_temp_raw); + + modbus_data[MODBUS_REGISTERS::DUST] = uint16_t(dust_raw); + modbus_data[MODBUS_REGISTERS::UV] = uint16_t(UV_raw); + modbus_data[MODBUS_REGISTERS::CO2] = uint16_t(CO2_raw); + modbus_data[MODBUS_REGISTERS::TVOC] = uint16_t(TVOC_raw); + modbus_data[MODBUS_REGISTERS::CC_TEMP] = uint16_t(CC_temp_raw*100.0); + modbus_data[MODBUS_REGISTERS::SI_TEMP] = uint16_t(si_temp_raw*100.0); + modbus_data[MODBUS_REGISTERS::HUMIDITY] = uint16_t(humidity_raw*100.0); + modbus_data[MODBUS_REGISTERS::WIND] = uint16_t(wind_raw*100.0); + modbus_data[MODBUS_REGISTERS::W_TEMP] = uint16_t(w_temp_raw*100.0); +} + +float get_dust() { + duration = pulseIn(HARDWARE::DUST_PIN, LOW); + lowpulseoccupancy = lowpulseoccupancy + duration; + if ((millis() - starttime) > sampletime_ms) //if the sampel time == 30s + { + ratio = lowpulseoccupancy / (sampletime_ms * 10.0); // Integer percentage 0=>100 + concentration = (1000.0 / 283.0) * 1.1 * pow(ratio, 3) - 3.8 * pow(ratio, 2) + 520 * ratio + 0.62; // using spec sheet curve + lowpulseoccupancy = 0; + starttime = millis(); + } + return concentration; +} + +void get_humidity(float& humidity) { + humidity = tempAndHumidity.readHumidity(); +} + +void get_temperature(float& si_temp) { + si_temp = tempAndHumidity.readTemperature(); +} + +void get_UV(int & UV){ + UV = uv.readUV(); +} + +void get_airQuality(int& CO2, int& TVOC, float& temp) { + if (ccs.available() && !ccs.readData()) { + CO2 = ccs.geteCO2(); + TVOC = ccs.getTVOC(); + temp = ccs.calculateTemperature(); + } + #ifdef DEBUG + else + Serial.println("CCS811 reading failed"); + #endif +} + +void poll_modbus() { + poll_state = slave.poll(modbus_data, num_modbus_registers); + communication_good = !slave.getTimeOutState(); +} + +void set_leds(){ + if(poll_state > 4){ + message_count++; + if(message_count > 2){ + digitalWrite(HARDWARE::LED_BLUE_EXTRA, !digitalRead(HARDWARE::LED_BLUE_EXTRA)); + message_count = 0; + } + + digitalWrite(HARDWARE::LED_GREEN, LOW); + digitalWrite(HARDWARE::LED_RED, HIGH); + }else if(!communication_good){ + digitalWrite(HARDWARE::LED_BLUE_EXTRA, LOW); + digitalWrite(HARDWARE::LED_GREEN, HIGH); + digitalWrite(HARDWARE::LED_RED, LOW); + } +} diff --git a/software/firmware/chassis_pan_tilt/MR1819_chassis_pan_tilt.ino b/software/firmware/archive/chassis_pan_tilt/MR1819_chassis_pan_tilt.ino similarity index 96% rename from software/firmware/chassis_pan_tilt/MR1819_chassis_pan_tilt.ino rename to software/firmware/archive/chassis_pan_tilt/MR1819_chassis_pan_tilt.ino index 55c3f16..09d0e79 100644 --- a/software/firmware/chassis_pan_tilt/MR1819_chassis_pan_tilt.ino +++ b/software/firmware/archive/chassis_pan_tilt/MR1819_chassis_pan_tilt.ino @@ -1,189 +1,189 @@ -////////// Includes ////////// -#include -#include - -////////// Hardware / Data Enumerations ////////// -enum HARDWARE { - RS485_EN = 2, - RS485_RX = 9, - RS485_TX = 10, - - SERVO_PAN = 5, - SERVO_TILT = 4, - SERVO_SPARE1 = 23, - SERVO_SPARE2 = 21, - - LED_RED = 1, - LED_GREEN = 32, - LED_BLUE = 6, - - LED_BLUE_EXTRA = 13 -}; - -enum MODBUS_REGISTERS { - CENTER_ALL = 0, // Input/Output - PAN_ADJUST_POSITIVE = 1, // Input/Output - PAN_ADJUST_NEGATIVE = 2, // Input/Output - TILT_ADJUST_POSITIVE = 3, // Input/Output - TILT_ADJUST_NEGATIVE = 4, // Input/Output - SPARE1_ADJUST_POSITIVE = 5, //Input/Output - SPARE1_ADJUST_NEGATIVE = 6, //Input/Output - SPARE2_ADJUST_POSITIVE = 7, //Input/Output - SPARE2_ADJUST_NEGATIVE = 8, //Input/Output -}; - -////////// Global Variables ////////// -const uint8_t node_id = 1; -const uint8_t mobus_serial_port_number = 2; - -uint16_t modbus_data[] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; -uint8_t num_modbus_registers = 0; - -int8_t poll_state = 0; -bool communication_good = false; -uint8_t message_count = 0; - -// Pan/tilt hard limits -const int pan_min = 530; -const int pan_center = 1590; -const int pan_max = 2460; - -const int tilt_min = 620; -const int tilt_center = 1670; -const int tilt_max = 2380; - -const int spare1_min = 0; -const int spare1_center = 0; -const int spare1_max = 0; - -const int spare2_min = 0; -const int spare2_center = 0; -const int spare2_max = 0; - -// Pan/tilt positions -int pan_position = pan_center; -int tilt_position = tilt_center; -int spare1_position = spare1_center; -int spare2_position = spare2_center; - -////////// Class Instantiations ////////// -Modbus slave(node_id, mobus_serial_port_number, HARDWARE::RS485_EN); - -Servo pan_servo; -Servo tilt_servo; -Servo spare1; -Servo spare2; - -void setup() { -// Serial.begin(9600); -// while(!Serial); - setup_hardware(); - - num_modbus_registers = sizeof(modbus_data) / sizeof(modbus_data[0]); - - slave.begin(115200); - slave.setTimeOut(150); - -} - -void loop() { - poll_modbus(); - set_leds(); - set_pan_tilt_adjustments(); -} - -void setup_hardware() { - // Setup pins as inputs / outputs - pinMode(HARDWARE::RS485_EN, OUTPUT); - - pinMode(HARDWARE::SERVO_PAN, OUTPUT); - pinMode(HARDWARE::SERVO_TILT, OUTPUT); - pinMode(HARDWARE::SERVO_SPARE1, OUTPUT); - pinMode(HARDWARE::SERVO_SPARE2, OUTPUT); - - pan_servo.attach(HARDWARE::SERVO_PAN); - tilt_servo.attach(HARDWARE::SERVO_TILT); - spare1.attach(HARDWARE::SERVO_SPARE1); - spare2.attach(HARDWARE::SERVO_SPARE2); - - pan_servo.writeMicroseconds(pan_center); - tilt_servo.writeMicroseconds(tilt_center); - spare1.writeMicroseconds(spare1_center); - spare2.writeMicroseconds(spare2_center); - - pinMode(HARDWARE::LED_RED, OUTPUT); - pinMode(HARDWARE::LED_GREEN, OUTPUT); - pinMode(HARDWARE::LED_BLUE, OUTPUT); - - pinMode(HARDWARE::LED_BLUE_EXTRA, OUTPUT); - - // Set default pin states - digitalWrite(HARDWARE::LED_RED, LOW); - digitalWrite(HARDWARE::LED_GREEN, HIGH); - digitalWrite(HARDWARE::LED_BLUE, HIGH); - - digitalWrite(HARDWARE::LED_BLUE_EXTRA, LOW); -} - -void poll_modbus() { - poll_state = slave.poll(modbus_data, num_modbus_registers); - communication_good = !slave.getTimeOutState(); -} - -void set_leds() { - if (poll_state > 4) { - message_count++; - if (message_count > 2) { - digitalWrite(HARDWARE::LED_BLUE_EXTRA, !digitalRead(HARDWARE::LED_BLUE_EXTRA)); - message_count = 0; - } - - digitalWrite(HARDWARE::LED_GREEN, LOW); - digitalWrite(HARDWARE::LED_RED, HIGH); - } else if (!communication_good) { - digitalWrite(HARDWARE::LED_BLUE_EXTRA, LOW); - digitalWrite(HARDWARE::LED_GREEN, HIGH); - digitalWrite(HARDWARE::LED_RED, LOW); - } -} - -void set_pan_tilt_adjustments() { - if (communication_good) { - if (modbus_data[MODBUS_REGISTERS::CENTER_ALL]) { - pan_servo.writeMicroseconds(constrain(pan_position, pan_min, pan_max)); - tilt_servo.writeMicroseconds(constrain(tilt_position, tilt_min, tilt_max)); - spare1.writeMicroseconds(constrain(spare1_position,spare1_min,spare1_max)); - spare2.writeMicroseconds(constrain(spare2_position,spare2_min,spare2_max)); - - pan_position = pan_center; - tilt_position = tilt_center; - spare1_position = spare1_center; - spare2_position = spare2_center; - - modbus_data[MODBUS_REGISTERS::CENTER_ALL] = 0; - } - - pan_position = constrain(pan_position + modbus_data[MODBUS_REGISTERS::PAN_ADJUST_POSITIVE] - modbus_data[MODBUS_REGISTERS::PAN_ADJUST_NEGATIVE], pan_min, pan_max); - tilt_position = constrain(tilt_position + modbus_data[MODBUS_REGISTERS::TILT_ADJUST_POSITIVE] - modbus_data[MODBUS_REGISTERS::TILT_ADJUST_NEGATIVE], tilt_min, tilt_max); - spare1_position = constrain(spare1_position + modbus_data[MODBUS_REGISTERS::SPARE1_ADJUST_POSITIVE] - modbus_data[MODBUS_REGISTERS::SPARE1_ADJUST_NEGATIVE], spare1_min, spare1_max); - spare2_position = constrain(spare2_position + modbus_data[MODBUS_REGISTERS::SPARE2_ADJUST_POSITIVE] - modbus_data[MODBUS_REGISTERS::SPARE2_ADJUST_NEGATIVE], spare2_min, spare2_max); - - pan_servo.writeMicroseconds(pan_position); - tilt_servo.writeMicroseconds(tilt_position); - spare1.writeMicroseconds(spare1_position); - spare2.writeMicroseconds(spare2_position); - -// Serial.print(pan_position); -// Serial.print("\t"); -// Serial.println(tilt_position); - - modbus_data[MODBUS_REGISTERS::PAN_ADJUST_POSITIVE] = 0; - modbus_data[MODBUS_REGISTERS::PAN_ADJUST_NEGATIVE] = 0; - modbus_data[MODBUS_REGISTERS::TILT_ADJUST_POSITIVE] = 0; - modbus_data[MODBUS_REGISTERS::TILT_ADJUST_NEGATIVE] = 0; - modbus_data[MODBUS_REGISTERS::SPARE1_ADJUST_POSITIVE] = 0; - modbus_data[MODBUS_REGISTERS::SPARE1_ADJUST_NEGATIVE] = 0; - modbus_data[MODBUS_REGISTERS::SPARE2_ADJUST_POSITIVE] = 0; - modbus_data[MODBUS_REGISTERS::SPARE2_ADJUST_NEGATIVE] = 0; - } -} +////////// Includes ////////// +#include +#include + +////////// Hardware / Data Enumerations ////////// +enum HARDWARE { + RS485_EN = 2, + RS485_RX = 9, + RS485_TX = 10, + + SERVO_PAN = 5, + SERVO_TILT = 4, + SERVO_SPARE1 = 23, + SERVO_SPARE2 = 21, + + LED_RED = 1, + LED_GREEN = 32, + LED_BLUE = 6, + + LED_BLUE_EXTRA = 13 +}; + +enum MODBUS_REGISTERS { + CENTER_ALL = 0, // Input/Output + PAN_ADJUST_POSITIVE = 1, // Input/Output + PAN_ADJUST_NEGATIVE = 2, // Input/Output + TILT_ADJUST_POSITIVE = 3, // Input/Output + TILT_ADJUST_NEGATIVE = 4, // Input/Output + SPARE1_ADJUST_POSITIVE = 5, //Input/Output + SPARE1_ADJUST_NEGATIVE = 6, //Input/Output + SPARE2_ADJUST_POSITIVE = 7, //Input/Output + SPARE2_ADJUST_NEGATIVE = 8, //Input/Output +}; + +////////// Global Variables ////////// +const uint8_t node_id = 1; +const uint8_t mobus_serial_port_number = 2; + +uint16_t modbus_data[] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; +uint8_t num_modbus_registers = 0; + +int8_t poll_state = 0; +bool communication_good = false; +uint8_t message_count = 0; + +// Pan/tilt hard limits +const int pan_min = 530; +const int pan_center = 1590; +const int pan_max = 2460; + +const int tilt_min = 620; +const int tilt_center = 1670; +const int tilt_max = 2380; + +const int spare1_min = 0; +const int spare1_center = 0; +const int spare1_max = 0; + +const int spare2_min = 0; +const int spare2_center = 0; +const int spare2_max = 0; + +// Pan/tilt positions +int pan_position = pan_center; +int tilt_position = tilt_center; +int spare1_position = spare1_center; +int spare2_position = spare2_center; + +////////// Class Instantiations ////////// +Modbus slave(node_id, mobus_serial_port_number, HARDWARE::RS485_EN); + +Servo pan_servo; +Servo tilt_servo; +Servo spare1; +Servo spare2; + +void setup() { +// Serial.begin(9600); +// while(!Serial); + setup_hardware(); + + num_modbus_registers = sizeof(modbus_data) / sizeof(modbus_data[0]); + + slave.begin(115200); + slave.setTimeOut(150); + +} + +void loop() { + poll_modbus(); + set_leds(); + set_pan_tilt_adjustments(); +} + +void setup_hardware() { + // Setup pins as inputs / outputs + pinMode(HARDWARE::RS485_EN, OUTPUT); + + pinMode(HARDWARE::SERVO_PAN, OUTPUT); + pinMode(HARDWARE::SERVO_TILT, OUTPUT); + pinMode(HARDWARE::SERVO_SPARE1, OUTPUT); + pinMode(HARDWARE::SERVO_SPARE2, OUTPUT); + + pan_servo.attach(HARDWARE::SERVO_PAN); + tilt_servo.attach(HARDWARE::SERVO_TILT); + spare1.attach(HARDWARE::SERVO_SPARE1); + spare2.attach(HARDWARE::SERVO_SPARE2); + + pan_servo.writeMicroseconds(pan_center); + tilt_servo.writeMicroseconds(tilt_center); + spare1.writeMicroseconds(spare1_center); + spare2.writeMicroseconds(spare2_center); + + pinMode(HARDWARE::LED_RED, OUTPUT); + pinMode(HARDWARE::LED_GREEN, OUTPUT); + pinMode(HARDWARE::LED_BLUE, OUTPUT); + + pinMode(HARDWARE::LED_BLUE_EXTRA, OUTPUT); + + // Set default pin states + digitalWrite(HARDWARE::LED_RED, LOW); + digitalWrite(HARDWARE::LED_GREEN, HIGH); + digitalWrite(HARDWARE::LED_BLUE, HIGH); + + digitalWrite(HARDWARE::LED_BLUE_EXTRA, LOW); +} + +void poll_modbus() { + poll_state = slave.poll(modbus_data, num_modbus_registers); + communication_good = !slave.getTimeOutState(); +} + +void set_leds() { + if (poll_state > 4) { + message_count++; + if (message_count > 2) { + digitalWrite(HARDWARE::LED_BLUE_EXTRA, !digitalRead(HARDWARE::LED_BLUE_EXTRA)); + message_count = 0; + } + + digitalWrite(HARDWARE::LED_GREEN, LOW); + digitalWrite(HARDWARE::LED_RED, HIGH); + } else if (!communication_good) { + digitalWrite(HARDWARE::LED_BLUE_EXTRA, LOW); + digitalWrite(HARDWARE::LED_GREEN, HIGH); + digitalWrite(HARDWARE::LED_RED, LOW); + } +} + +void set_pan_tilt_adjustments() { + if (communication_good) { + if (modbus_data[MODBUS_REGISTERS::CENTER_ALL]) { + pan_servo.writeMicroseconds(constrain(pan_position, pan_min, pan_max)); + tilt_servo.writeMicroseconds(constrain(tilt_position, tilt_min, tilt_max)); + spare1.writeMicroseconds(constrain(spare1_position,spare1_min,spare1_max)); + spare2.writeMicroseconds(constrain(spare2_position,spare2_min,spare2_max)); + + pan_position = pan_center; + tilt_position = tilt_center; + spare1_position = spare1_center; + spare2_position = spare2_center; + + modbus_data[MODBUS_REGISTERS::CENTER_ALL] = 0; + } + + pan_position = constrain(pan_position + modbus_data[MODBUS_REGISTERS::PAN_ADJUST_POSITIVE] - modbus_data[MODBUS_REGISTERS::PAN_ADJUST_NEGATIVE], pan_min, pan_max); + tilt_position = constrain(tilt_position + modbus_data[MODBUS_REGISTERS::TILT_ADJUST_POSITIVE] - modbus_data[MODBUS_REGISTERS::TILT_ADJUST_NEGATIVE], tilt_min, tilt_max); + spare1_position = constrain(spare1_position + modbus_data[MODBUS_REGISTERS::SPARE1_ADJUST_POSITIVE] - modbus_data[MODBUS_REGISTERS::SPARE1_ADJUST_NEGATIVE], spare1_min, spare1_max); + spare2_position = constrain(spare2_position + modbus_data[MODBUS_REGISTERS::SPARE2_ADJUST_POSITIVE] - modbus_data[MODBUS_REGISTERS::SPARE2_ADJUST_NEGATIVE], spare2_min, spare2_max); + + pan_servo.writeMicroseconds(pan_position); + tilt_servo.writeMicroseconds(tilt_position); + spare1.writeMicroseconds(spare1_position); + spare2.writeMicroseconds(spare2_position); + +// Serial.print(pan_position); +// Serial.print("\t"); +// Serial.println(tilt_position); + + modbus_data[MODBUS_REGISTERS::PAN_ADJUST_POSITIVE] = 0; + modbus_data[MODBUS_REGISTERS::PAN_ADJUST_NEGATIVE] = 0; + modbus_data[MODBUS_REGISTERS::TILT_ADJUST_POSITIVE] = 0; + modbus_data[MODBUS_REGISTERS::TILT_ADJUST_NEGATIVE] = 0; + modbus_data[MODBUS_REGISTERS::SPARE1_ADJUST_POSITIVE] = 0; + modbus_data[MODBUS_REGISTERS::SPARE1_ADJUST_NEGATIVE] = 0; + modbus_data[MODBUS_REGISTERS::SPARE2_ADJUST_POSITIVE] = 0; + modbus_data[MODBUS_REGISTERS::SPARE2_ADJUST_NEGATIVE] = 0; + } +} diff --git a/software/firmware/freq_testing/freq_testing.ino b/software/firmware/archive/freq_testing/freq_testing.ino similarity index 100% rename from software/firmware/freq_testing/freq_testing.ino rename to software/firmware/archive/freq_testing/freq_testing.ino diff --git a/software/firmware/grasping_end_effector/grasping_end_effector.ino b/software/firmware/archive/grasping_end_effector/grasping_end_effector.ino similarity index 100% rename from software/firmware/grasping_end_effector/grasping_end_effector.ino rename to software/firmware/archive/grasping_end_effector/grasping_end_effector.ino diff --git a/software/firmware/gripper/gripper.ino b/software/firmware/archive/gripper/gripper.ino similarity index 100% rename from software/firmware/gripper/gripper.ino rename to software/firmware/archive/gripper/gripper.ino diff --git a/software/firmware/iris/iris.ino b/software/firmware/archive/iris/iris.ino similarity index 100% rename from software/firmware/iris/iris.ino rename to software/firmware/archive/iris/iris.ino diff --git a/software/firmware/libraries/Adafruit_BNO055_t3/Adafruit_BNO055_t3.cpp b/software/firmware/archive/libraries/Adafruit_BNO055_t3/Adafruit_BNO055_t3.cpp similarity index 100% rename from software/firmware/libraries/Adafruit_BNO055_t3/Adafruit_BNO055_t3.cpp rename to software/firmware/archive/libraries/Adafruit_BNO055_t3/Adafruit_BNO055_t3.cpp diff --git a/software/firmware/libraries/Adafruit_BNO055_t3/Adafruit_BNO055_t3.h b/software/firmware/archive/libraries/Adafruit_BNO055_t3/Adafruit_BNO055_t3.h similarity index 100% rename from software/firmware/libraries/Adafruit_BNO055_t3/Adafruit_BNO055_t3.h rename to software/firmware/archive/libraries/Adafruit_BNO055_t3/Adafruit_BNO055_t3.h diff --git a/software/firmware/libraries/Adafruit_BNO055_t3/utility/imumaths.h b/software/firmware/archive/libraries/Adafruit_BNO055_t3/utility/imumaths.h similarity index 100% rename from software/firmware/libraries/Adafruit_BNO055_t3/utility/imumaths.h rename to software/firmware/archive/libraries/Adafruit_BNO055_t3/utility/imumaths.h diff --git a/software/firmware/libraries/Adafruit_BNO055_t3/utility/matrix.h b/software/firmware/archive/libraries/Adafruit_BNO055_t3/utility/matrix.h similarity index 100% rename from software/firmware/libraries/Adafruit_BNO055_t3/utility/matrix.h rename to software/firmware/archive/libraries/Adafruit_BNO055_t3/utility/matrix.h diff --git a/software/firmware/libraries/Adafruit_BNO055_t3/utility/quaternion.h b/software/firmware/archive/libraries/Adafruit_BNO055_t3/utility/quaternion.h similarity index 100% rename from software/firmware/libraries/Adafruit_BNO055_t3/utility/quaternion.h rename to software/firmware/archive/libraries/Adafruit_BNO055_t3/utility/quaternion.h diff --git a/software/firmware/libraries/Adafruit_BNO055_t3/utility/vector.h b/software/firmware/archive/libraries/Adafruit_BNO055_t3/utility/vector.h similarity index 100% rename from software/firmware/libraries/Adafruit_BNO055_t3/utility/vector.h rename to software/firmware/archive/libraries/Adafruit_BNO055_t3/utility/vector.h diff --git a/software/firmware/libraries/Adafruit_Sensor/Adafruit_Sensor.h b/software/firmware/archive/libraries/Adafruit_Sensor/Adafruit_Sensor.h similarity index 100% rename from software/firmware/libraries/Adafruit_Sensor/Adafruit_Sensor.h rename to software/firmware/archive/libraries/Adafruit_Sensor/Adafruit_Sensor.h diff --git a/software/firmware/libraries/Adafruit_Sensor/README.md b/software/firmware/archive/libraries/Adafruit_Sensor/README.md similarity index 100% rename from software/firmware/libraries/Adafruit_Sensor/README.md rename to software/firmware/archive/libraries/Adafruit_Sensor/README.md diff --git a/software/firmware/libraries/Adafruit_Sensor/library.properties b/software/firmware/archive/libraries/Adafruit_Sensor/library.properties similarity index 100% rename from software/firmware/libraries/Adafruit_Sensor/library.properties rename to software/firmware/archive/libraries/Adafruit_Sensor/library.properties diff --git a/software/firmware/libraries/ArduinoJson/ArduinoJson.h b/software/firmware/archive/libraries/ArduinoJson/ArduinoJson.h similarity index 100% rename from software/firmware/libraries/ArduinoJson/ArduinoJson.h rename to software/firmware/archive/libraries/ArduinoJson/ArduinoJson.h diff --git a/software/firmware/libraries/ArduinoJson/CHANGELOG.md b/software/firmware/archive/libraries/ArduinoJson/CHANGELOG.md similarity index 96% rename from software/firmware/libraries/ArduinoJson/CHANGELOG.md rename to software/firmware/archive/libraries/ArduinoJson/CHANGELOG.md index e5adea8..4171f27 100644 --- a/software/firmware/libraries/ArduinoJson/CHANGELOG.md +++ b/software/firmware/archive/libraries/ArduinoJson/CHANGELOG.md @@ -1,490 +1,490 @@ -ArduinoJson: change log -======================= - -v5.13.5 -------- - -* Fixed warning "unused variable" with GCC 4.4 (issue #912) -* Fixed warning "maybe uninitialized" (issue #909) -* Added an clear message for `StaticJsonDocument`, `DynamicJsonDocument`... - -v5.13.4 -------- - -* Removed spurious files in the Particle library - -v5.13.3 -------- - -* Improved float serialization when `-fsingle-precision-constant` is used -* Fixed `JsonVariant::is()` that returned true for empty strings -* Fixed `JsonVariant::is()` (closes #763) - -v5.13.2 -------- - -* Fixed `JsonBuffer::parse()` not respecting nesting limit correctly (issue #693) -* Fixed inconsistencies in nesting level counting (PR #695 from Zhenyu Wu) -* Fixed null values that could be pass to `strcmp()` (PR #745 from Mike Karlesky) -* Added macros `ARDUINOJSON_VERSION`, `ARDUINOJSON_VERSION_MAJOR`... - -v5.13.1 -------- - -* Fixed `JsonVariant::operator|(int)` that returned the default value if the variant contained a double (issue #675) -* Allowed non-quoted key to contain underscores (issue #665) - -v5.13.0 -------- - -* Changed the rules of string duplication (issue #658) -* `RawJson()` accepts any kind of string and obeys to the same rules for duplication -* Changed the return type of `strdup()` to `const char*` to prevent double duplication -* Marked `strdup()` as deprecated - -> ### New rules for string duplication -> -> | type | duplication | -> |:---------------------------|:------------| -> | const char* | no | -> | char* | ~~no~~ yes | -> | String | yes | -> | std::string | yes | -> | const __FlashStringHelper* | yes | -> -> These new rules make `JsonBuffer::strdup()` useless. - -v5.12.0 -------- - -* Added `JsonVariant::operator|` to return a default value (see below) -* Added a clear error message when compiled as C instead of C++ (issue #629) -* Added detection of MPLAB XC compiler (issue #629) -* Added detection of Keil ARM Compiler (issue #629) -* Added an example that shows how to save and load a configuration file -* Reworked all other examples - -> ### How to use the new feature? -> -> If you have a block like this: -> -> ```c++ -> const char* ssid = root["ssid"]; -> if (!ssid) -> ssid = "default ssid"; -> ``` -> -> You can simplify like that: -> -> ```c++ -> const char* ssid = root["ssid"] | "default ssid"; -> ``` - -v5.11.2 -------- - -* Fixed `DynamicJsonBuffer::clear()` not resetting allocation size (issue #561) -* Fixed incorrect rounding for float values (issue #588) - -v5.11.1 -------- - -* Removed dependency on `PGM_P` as Particle 0.6.2 doesn't define it (issue #546) -* Fixed warning "dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]" -* Fixed warning "floating constant exceeds range of 'float' [-Woverflow]" (issue #544) -* Fixed warning "this statement may fall through" [-Wimplicit-fallthrough=] (issue #539) -* Removed `ARDUINOJSON_DOUBLE_IS_64BITS` as it became useless. -* Fixed too many decimals places in float serialization (issue #543) - -v5.11.0 -------- - -* Made `JsonBuffer` non-copyable (PR #524 by @luisrayas3) -* Added `StaticJsonBuffer::clear()` -* Added `DynamicJsonBuffer::clear()` - -v5.10.1 -------- - -* Fixed IntelliSense errors in Visual Micro (issue #483) -* Fixed compilation in IAR Embedded Workbench (issue #515) -* Fixed reading "true" as a float (issue #516) -* Added `ARDUINOJSON_DOUBLE_IS_64BITS` -* Added `ARDUINOJSON_EMBEDDED_MODE` - -v5.10.0 -------- - -* Removed configurable number of decimal places (issues #288, #427 and #506) -* Changed exponentiation thresholds to `1e7` and `1e-5` (issues #288, #427 and #506) -* `JsonVariant::is()` now returns `true` for integers -* Fixed error `IsBaseOf is not a member of ArduinoJson::TypeTraits` (issue #495) -* Fixed error `forming reference to reference` (issue #495) - -> ### BREAKING CHANGES :warning: -> -> | Old syntax | New syntax | -> |:--------------------------------|:--------------------| -> | `double_with_n_digits(3.14, 2)` | `3.14` | -> | `float_with_n_digits(3.14, 2)` | `3.14f` | -> | `obj.set("key", 3.14, 2)` | `obj["key"] = 3.14` | -> | `arr.add(3.14, 2)` | `arr.add(3.14)` | -> -> | Input | Old output | New output | -> |:----------|:-----------|:-----------| -> | `3.14159` | `3.14` | `3.14159` | -> | `42.0` | `42.00` | `42` | -> | `0.0` | `0.00` | `0` | -> -> | Expression | Old result | New result | -> |:-------------------------------|:-----------|:-----------| -> | `JsonVariant(42).is()` | `true` | `true` | -> | `JsonVariant(42).is()` | `false` | `true` | -> | `JsonVariant(42).is()` | `false` | `true` | - -v5.9.0 ------- - -* Added `JsonArray::remove(iterator)` (issue #479) -* Added `JsonObject::remove(iterator)` -* Renamed `JsonArray::removeAt(size_t)` into `remove(size_t)` -* Renamed folder `include/` to `src/` -* Fixed warnings `floating constant exceeds range of float`and `floating constant truncated to zero` (issue #483) -* Removed `Print` class and converted `printTo()` to a template method (issue #276) -* Removed example `IndentedPrintExample.ino` -* Now compatible with Particle 0.6.1, thanks to Jacob Nite (issue #294 and PR #461 by @foodbag) - -v5.8.4 ------- - -* Added custom implementation of `strtod()` (issue #453) -* Added custom implementation of `strtol()` (issue #465) -* `char` is now treated as an integral type (issue #337, #370) - -v5.8.3 ------- - -* Fixed an access violation in `DynamicJsonBuffer` when memory allocation fails (issue #433) -* Added operators `==` and `!=` for two `JsonVariant`s (issue #436) -* Fixed `JsonVariant::operator[const FlashStringHelper*]` (issue #441) - -v5.8.2 ------- - -* Fixed parsing of comments (issue #421) -* Fixed ignored `Stream` timeout (issue #422) -* Made sure we don't read more that necessary (issue #422) -* Fixed error when the key of a `JsonObject` is a `char[]` (issue #423) -* Reduced code size when using `const` references -* Fixed error with string of type `unsigned char*` (issue #428) -* Added `deprecated` attribute on `asArray()`, `asObject()` and `asString()` (issue #420) - -v5.8.1 ------- - -* Fixed error when assigning a `volatile int` to a `JsonVariant` (issue #415) -* Fixed errors with Variable Length Arrays (issue #416) -* Fixed error when both `ARDUINOJSON_ENABLE_STD_STREAM` and `ARDUINOJSON_ENABLE_ARDUINO_STREAM` are set to `1` -* Fixed error "Stream does not name a type" (issue #412) - -v5.8.0 ------- - -* Added operator `==` to compare `JsonVariant` and strings (issue #402) -* Added support for `Stream` (issue #300) -* Reduced memory consumption by not duplicating spaces and comments - -> ### BREAKING CHANGES :warning: -> -> `JsonBuffer::parseObject()` and `JsonBuffer::parseArray()` have been pulled down to the derived classes `DynamicJsonBuffer` and `StaticJsonBufferBase`. -> -> This means that if you have code like: -> -> ```c++ -> void myFunction(JsonBuffer& jsonBuffer); -> ``` -> -> you need to replace it with one of the following: -> -> ```c++ -> void myFunction(DynamicJsonBuffer& jsonBuffer); -> void myFunction(StaticJsonBufferBase& jsonBuffer); -> template void myFunction(TJsonBuffer& jsonBuffer); -> ``` - -v5.7.3 ------- - -* Added an `printTo(char[N])` and `prettyPrintTo(char[N])` (issue #292) -* Added ability to set a nested value like this: `root["A"]["B"] = "C"` (issue #352) -* Renamed `*.ipp` to `*Impl.hpp` because they were ignored by Arduino IDE (issue #396) - -v5.7.2 ------- - -* Made PROGMEM available on more platforms (issue #381) -* Fixed PROGMEM causing an exception on ESP8266 (issue #383) - -v5.7.1 ------- - -* Added support for PROGMEM (issue #76) -* Fixed compilation error when index is not an `int` (issue #381) - -v5.7.0 ------- - -* Templatized all functions using `String` or `std::string` -* Removed `ArduinoJson::String` -* Removed `JsonVariant::defaultValue()` -* Removed non-template `JsonObject::get()` and `JsonArray.get()` -* Fixed support for `StringSumHelper` (issue #184) -* Replaced `ARDUINOJSON_USE_ARDUINO_STRING` by `ARDUINOJSON_ENABLE_STD_STRING` and `ARDUINOJSON_ENABLE_ARDUINO_STRING` (issue #378) -* Added example `StringExample.ino` to show where `String` can be used -* Increased default nesting limit to 50 when compiled for a computer (issue #349) - -> ### BREAKING CHANGES :warning: -> -> The non-template functions `JsonObject::get()` and `JsonArray.get()` have been removed. This means that you need to explicitely tell the type you expect in return. -> -> Old code: -> -> ```c++ -> #define ARDUINOJSON_USE_ARDUINO_STRING 0 -> JsonVariant value1 = myObject.get("myKey"); -> JsonVariant value2 = myArray.get(0); -> ``` -> -> New code: -> -> ```c++ -> #define ARDUINOJSON_ENABLE_ARDUINO_STRING 0 -> #define ARDUINOJSON_ENABLE_STD_STRING 1 -> JsonVariant value1 = myObject.get("myKey"); -> JsonVariant value2 = myArray.get(0); -> ``` - -v5.6.7 ------- - -* Fixed `array[idx].as()` and `object[key].as()` -* Fixed return value of `JsonObject::set()` (issue #350) -* Fixed undefined behavior in `Prettyfier` and `Print` (issue #354) -* Fixed parser that incorrectly rejected floats containing a `+` (issue #349) - -v5.6.6 ------- - -* Fixed `-Wparentheses` warning introduced in v5.6.5 (PR #335 by @nuket) -* Added `.mbedignore` for ARM mbdeb (PR #334 by @nuket) -* Fixed `JsonVariant::success()` which didn't propagate `JsonArray::success()` nor `JsonObject::success()` (issue #342). - -v5.6.5 ------- - -* `as()` now returns `true` when input is `null` (issue #330) - -v5.6.4 ------- - -* Fixed error in float serialization (issue #324) - -v5.6.3 ------- - -* Improved speed of float serialization (about twice faster) -* Added `as()` as a synonym for `as()`... (issue #291) -* Fixed `call of overloaded isinf(double&) is ambiguous` (issue #284) - -v5.6.2 ------- - -* Fixed build when another lib does `#undef isnan` (issue #284) - -v5.6.1 ------- - -* Added missing `#pragma once` (issue #310) - -v5.6.0 ------- - -* ArduinoJson is now a header-only library (issue #199) - -v5.5.1 ------- - -* Fixed compilation error with Intel Galileo (issue #299) - -v5.5.0 ------- - -* Added `JsonVariant::success()` (issue #279) -* Renamed `JsonVariant::invalid()` to `JsonVariant::defaultValue()` - -v5.4.0 ------- - -* Changed `::String` to `ArduinoJson::String` (issue #275) -* Changed `::Print` to `ArduinoJson::Print` too - -v5.3.0 ------- - -* Added custom implementation of `ftoa` (issues #266, #267, #269 and #270) -* Added `JsonVariant JsonBuffer::parse()` (issue #265) -* Fixed `unsigned long` printed as `signed long` (issue #170) - -v5.2.0 ------- - -* Added `JsonVariant::as()` as a synonym for `JsonVariant::as()` (issue #257) -* Added example `JsonHttpClient` (issue #256) -* Added `JsonArray::copyTo()` and `JsonArray::copyFrom()` (issue #254) -* Added `RawJson()` to insert pregenerated JSON portions (issue #259) - -v5.1.1 ------- - -* Removed `String` duplication when one replaces a value in a `JsonObject` (PR #232 by @ulion) - -v5.1.0 ------- - -* Added support of `long long` (issue #171) -* Moved all build settings to `ArduinoJson/Configuration.hpp` - -> ### BREAKING CHANGE :warning: -> -> If you defined `ARDUINOJSON_ENABLE_STD_STREAM`, you now need to define it to `1`. - -v5.0.8 ------- - -* Made the library compatible with [PlatformIO](http://platformio.org/) (issue #181) -* Fixed `JsonVariant::is()` that was incorrectly returning false (issue #214) - -v5.0.7 ------- - -* Made library easier to use from a CMake project: simply `add_subdirectory(ArduinoJson/src)` -* Changed `String` to be a `typedef` of `std::string` (issues #142 and #161) - -> ### BREAKING CHANGES :warning: -> -> - `JsonVariant(true).as()` now returns `"true"` instead of `"1"` -> - `JsonVariant(false).as()` now returns `"false"` instead of `"0"` - -v5.0.6 ------- - -* Added parameter to `DynamicJsonBuffer` constructor to set initial size (issue #152) -* Fixed warning about library category in Arduino 1.6.6 (issue #147) -* Examples: Added a loop to wait for serial port to be ready (issue #156) - -v5.0.5 ------- - -* Added overload `JsonObjectSuscript::set(value, decimals)` (issue #143) -* Use `float` instead of `double` to reduce the size of `JsonVariant` (issue #134) - -v5.0.4 ------- - -* Fixed ambiguous overload with `JsonArraySubscript` and `JsonObjectSubscript` (issue #122) - -v5.0.3 ------- - -* Fixed `printTo(String)` which wrote numbers instead of strings (issue #120) -* Fixed return type of `JsonArray::is()` and some others (issue #121) - -v5.0.2 ------- - -* Fixed segmentation fault in `parseObject(String)` and `parseArray(String)`, when the - `StaticJsonBuffer` is too small to hold a copy of the string -* Fixed Clang warning "register specifier is deprecated" (issue #102) -* Fixed GCC warning "declaration shadows a member" (issue #103) -* Fixed memory alignment, which made ESP8266 crash (issue #104) -* Fixed compilation on Visual Studio 2010 and 2012 (issue #107) - -v5.0.1 ------- - -* Fixed compilation with Arduino 1.0.6 (issue #99) - -v5.0.0 ------- - -* Added support of `String` class (issues #55, #56, #70, #77) -* Added `JsonBuffer::strdup()` to make a copy of a string (issues #10, #57) -* Implicitly call `strdup()` for `String` but not for `char*` (issues #84, #87) -* Added support of non standard JSON input (issue #44) -* Added support of comments in JSON input (issue #88) -* Added implicit cast between numerical types (issues #64, #69, #93) -* Added ability to read number values as string (issue #90) -* Redesigned `JsonVariant` to leverage converting constructors instead of assignment operators (issue #66) -* Switched to new the library layout (requires Arduino 1.0.6 or above) - -> ### BREAKING CHANGES :warning: -> -> - `JsonObject::add()` was renamed to `set()` -> - `JsonArray::at()` and `JsonObject::at()` were renamed to `get()` -> - Number of digits of floating point value are now set with `double_with_n_digits()` - -**Personal note about the `String` class**: -Support of the `String` class has been added to the library because many people use it in their programs. -However, you should not see this as an invitation to use the `String` class. -The `String` class is **bad** because it uses dynamic memory allocation. -Compared to static allocation, it compiles to a bigger, slower program, and is less predictable. -You certainly don't want that in an embedded environment! - -v4.6 ----- - -* Fixed segmentation fault in `DynamicJsonBuffer` when memory allocation fails (issue #92) - -v4.5 ----- - -* Fixed buffer overflow when input contains a backslash followed by a terminator (issue #81) - -**Upgrading is recommended** since previous versions contain a potential security risk. - -Special thanks to [Giancarlo Canales Barreto](https://github.com/gcanalesb) for finding this nasty bug. - -v4.4 ----- - -* Added `JsonArray::measureLength()` and `JsonObject::measureLength()` (issue #75) - -v4.3 ----- - -* Added `JsonArray::removeAt()` to remove an element of an array (issue #58) -* Fixed stack-overflow in `DynamicJsonBuffer` when parsing huge JSON files (issue #65) -* Fixed wrong return value of `parseArray()` and `parseObject()` when allocation fails (issue #68) - -v4.2 ----- - -* Switched back to old library layout (issues #39, #43 and #45) -* Removed global new operator overload (issue #40, #45 and #46) -* Added an example with EthernetServer - -v4.1 ----- - -* Added DynamicJsonBuffer (issue #19) - -v4.0 ----- - -* Unified parser and generator API (issue #23) -* Updated library layout, now requires Arduino 1.0.6 or newer - -> ### BREAKING CHANGES :warning: -> -> API changed significantly since v3, see [Migrating code to the new API](https://arduinojson.org/doc/migration/). - +ArduinoJson: change log +======================= + +v5.13.5 +------- + +* Fixed warning "unused variable" with GCC 4.4 (issue #912) +* Fixed warning "maybe uninitialized" (issue #909) +* Added an clear message for `StaticJsonDocument`, `DynamicJsonDocument`... + +v5.13.4 +------- + +* Removed spurious files in the Particle library + +v5.13.3 +------- + +* Improved float serialization when `-fsingle-precision-constant` is used +* Fixed `JsonVariant::is()` that returned true for empty strings +* Fixed `JsonVariant::is()` (closes #763) + +v5.13.2 +------- + +* Fixed `JsonBuffer::parse()` not respecting nesting limit correctly (issue #693) +* Fixed inconsistencies in nesting level counting (PR #695 from Zhenyu Wu) +* Fixed null values that could be pass to `strcmp()` (PR #745 from Mike Karlesky) +* Added macros `ARDUINOJSON_VERSION`, `ARDUINOJSON_VERSION_MAJOR`... + +v5.13.1 +------- + +* Fixed `JsonVariant::operator|(int)` that returned the default value if the variant contained a double (issue #675) +* Allowed non-quoted key to contain underscores (issue #665) + +v5.13.0 +------- + +* Changed the rules of string duplication (issue #658) +* `RawJson()` accepts any kind of string and obeys to the same rules for duplication +* Changed the return type of `strdup()` to `const char*` to prevent double duplication +* Marked `strdup()` as deprecated + +> ### New rules for string duplication +> +> | type | duplication | +> |:---------------------------|:------------| +> | const char* | no | +> | char* | ~~no~~ yes | +> | String | yes | +> | std::string | yes | +> | const __FlashStringHelper* | yes | +> +> These new rules make `JsonBuffer::strdup()` useless. + +v5.12.0 +------- + +* Added `JsonVariant::operator|` to return a default value (see below) +* Added a clear error message when compiled as C instead of C++ (issue #629) +* Added detection of MPLAB XC compiler (issue #629) +* Added detection of Keil ARM Compiler (issue #629) +* Added an example that shows how to save and load a configuration file +* Reworked all other examples + +> ### How to use the new feature? +> +> If you have a block like this: +> +> ```c++ +> const char* ssid = root["ssid"]; +> if (!ssid) +> ssid = "default ssid"; +> ``` +> +> You can simplify like that: +> +> ```c++ +> const char* ssid = root["ssid"] | "default ssid"; +> ``` + +v5.11.2 +------- + +* Fixed `DynamicJsonBuffer::clear()` not resetting allocation size (issue #561) +* Fixed incorrect rounding for float values (issue #588) + +v5.11.1 +------- + +* Removed dependency on `PGM_P` as Particle 0.6.2 doesn't define it (issue #546) +* Fixed warning "dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]" +* Fixed warning "floating constant exceeds range of 'float' [-Woverflow]" (issue #544) +* Fixed warning "this statement may fall through" [-Wimplicit-fallthrough=] (issue #539) +* Removed `ARDUINOJSON_DOUBLE_IS_64BITS` as it became useless. +* Fixed too many decimals places in float serialization (issue #543) + +v5.11.0 +------- + +* Made `JsonBuffer` non-copyable (PR #524 by @luisrayas3) +* Added `StaticJsonBuffer::clear()` +* Added `DynamicJsonBuffer::clear()` + +v5.10.1 +------- + +* Fixed IntelliSense errors in Visual Micro (issue #483) +* Fixed compilation in IAR Embedded Workbench (issue #515) +* Fixed reading "true" as a float (issue #516) +* Added `ARDUINOJSON_DOUBLE_IS_64BITS` +* Added `ARDUINOJSON_EMBEDDED_MODE` + +v5.10.0 +------- + +* Removed configurable number of decimal places (issues #288, #427 and #506) +* Changed exponentiation thresholds to `1e7` and `1e-5` (issues #288, #427 and #506) +* `JsonVariant::is()` now returns `true` for integers +* Fixed error `IsBaseOf is not a member of ArduinoJson::TypeTraits` (issue #495) +* Fixed error `forming reference to reference` (issue #495) + +> ### BREAKING CHANGES :warning: +> +> | Old syntax | New syntax | +> |:--------------------------------|:--------------------| +> | `double_with_n_digits(3.14, 2)` | `3.14` | +> | `float_with_n_digits(3.14, 2)` | `3.14f` | +> | `obj.set("key", 3.14, 2)` | `obj["key"] = 3.14` | +> | `arr.add(3.14, 2)` | `arr.add(3.14)` | +> +> | Input | Old output | New output | +> |:----------|:-----------|:-----------| +> | `3.14159` | `3.14` | `3.14159` | +> | `42.0` | `42.00` | `42` | +> | `0.0` | `0.00` | `0` | +> +> | Expression | Old result | New result | +> |:-------------------------------|:-----------|:-----------| +> | `JsonVariant(42).is()` | `true` | `true` | +> | `JsonVariant(42).is()` | `false` | `true` | +> | `JsonVariant(42).is()` | `false` | `true` | + +v5.9.0 +------ + +* Added `JsonArray::remove(iterator)` (issue #479) +* Added `JsonObject::remove(iterator)` +* Renamed `JsonArray::removeAt(size_t)` into `remove(size_t)` +* Renamed folder `include/` to `src/` +* Fixed warnings `floating constant exceeds range of float`and `floating constant truncated to zero` (issue #483) +* Removed `Print` class and converted `printTo()` to a template method (issue #276) +* Removed example `IndentedPrintExample.ino` +* Now compatible with Particle 0.6.1, thanks to Jacob Nite (issue #294 and PR #461 by @foodbag) + +v5.8.4 +------ + +* Added custom implementation of `strtod()` (issue #453) +* Added custom implementation of `strtol()` (issue #465) +* `char` is now treated as an integral type (issue #337, #370) + +v5.8.3 +------ + +* Fixed an access violation in `DynamicJsonBuffer` when memory allocation fails (issue #433) +* Added operators `==` and `!=` for two `JsonVariant`s (issue #436) +* Fixed `JsonVariant::operator[const FlashStringHelper*]` (issue #441) + +v5.8.2 +------ + +* Fixed parsing of comments (issue #421) +* Fixed ignored `Stream` timeout (issue #422) +* Made sure we don't read more that necessary (issue #422) +* Fixed error when the key of a `JsonObject` is a `char[]` (issue #423) +* Reduced code size when using `const` references +* Fixed error with string of type `unsigned char*` (issue #428) +* Added `deprecated` attribute on `asArray()`, `asObject()` and `asString()` (issue #420) + +v5.8.1 +------ + +* Fixed error when assigning a `volatile int` to a `JsonVariant` (issue #415) +* Fixed errors with Variable Length Arrays (issue #416) +* Fixed error when both `ARDUINOJSON_ENABLE_STD_STREAM` and `ARDUINOJSON_ENABLE_ARDUINO_STREAM` are set to `1` +* Fixed error "Stream does not name a type" (issue #412) + +v5.8.0 +------ + +* Added operator `==` to compare `JsonVariant` and strings (issue #402) +* Added support for `Stream` (issue #300) +* Reduced memory consumption by not duplicating spaces and comments + +> ### BREAKING CHANGES :warning: +> +> `JsonBuffer::parseObject()` and `JsonBuffer::parseArray()` have been pulled down to the derived classes `DynamicJsonBuffer` and `StaticJsonBufferBase`. +> +> This means that if you have code like: +> +> ```c++ +> void myFunction(JsonBuffer& jsonBuffer); +> ``` +> +> you need to replace it with one of the following: +> +> ```c++ +> void myFunction(DynamicJsonBuffer& jsonBuffer); +> void myFunction(StaticJsonBufferBase& jsonBuffer); +> template void myFunction(TJsonBuffer& jsonBuffer); +> ``` + +v5.7.3 +------ + +* Added an `printTo(char[N])` and `prettyPrintTo(char[N])` (issue #292) +* Added ability to set a nested value like this: `root["A"]["B"] = "C"` (issue #352) +* Renamed `*.ipp` to `*Impl.hpp` because they were ignored by Arduino IDE (issue #396) + +v5.7.2 +------ + +* Made PROGMEM available on more platforms (issue #381) +* Fixed PROGMEM causing an exception on ESP8266 (issue #383) + +v5.7.1 +------ + +* Added support for PROGMEM (issue #76) +* Fixed compilation error when index is not an `int` (issue #381) + +v5.7.0 +------ + +* Templatized all functions using `String` or `std::string` +* Removed `ArduinoJson::String` +* Removed `JsonVariant::defaultValue()` +* Removed non-template `JsonObject::get()` and `JsonArray.get()` +* Fixed support for `StringSumHelper` (issue #184) +* Replaced `ARDUINOJSON_USE_ARDUINO_STRING` by `ARDUINOJSON_ENABLE_STD_STRING` and `ARDUINOJSON_ENABLE_ARDUINO_STRING` (issue #378) +* Added example `StringExample.ino` to show where `String` can be used +* Increased default nesting limit to 50 when compiled for a computer (issue #349) + +> ### BREAKING CHANGES :warning: +> +> The non-template functions `JsonObject::get()` and `JsonArray.get()` have been removed. This means that you need to explicitely tell the type you expect in return. +> +> Old code: +> +> ```c++ +> #define ARDUINOJSON_USE_ARDUINO_STRING 0 +> JsonVariant value1 = myObject.get("myKey"); +> JsonVariant value2 = myArray.get(0); +> ``` +> +> New code: +> +> ```c++ +> #define ARDUINOJSON_ENABLE_ARDUINO_STRING 0 +> #define ARDUINOJSON_ENABLE_STD_STRING 1 +> JsonVariant value1 = myObject.get("myKey"); +> JsonVariant value2 = myArray.get(0); +> ``` + +v5.6.7 +------ + +* Fixed `array[idx].as()` and `object[key].as()` +* Fixed return value of `JsonObject::set()` (issue #350) +* Fixed undefined behavior in `Prettyfier` and `Print` (issue #354) +* Fixed parser that incorrectly rejected floats containing a `+` (issue #349) + +v5.6.6 +------ + +* Fixed `-Wparentheses` warning introduced in v5.6.5 (PR #335 by @nuket) +* Added `.mbedignore` for ARM mbdeb (PR #334 by @nuket) +* Fixed `JsonVariant::success()` which didn't propagate `JsonArray::success()` nor `JsonObject::success()` (issue #342). + +v5.6.5 +------ + +* `as()` now returns `true` when input is `null` (issue #330) + +v5.6.4 +------ + +* Fixed error in float serialization (issue #324) + +v5.6.3 +------ + +* Improved speed of float serialization (about twice faster) +* Added `as()` as a synonym for `as()`... (issue #291) +* Fixed `call of overloaded isinf(double&) is ambiguous` (issue #284) + +v5.6.2 +------ + +* Fixed build when another lib does `#undef isnan` (issue #284) + +v5.6.1 +------ + +* Added missing `#pragma once` (issue #310) + +v5.6.0 +------ + +* ArduinoJson is now a header-only library (issue #199) + +v5.5.1 +------ + +* Fixed compilation error with Intel Galileo (issue #299) + +v5.5.0 +------ + +* Added `JsonVariant::success()` (issue #279) +* Renamed `JsonVariant::invalid()` to `JsonVariant::defaultValue()` + +v5.4.0 +------ + +* Changed `::String` to `ArduinoJson::String` (issue #275) +* Changed `::Print` to `ArduinoJson::Print` too + +v5.3.0 +------ + +* Added custom implementation of `ftoa` (issues #266, #267, #269 and #270) +* Added `JsonVariant JsonBuffer::parse()` (issue #265) +* Fixed `unsigned long` printed as `signed long` (issue #170) + +v5.2.0 +------ + +* Added `JsonVariant::as()` as a synonym for `JsonVariant::as()` (issue #257) +* Added example `JsonHttpClient` (issue #256) +* Added `JsonArray::copyTo()` and `JsonArray::copyFrom()` (issue #254) +* Added `RawJson()` to insert pregenerated JSON portions (issue #259) + +v5.1.1 +------ + +* Removed `String` duplication when one replaces a value in a `JsonObject` (PR #232 by @ulion) + +v5.1.0 +------ + +* Added support of `long long` (issue #171) +* Moved all build settings to `ArduinoJson/Configuration.hpp` + +> ### BREAKING CHANGE :warning: +> +> If you defined `ARDUINOJSON_ENABLE_STD_STREAM`, you now need to define it to `1`. + +v5.0.8 +------ + +* Made the library compatible with [PlatformIO](http://platformio.org/) (issue #181) +* Fixed `JsonVariant::is()` that was incorrectly returning false (issue #214) + +v5.0.7 +------ + +* Made library easier to use from a CMake project: simply `add_subdirectory(ArduinoJson/src)` +* Changed `String` to be a `typedef` of `std::string` (issues #142 and #161) + +> ### BREAKING CHANGES :warning: +> +> - `JsonVariant(true).as()` now returns `"true"` instead of `"1"` +> - `JsonVariant(false).as()` now returns `"false"` instead of `"0"` + +v5.0.6 +------ + +* Added parameter to `DynamicJsonBuffer` constructor to set initial size (issue #152) +* Fixed warning about library category in Arduino 1.6.6 (issue #147) +* Examples: Added a loop to wait for serial port to be ready (issue #156) + +v5.0.5 +------ + +* Added overload `JsonObjectSuscript::set(value, decimals)` (issue #143) +* Use `float` instead of `double` to reduce the size of `JsonVariant` (issue #134) + +v5.0.4 +------ + +* Fixed ambiguous overload with `JsonArraySubscript` and `JsonObjectSubscript` (issue #122) + +v5.0.3 +------ + +* Fixed `printTo(String)` which wrote numbers instead of strings (issue #120) +* Fixed return type of `JsonArray::is()` and some others (issue #121) + +v5.0.2 +------ + +* Fixed segmentation fault in `parseObject(String)` and `parseArray(String)`, when the + `StaticJsonBuffer` is too small to hold a copy of the string +* Fixed Clang warning "register specifier is deprecated" (issue #102) +* Fixed GCC warning "declaration shadows a member" (issue #103) +* Fixed memory alignment, which made ESP8266 crash (issue #104) +* Fixed compilation on Visual Studio 2010 and 2012 (issue #107) + +v5.0.1 +------ + +* Fixed compilation with Arduino 1.0.6 (issue #99) + +v5.0.0 +------ + +* Added support of `String` class (issues #55, #56, #70, #77) +* Added `JsonBuffer::strdup()` to make a copy of a string (issues #10, #57) +* Implicitly call `strdup()` for `String` but not for `char*` (issues #84, #87) +* Added support of non standard JSON input (issue #44) +* Added support of comments in JSON input (issue #88) +* Added implicit cast between numerical types (issues #64, #69, #93) +* Added ability to read number values as string (issue #90) +* Redesigned `JsonVariant` to leverage converting constructors instead of assignment operators (issue #66) +* Switched to new the library layout (requires Arduino 1.0.6 or above) + +> ### BREAKING CHANGES :warning: +> +> - `JsonObject::add()` was renamed to `set()` +> - `JsonArray::at()` and `JsonObject::at()` were renamed to `get()` +> - Number of digits of floating point value are now set with `double_with_n_digits()` + +**Personal note about the `String` class**: +Support of the `String` class has been added to the library because many people use it in their programs. +However, you should not see this as an invitation to use the `String` class. +The `String` class is **bad** because it uses dynamic memory allocation. +Compared to static allocation, it compiles to a bigger, slower program, and is less predictable. +You certainly don't want that in an embedded environment! + +v4.6 +---- + +* Fixed segmentation fault in `DynamicJsonBuffer` when memory allocation fails (issue #92) + +v4.5 +---- + +* Fixed buffer overflow when input contains a backslash followed by a terminator (issue #81) + +**Upgrading is recommended** since previous versions contain a potential security risk. + +Special thanks to [Giancarlo Canales Barreto](https://github.com/gcanalesb) for finding this nasty bug. + +v4.4 +---- + +* Added `JsonArray::measureLength()` and `JsonObject::measureLength()` (issue #75) + +v4.3 +---- + +* Added `JsonArray::removeAt()` to remove an element of an array (issue #58) +* Fixed stack-overflow in `DynamicJsonBuffer` when parsing huge JSON files (issue #65) +* Fixed wrong return value of `parseArray()` and `parseObject()` when allocation fails (issue #68) + +v4.2 +---- + +* Switched back to old library layout (issues #39, #43 and #45) +* Removed global new operator overload (issue #40, #45 and #46) +* Added an example with EthernetServer + +v4.1 +---- + +* Added DynamicJsonBuffer (issue #19) + +v4.0 +---- + +* Unified parser and generator API (issue #23) +* Updated library layout, now requires Arduino 1.0.6 or newer + +> ### BREAKING CHANGES :warning: +> +> API changed significantly since v3, see [Migrating code to the new API](https://arduinojson.org/doc/migration/). + diff --git a/software/firmware/libraries/ArduinoJson/CMakeLists.txt b/software/firmware/archive/libraries/ArduinoJson/CMakeLists.txt similarity index 100% rename from software/firmware/libraries/ArduinoJson/CMakeLists.txt rename to software/firmware/archive/libraries/ArduinoJson/CMakeLists.txt diff --git a/software/firmware/libraries/ArduinoJson/CONTRIBUTING.md b/software/firmware/archive/libraries/ArduinoJson/CONTRIBUTING.md similarity index 100% rename from software/firmware/libraries/ArduinoJson/CONTRIBUTING.md rename to software/firmware/archive/libraries/ArduinoJson/CONTRIBUTING.md diff --git a/software/firmware/libraries/ArduinoJson/LICENSE.md b/software/firmware/archive/libraries/ArduinoJson/LICENSE.md similarity index 99% rename from software/firmware/libraries/ArduinoJson/LICENSE.md rename to software/firmware/archive/libraries/ArduinoJson/LICENSE.md index b5c35fc..3805c38 100644 --- a/software/firmware/libraries/ArduinoJson/LICENSE.md +++ b/software/firmware/archive/libraries/ArduinoJson/LICENSE.md @@ -1,10 +1,10 @@ -The MIT License (MIT) ---------------------- - -Copyright © 2014-2019 Benoit BLANCHON - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +The MIT License (MIT) +--------------------- + +Copyright © 2014-2019 Benoit BLANCHON + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/software/firmware/libraries/ArduinoJson/README.md b/software/firmware/archive/libraries/ArduinoJson/README.md similarity index 98% rename from software/firmware/libraries/ArduinoJson/README.md rename to software/firmware/archive/libraries/ArduinoJson/README.md index b17c44c..df66fe9 100644 --- a/software/firmware/libraries/ArduinoJson/README.md +++ b/software/firmware/archive/libraries/ArduinoJson/README.md @@ -1,114 +1,114 @@ -![ArduinoJson](banner.svg) - ---- - -[![arduino-library-badge](https://www.ardu-badge.com/badge/ArduinoJson.svg?version=5.13.5)](https://www.ardu-badge.com/ArduinoJson/5.13.5) -[![Build Status](https://ci.appveyor.com/api/projects/status/m7s53wav1l0abssg/branch/master?svg=true)](https://ci.appveyor.com/project/bblanchon/arduinojson/branch/master) -[![Build Status](https://travis-ci.org/bblanchon/ArduinoJson.svg?branch=master)](https://travis-ci.org/bblanchon/ArduinoJson) -[![Coverage Status](https://img.shields.io/coveralls/bblanchon/ArduinoJson.svg)](https://coveralls.io/r/bblanchon/ArduinoJson?branch=master) -[![Star this project](http://githubbadges.com/star.svg?user=bblanchon&repo=ArduinoJson&style=flat&color=fff&background=007ec6)](https://github.com/bblanchon/ArduinoJson) - -ArduinoJson is a C++ JSON library for Arduino and IoT (Internet Of Things). - -## Features - -* JSON decoding (comments are supported) -* JSON encoding (with optional indentation) -* Elegant API, easy to use -* Fixed memory allocation (zero malloc) -* No data duplication (zero copy) -* Portable (written in C++98, can be used in any C++ project) -* Self-contained (no external dependency) -* Small footprint -* Input and output streams -* [100% code coverage](https://coveralls.io/github/bblanchon/ArduinoJson) -* [Header-only library](https://en.wikipedia.org/wiki/Header-only) -* [MIT License](https://en.wikipedia.org/wiki/MIT_License) -* [Comprehensive documentation](https://arduinojson.org?utm_source=github&utm_medium=readme) - -## Compatibility - -ArduinoJson works on the following hardware: - -* Arduino boards: [Uno](https://www.arduino.cc/en/Main/ArduinoBoardUno), [Due](https://www.arduino.cc/en/Main/ArduinoBoardDue), [Mini](https://www.arduino.cc/en/Main/ArduinoBoardMini), [Micro](https://www.arduino.cc/en/Main/ArduinoBoardMicro), [Yun](https://www.arduino.cc/en/Main/ArduinoBoardYun)... -* Espressif chips: [ESP8266](https://en.wikipedia.org/wiki/ESP8266), [ESP32](https://en.wikipedia.org/wiki/ESP32) -* WeMos boards: [D1](https://wiki.wemos.cc/products:d1:d1), [D1 mini](https://wiki.wemos.cc/products:d1:d1_mini), ... -* RedBearLab boards: [BLE Nano](http://redbearlab.com/blenano/), [BLE Mini](http://redbearlab.com/blemini/), [WiFi Micro](https://redbear.cc/product/wifi/wifi-micro.html), [LOLIN32](https://wiki.wemos.cc/products:lolin32:lolin32)... -* [Teensy](https://www.pjrc.com/teensy/) boards -* Intel boards: Edison, Galileo... -* Particle boards: [Photon](https://www.particle.io/products/hardware/photon-wifi-dev-kit), [Electron](https://www.particle.io/products/hardware/electron-cellular-dev-kit)... -* Texas Instruments boards: [MSP430](http://www.ti.com/microcontrollers/msp430-ultra-low-power-mcus/overview/overview.html)... - -ArduinoJson compiles with zero warning on the following compilers, IDEs, and platforms: - -* [Arduino IDE](https://www.arduino.cc/en/Main/Software) -* [PlatformIO](http://platformio.org/) -* [Energia](http://energia.nu/) -* [Visual Micro](http://www.visualmicro.com/) -* [Atmel Studio](http://www.atmel.com/microsite/atmel-studio/) -* [IAR Embedded Workbench](https://www.iar.com/iar-embedded-workbench/) -* [Atollic TrueSTUDIO](https://atollic.com/truestudio/) -* [Keil uVision](http://www.keil.com/) -* [MPLAB X IDE](http://www.microchip.com/mplab/mplab-x-ide) -* [GCC](https://gcc.gnu.org/) -* [Clang](https://clang.llvm.org/) -* [Visual Studio](https://www.visualstudio.com/) - -## Quickstart - -### Deserialization - -Here is a program that parses a JSON document with ArduinoJson. - -```c++ -char json[] = "{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}"; - -StaticJsonBuffer<200> jsonBuffer; - -JsonObject& root = jsonBuffer.parseObject(json); - -const char* sensor = root["sensor"]; -long time = root["time"]; -double latitude = root["data"][0]; -double longitude = root["data"][1]; -``` - -See the [tutorial on arduinojson.org](https://arduinojson.org/doc/decoding/?utm_source=github&utm_medium=readme) - -### Serialization - -Here is a program that generates a JSON document with ArduinoJson: - -```c++ -StaticJsonBuffer<200> jsonBuffer; - -JsonObject& root = jsonBuffer.createObject(); -root["sensor"] = "gps"; -root["time"] = 1351824120; - -JsonArray& data = root.createNestedArray("data"); -data.add(48.756080); -data.add(2.302038); - -root.printTo(Serial); -// This prints: -// {"sensor":"gps","time":1351824120,"data":[48.756080,2.302038]} -``` - -See the [tutorial on arduinojson.org](https://arduinojson.org/doc/encoding/?utm_source=github&utm_medium=readme) - -## Documentation - -The documentation is available on [arduinojson.org](https://arduinojson.org/?utm_source=github&utm_medium=readme), here are some shortcuts: - -* The [Examples](https://arduinojson.org/example/?utm_source=github&utm_medium=readme) show how to use the library in various situations. -* The [API Reference](https://arduinojson.org/api/?utm_source=github&utm_medium=readme) contains the description of each class and function. -* The [FAQ](https://arduinojson.org/faq/?utm_source=github&utm_medium=readme) has the answer to virtually every question. -* The [ArduinoJson Assistant](https://arduinojson.org/assistant/?utm_source=github&utm_medium=readme) writes programs for you! - ---- - -Do you like this library? Please [star this project on GitHub](https://github.com/bblanchon/ArduinoJson/stargazers)! - -What? You don't like it but you *love* it? -We don't take donations anymore, but [we sell a book](https://arduinojson.org/book/?utm_source=github&utm_medium=readme), so you can help and learn at the same time! +![ArduinoJson](banner.svg) + +--- + +[![arduino-library-badge](https://www.ardu-badge.com/badge/ArduinoJson.svg?version=5.13.5)](https://www.ardu-badge.com/ArduinoJson/5.13.5) +[![Build Status](https://ci.appveyor.com/api/projects/status/m7s53wav1l0abssg/branch/master?svg=true)](https://ci.appveyor.com/project/bblanchon/arduinojson/branch/master) +[![Build Status](https://travis-ci.org/bblanchon/ArduinoJson.svg?branch=master)](https://travis-ci.org/bblanchon/ArduinoJson) +[![Coverage Status](https://img.shields.io/coveralls/bblanchon/ArduinoJson.svg)](https://coveralls.io/r/bblanchon/ArduinoJson?branch=master) +[![Star this project](http://githubbadges.com/star.svg?user=bblanchon&repo=ArduinoJson&style=flat&color=fff&background=007ec6)](https://github.com/bblanchon/ArduinoJson) + +ArduinoJson is a C++ JSON library for Arduino and IoT (Internet Of Things). + +## Features + +* JSON decoding (comments are supported) +* JSON encoding (with optional indentation) +* Elegant API, easy to use +* Fixed memory allocation (zero malloc) +* No data duplication (zero copy) +* Portable (written in C++98, can be used in any C++ project) +* Self-contained (no external dependency) +* Small footprint +* Input and output streams +* [100% code coverage](https://coveralls.io/github/bblanchon/ArduinoJson) +* [Header-only library](https://en.wikipedia.org/wiki/Header-only) +* [MIT License](https://en.wikipedia.org/wiki/MIT_License) +* [Comprehensive documentation](https://arduinojson.org?utm_source=github&utm_medium=readme) + +## Compatibility + +ArduinoJson works on the following hardware: + +* Arduino boards: [Uno](https://www.arduino.cc/en/Main/ArduinoBoardUno), [Due](https://www.arduino.cc/en/Main/ArduinoBoardDue), [Mini](https://www.arduino.cc/en/Main/ArduinoBoardMini), [Micro](https://www.arduino.cc/en/Main/ArduinoBoardMicro), [Yun](https://www.arduino.cc/en/Main/ArduinoBoardYun)... +* Espressif chips: [ESP8266](https://en.wikipedia.org/wiki/ESP8266), [ESP32](https://en.wikipedia.org/wiki/ESP32) +* WeMos boards: [D1](https://wiki.wemos.cc/products:d1:d1), [D1 mini](https://wiki.wemos.cc/products:d1:d1_mini), ... +* RedBearLab boards: [BLE Nano](http://redbearlab.com/blenano/), [BLE Mini](http://redbearlab.com/blemini/), [WiFi Micro](https://redbear.cc/product/wifi/wifi-micro.html), [LOLIN32](https://wiki.wemos.cc/products:lolin32:lolin32)... +* [Teensy](https://www.pjrc.com/teensy/) boards +* Intel boards: Edison, Galileo... +* Particle boards: [Photon](https://www.particle.io/products/hardware/photon-wifi-dev-kit), [Electron](https://www.particle.io/products/hardware/electron-cellular-dev-kit)... +* Texas Instruments boards: [MSP430](http://www.ti.com/microcontrollers/msp430-ultra-low-power-mcus/overview/overview.html)... + +ArduinoJson compiles with zero warning on the following compilers, IDEs, and platforms: + +* [Arduino IDE](https://www.arduino.cc/en/Main/Software) +* [PlatformIO](http://platformio.org/) +* [Energia](http://energia.nu/) +* [Visual Micro](http://www.visualmicro.com/) +* [Atmel Studio](http://www.atmel.com/microsite/atmel-studio/) +* [IAR Embedded Workbench](https://www.iar.com/iar-embedded-workbench/) +* [Atollic TrueSTUDIO](https://atollic.com/truestudio/) +* [Keil uVision](http://www.keil.com/) +* [MPLAB X IDE](http://www.microchip.com/mplab/mplab-x-ide) +* [GCC](https://gcc.gnu.org/) +* [Clang](https://clang.llvm.org/) +* [Visual Studio](https://www.visualstudio.com/) + +## Quickstart + +### Deserialization + +Here is a program that parses a JSON document with ArduinoJson. + +```c++ +char json[] = "{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}"; + +StaticJsonBuffer<200> jsonBuffer; + +JsonObject& root = jsonBuffer.parseObject(json); + +const char* sensor = root["sensor"]; +long time = root["time"]; +double latitude = root["data"][0]; +double longitude = root["data"][1]; +``` + +See the [tutorial on arduinojson.org](https://arduinojson.org/doc/decoding/?utm_source=github&utm_medium=readme) + +### Serialization + +Here is a program that generates a JSON document with ArduinoJson: + +```c++ +StaticJsonBuffer<200> jsonBuffer; + +JsonObject& root = jsonBuffer.createObject(); +root["sensor"] = "gps"; +root["time"] = 1351824120; + +JsonArray& data = root.createNestedArray("data"); +data.add(48.756080); +data.add(2.302038); + +root.printTo(Serial); +// This prints: +// {"sensor":"gps","time":1351824120,"data":[48.756080,2.302038]} +``` + +See the [tutorial on arduinojson.org](https://arduinojson.org/doc/encoding/?utm_source=github&utm_medium=readme) + +## Documentation + +The documentation is available on [arduinojson.org](https://arduinojson.org/?utm_source=github&utm_medium=readme), here are some shortcuts: + +* The [Examples](https://arduinojson.org/example/?utm_source=github&utm_medium=readme) show how to use the library in various situations. +* The [API Reference](https://arduinojson.org/api/?utm_source=github&utm_medium=readme) contains the description of each class and function. +* The [FAQ](https://arduinojson.org/faq/?utm_source=github&utm_medium=readme) has the answer to virtually every question. +* The [ArduinoJson Assistant](https://arduinojson.org/assistant/?utm_source=github&utm_medium=readme) writes programs for you! + +--- + +Do you like this library? Please [star this project on GitHub](https://github.com/bblanchon/ArduinoJson/stargazers)! + +What? You don't like it but you *love* it? +We don't take donations anymore, but [we sell a book](https://arduinojson.org/book/?utm_source=github&utm_medium=readme), so you can help and learn at the same time! diff --git a/software/firmware/libraries/ArduinoJson/SUPPORT.md b/software/firmware/archive/libraries/ArduinoJson/SUPPORT.md similarity index 100% rename from software/firmware/libraries/ArduinoJson/SUPPORT.md rename to software/firmware/archive/libraries/ArduinoJson/SUPPORT.md diff --git a/software/firmware/libraries/ArduinoJson/appveyor.yml b/software/firmware/archive/libraries/ArduinoJson/appveyor.yml similarity index 100% rename from software/firmware/libraries/ArduinoJson/appveyor.yml rename to software/firmware/archive/libraries/ArduinoJson/appveyor.yml diff --git a/software/firmware/libraries/ArduinoJson/banner.svg b/software/firmware/archive/libraries/ArduinoJson/banner.svg similarity index 100% rename from software/firmware/libraries/ArduinoJson/banner.svg rename to software/firmware/archive/libraries/ArduinoJson/banner.svg diff --git a/software/firmware/libraries/ArduinoJson/examples/JsonConfigFile/JsonConfigFile.ino b/software/firmware/archive/libraries/ArduinoJson/examples/JsonConfigFile/JsonConfigFile.ino similarity index 100% rename from software/firmware/libraries/ArduinoJson/examples/JsonConfigFile/JsonConfigFile.ino rename to software/firmware/archive/libraries/ArduinoJson/examples/JsonConfigFile/JsonConfigFile.ino diff --git a/software/firmware/libraries/ArduinoJson/examples/JsonGeneratorExample/JsonGeneratorExample.ino b/software/firmware/archive/libraries/ArduinoJson/examples/JsonGeneratorExample/JsonGeneratorExample.ino similarity index 96% rename from software/firmware/libraries/ArduinoJson/examples/JsonGeneratorExample/JsonGeneratorExample.ino rename to software/firmware/archive/libraries/ArduinoJson/examples/JsonGeneratorExample/JsonGeneratorExample.ino index 7a35083..f7737da 100644 --- a/software/firmware/libraries/ArduinoJson/examples/JsonGeneratorExample/JsonGeneratorExample.ino +++ b/software/firmware/archive/libraries/ArduinoJson/examples/JsonGeneratorExample/JsonGeneratorExample.ino @@ -1,81 +1,81 @@ -// ArduinoJson - arduinojson.org -// Copyright Benoit Blanchon 2014-2019 -// MIT License -// -// This example shows how to generate a JSON document with ArduinoJson. - -#include - -void setup() { - // Initialize Serial port - Serial.begin(9600); - while (!Serial) continue; - - // Memory pool for JSON object tree. - // - // Inside the brackets, 200 is the size of the pool in bytes. - // Don't forget to change this value to match your JSON document. - // Use arduinojson.org/assistant to compute the capacity. - StaticJsonBuffer<200> jsonBuffer; - - // StaticJsonBuffer allocates memory on the stack, it can be - // replaced by DynamicJsonBuffer which allocates in the heap. - // - // DynamicJsonBuffer jsonBuffer(200); - - // Create the root of the object tree. - // - // It's a reference to the JsonObject, the actual bytes are inside the - // JsonBuffer with all the other nodes of the object tree. - // Memory is freed when jsonBuffer goes out of scope. - JsonObject& root = jsonBuffer.createObject(); - - // Add values in the object - // - // Most of the time, you can rely on the implicit casts. - // In other case, you can do root.set("time", 1351824120); - root["sensor"] = "gps"; - root["time"] = 1351824120; - - // Add a nested array. - // - // It's also possible to create the array separately and add it to the - // JsonObject but it's less efficient. - JsonArray& data = root.createNestedArray("data"); - data.add(48.756080); - data.add(2.302038); - - root.printTo(Serial); - // This prints: - // {"sensor":"gps","time":1351824120,"data":[48.756080,2.302038]} - - Serial.println(); - - root.prettyPrintTo(Serial); - // This prints: - // { - // "sensor": "gps", - // "time": 1351824120, - // "data": [ - // 48.756080, - // 2.302038 - // ] - // } -} - -void loop() { - // not used in this example -} - -// See also -// -------- -// -// https://arduinojson.org/ contains the documentation for all the functions -// used above. It also includes an FAQ that will help you solve any -// serialization problem. -// -// The book "Mastering ArduinoJson" contains a tutorial on serialization. -// It begins with a simple example, like the one above, and then adds more -// features like serializing directly to a file or an HTTP request. -// Learn more at https://arduinojson.org/book/ -// Use the coupon code TWENTY for a 20% discount ❤❤❤❤❤ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2019 +// MIT License +// +// This example shows how to generate a JSON document with ArduinoJson. + +#include + +void setup() { + // Initialize Serial port + Serial.begin(9600); + while (!Serial) continue; + + // Memory pool for JSON object tree. + // + // Inside the brackets, 200 is the size of the pool in bytes. + // Don't forget to change this value to match your JSON document. + // Use arduinojson.org/assistant to compute the capacity. + StaticJsonBuffer<200> jsonBuffer; + + // StaticJsonBuffer allocates memory on the stack, it can be + // replaced by DynamicJsonBuffer which allocates in the heap. + // + // DynamicJsonBuffer jsonBuffer(200); + + // Create the root of the object tree. + // + // It's a reference to the JsonObject, the actual bytes are inside the + // JsonBuffer with all the other nodes of the object tree. + // Memory is freed when jsonBuffer goes out of scope. + JsonObject& root = jsonBuffer.createObject(); + + // Add values in the object + // + // Most of the time, you can rely on the implicit casts. + // In other case, you can do root.set("time", 1351824120); + root["sensor"] = "gps"; + root["time"] = 1351824120; + + // Add a nested array. + // + // It's also possible to create the array separately and add it to the + // JsonObject but it's less efficient. + JsonArray& data = root.createNestedArray("data"); + data.add(48.756080); + data.add(2.302038); + + root.printTo(Serial); + // This prints: + // {"sensor":"gps","time":1351824120,"data":[48.756080,2.302038]} + + Serial.println(); + + root.prettyPrintTo(Serial); + // This prints: + // { + // "sensor": "gps", + // "time": 1351824120, + // "data": [ + // 48.756080, + // 2.302038 + // ] + // } +} + +void loop() { + // not used in this example +} + +// See also +// -------- +// +// https://arduinojson.org/ contains the documentation for all the functions +// used above. It also includes an FAQ that will help you solve any +// serialization problem. +// +// The book "Mastering ArduinoJson" contains a tutorial on serialization. +// It begins with a simple example, like the one above, and then adds more +// features like serializing directly to a file or an HTTP request. +// Learn more at https://arduinojson.org/book/ +// Use the coupon code TWENTY for a 20% discount ❤❤❤❤❤ diff --git a/software/firmware/libraries/ArduinoJson/examples/JsonHttpClient/JsonHttpClient.ino b/software/firmware/archive/libraries/ArduinoJson/examples/JsonHttpClient/JsonHttpClient.ino similarity index 100% rename from software/firmware/libraries/ArduinoJson/examples/JsonHttpClient/JsonHttpClient.ino rename to software/firmware/archive/libraries/ArduinoJson/examples/JsonHttpClient/JsonHttpClient.ino diff --git a/software/firmware/libraries/ArduinoJson/examples/JsonParserExample/JsonParserExample.ino b/software/firmware/archive/libraries/ArduinoJson/examples/JsonParserExample/JsonParserExample.ino similarity index 96% rename from software/firmware/libraries/ArduinoJson/examples/JsonParserExample/JsonParserExample.ino rename to software/firmware/archive/libraries/ArduinoJson/examples/JsonParserExample/JsonParserExample.ino index c2e199e..2b10de2 100644 --- a/software/firmware/libraries/ArduinoJson/examples/JsonParserExample/JsonParserExample.ino +++ b/software/firmware/archive/libraries/ArduinoJson/examples/JsonParserExample/JsonParserExample.ino @@ -1,78 +1,78 @@ -// ArduinoJson - arduinojson.org -// Copyright Benoit Blanchon 2014-2019 -// MIT License -// -// This example shows how to deserialize a JSON document with ArduinoJson. - -#include - -void setup() { - // Initialize serial port - Serial.begin(9600); - while (!Serial) continue; - - // Memory pool for JSON object tree. - // - // Inside the brackets, 200 is the size of the pool in bytes. - // Don't forget to change this value to match your JSON document. - // Use arduinojson.org/assistant to compute the capacity. - StaticJsonBuffer<200> jsonBuffer; - - // StaticJsonBuffer allocates memory on the stack, it can be - // replaced by DynamicJsonBuffer which allocates in the heap. - // - // DynamicJsonBuffer jsonBuffer(200); - - // JSON input string. - // - // It's better to use a char[] as shown here. - // If you use a const char* or a String, ArduinoJson will - // have to make a copy of the input in the JsonBuffer. - char json[] = - "{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}"; - - // Root of the object tree. - // - // It's a reference to the JsonObject, the actual bytes are inside the - // JsonBuffer with all the other nodes of the object tree. - // Memory is freed when jsonBuffer goes out of scope. - JsonObject& root = jsonBuffer.parseObject(json); - - // Test if parsing succeeds. - if (!root.success()) { - Serial.println("parseObject() failed"); - return; - } - - // Fetch values. - // - // Most of the time, you can rely on the implicit casts. - // In other case, you can do root["time"].as(); - const char* sensor = root["sensor"]; - long time = root["time"]; - double latitude = root["data"][0]; - double longitude = root["data"][1]; - - // Print values. - Serial.println(sensor); - Serial.println(time); - Serial.println(latitude, 6); - Serial.println(longitude, 6); -} - -void loop() { - // not used in this example -} - -// See also -// -------- -// -// https://arduinojson.org/ contains the documentation for all the functions -// used above. It also includes an FAQ that will help you solve any -// deserialization problem. -// -// The book "Mastering ArduinoJson" contains a tutorial on deserialization. -// It begins with a simple example, like the one above, and then adds more -// features like deserializing directly from a file or an HTTP request. -// Learn more at https://arduinojson.org/book/ -// Use the coupon code TWENTY for a 20% discount ❤❤❤❤❤ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2019 +// MIT License +// +// This example shows how to deserialize a JSON document with ArduinoJson. + +#include + +void setup() { + // Initialize serial port + Serial.begin(9600); + while (!Serial) continue; + + // Memory pool for JSON object tree. + // + // Inside the brackets, 200 is the size of the pool in bytes. + // Don't forget to change this value to match your JSON document. + // Use arduinojson.org/assistant to compute the capacity. + StaticJsonBuffer<200> jsonBuffer; + + // StaticJsonBuffer allocates memory on the stack, it can be + // replaced by DynamicJsonBuffer which allocates in the heap. + // + // DynamicJsonBuffer jsonBuffer(200); + + // JSON input string. + // + // It's better to use a char[] as shown here. + // If you use a const char* or a String, ArduinoJson will + // have to make a copy of the input in the JsonBuffer. + char json[] = + "{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}"; + + // Root of the object tree. + // + // It's a reference to the JsonObject, the actual bytes are inside the + // JsonBuffer with all the other nodes of the object tree. + // Memory is freed when jsonBuffer goes out of scope. + JsonObject& root = jsonBuffer.parseObject(json); + + // Test if parsing succeeds. + if (!root.success()) { + Serial.println("parseObject() failed"); + return; + } + + // Fetch values. + // + // Most of the time, you can rely on the implicit casts. + // In other case, you can do root["time"].as(); + const char* sensor = root["sensor"]; + long time = root["time"]; + double latitude = root["data"][0]; + double longitude = root["data"][1]; + + // Print values. + Serial.println(sensor); + Serial.println(time); + Serial.println(latitude, 6); + Serial.println(longitude, 6); +} + +void loop() { + // not used in this example +} + +// See also +// -------- +// +// https://arduinojson.org/ contains the documentation for all the functions +// used above. It also includes an FAQ that will help you solve any +// deserialization problem. +// +// The book "Mastering ArduinoJson" contains a tutorial on deserialization. +// It begins with a simple example, like the one above, and then adds more +// features like deserializing directly from a file or an HTTP request. +// Learn more at https://arduinojson.org/book/ +// Use the coupon code TWENTY for a 20% discount ❤❤❤❤❤ diff --git a/software/firmware/libraries/ArduinoJson/examples/JsonServer/JsonServer.ino b/software/firmware/archive/libraries/ArduinoJson/examples/JsonServer/JsonServer.ino similarity index 100% rename from software/firmware/libraries/ArduinoJson/examples/JsonServer/JsonServer.ino rename to software/firmware/archive/libraries/ArduinoJson/examples/JsonServer/JsonServer.ino diff --git a/software/firmware/libraries/ArduinoJson/examples/JsonUdpBeacon/JsonUdpBeacon.ino b/software/firmware/archive/libraries/ArduinoJson/examples/JsonUdpBeacon/JsonUdpBeacon.ino similarity index 100% rename from software/firmware/libraries/ArduinoJson/examples/JsonUdpBeacon/JsonUdpBeacon.ino rename to software/firmware/archive/libraries/ArduinoJson/examples/JsonUdpBeacon/JsonUdpBeacon.ino diff --git a/software/firmware/libraries/ArduinoJson/examples/ProgmemExample/ProgmemExample.ino b/software/firmware/archive/libraries/ArduinoJson/examples/ProgmemExample/ProgmemExample.ino similarity index 100% rename from software/firmware/libraries/ArduinoJson/examples/ProgmemExample/ProgmemExample.ino rename to software/firmware/archive/libraries/ArduinoJson/examples/ProgmemExample/ProgmemExample.ino diff --git a/software/firmware/libraries/ArduinoJson/examples/StringExample/StringExample.ino b/software/firmware/archive/libraries/ArduinoJson/examples/StringExample/StringExample.ino similarity index 100% rename from software/firmware/libraries/ArduinoJson/examples/StringExample/StringExample.ino rename to software/firmware/archive/libraries/ArduinoJson/examples/StringExample/StringExample.ino diff --git a/software/firmware/libraries/ArduinoJson/fuzzing/Makefile b/software/firmware/archive/libraries/ArduinoJson/fuzzing/Makefile similarity index 100% rename from software/firmware/libraries/ArduinoJson/fuzzing/Makefile rename to software/firmware/archive/libraries/ArduinoJson/fuzzing/Makefile diff --git a/software/firmware/libraries/ArduinoJson/fuzzing/fuzzer.cpp b/software/firmware/archive/libraries/ArduinoJson/fuzzing/fuzzer.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/fuzzing/fuzzer.cpp rename to software/firmware/archive/libraries/ArduinoJson/fuzzing/fuzzer.cpp diff --git a/software/firmware/libraries/ArduinoJson/fuzzing/my_corpus/.gitignore b/software/firmware/archive/libraries/ArduinoJson/fuzzing/my_corpus/.gitignore similarity index 100% rename from software/firmware/libraries/ArduinoJson/fuzzing/my_corpus/.gitignore rename to software/firmware/archive/libraries/ArduinoJson/fuzzing/my_corpus/.gitignore diff --git a/software/firmware/libraries/ArduinoJson/fuzzing/seed_corpus/Comments.json b/software/firmware/archive/libraries/ArduinoJson/fuzzing/seed_corpus/Comments.json similarity index 100% rename from software/firmware/libraries/ArduinoJson/fuzzing/seed_corpus/Comments.json rename to software/firmware/archive/libraries/ArduinoJson/fuzzing/seed_corpus/Comments.json diff --git a/software/firmware/libraries/ArduinoJson/fuzzing/seed_corpus/EmptyArray.json b/software/firmware/archive/libraries/ArduinoJson/fuzzing/seed_corpus/EmptyArray.json similarity index 100% rename from software/firmware/libraries/ArduinoJson/fuzzing/seed_corpus/EmptyArray.json rename to software/firmware/archive/libraries/ArduinoJson/fuzzing/seed_corpus/EmptyArray.json diff --git a/software/firmware/libraries/ArduinoJson/fuzzing/seed_corpus/EmptyObject.json b/software/firmware/archive/libraries/ArduinoJson/fuzzing/seed_corpus/EmptyObject.json similarity index 100% rename from software/firmware/libraries/ArduinoJson/fuzzing/seed_corpus/EmptyObject.json rename to software/firmware/archive/libraries/ArduinoJson/fuzzing/seed_corpus/EmptyObject.json diff --git a/software/firmware/libraries/ArduinoJson/fuzzing/seed_corpus/ExcessiveNesting.json b/software/firmware/archive/libraries/ArduinoJson/fuzzing/seed_corpus/ExcessiveNesting.json similarity index 100% rename from software/firmware/libraries/ArduinoJson/fuzzing/seed_corpus/ExcessiveNesting.json rename to software/firmware/archive/libraries/ArduinoJson/fuzzing/seed_corpus/ExcessiveNesting.json diff --git a/software/firmware/libraries/ArduinoJson/fuzzing/seed_corpus/Numbers.json b/software/firmware/archive/libraries/ArduinoJson/fuzzing/seed_corpus/Numbers.json similarity index 100% rename from software/firmware/libraries/ArduinoJson/fuzzing/seed_corpus/Numbers.json rename to software/firmware/archive/libraries/ArduinoJson/fuzzing/seed_corpus/Numbers.json diff --git a/software/firmware/libraries/ArduinoJson/fuzzing/seed_corpus/OpenWeatherMap.json b/software/firmware/archive/libraries/ArduinoJson/fuzzing/seed_corpus/OpenWeatherMap.json similarity index 100% rename from software/firmware/libraries/ArduinoJson/fuzzing/seed_corpus/OpenWeatherMap.json rename to software/firmware/archive/libraries/ArduinoJson/fuzzing/seed_corpus/OpenWeatherMap.json diff --git a/software/firmware/libraries/ArduinoJson/fuzzing/seed_corpus/Strings.json b/software/firmware/archive/libraries/ArduinoJson/fuzzing/seed_corpus/Strings.json similarity index 100% rename from software/firmware/libraries/ArduinoJson/fuzzing/seed_corpus/Strings.json rename to software/firmware/archive/libraries/ArduinoJson/fuzzing/seed_corpus/Strings.json diff --git a/software/firmware/libraries/ArduinoJson/fuzzing/seed_corpus/WeatherUnderground.json b/software/firmware/archive/libraries/ArduinoJson/fuzzing/seed_corpus/WeatherUnderground.json similarity index 100% rename from software/firmware/libraries/ArduinoJson/fuzzing/seed_corpus/WeatherUnderground.json rename to software/firmware/archive/libraries/ArduinoJson/fuzzing/seed_corpus/WeatherUnderground.json diff --git a/software/firmware/libraries/ArduinoJson/keywords.txt b/software/firmware/archive/libraries/ArduinoJson/keywords.txt similarity index 100% rename from software/firmware/libraries/ArduinoJson/keywords.txt rename to software/firmware/archive/libraries/ArduinoJson/keywords.txt diff --git a/software/firmware/libraries/ArduinoJson/library.json b/software/firmware/archive/libraries/ArduinoJson/library.json similarity index 100% rename from software/firmware/libraries/ArduinoJson/library.json rename to software/firmware/archive/libraries/ArduinoJson/library.json diff --git a/software/firmware/libraries/ArduinoJson/library.properties b/software/firmware/archive/libraries/ArduinoJson/library.properties similarity index 100% rename from software/firmware/libraries/ArduinoJson/library.properties rename to software/firmware/archive/libraries/ArduinoJson/library.properties diff --git a/software/firmware/libraries/ArduinoJson/scripts/build-arduino-package.sh b/software/firmware/archive/libraries/ArduinoJson/scripts/build-arduino-package.sh similarity index 100% rename from software/firmware/libraries/ArduinoJson/scripts/build-arduino-package.sh rename to software/firmware/archive/libraries/ArduinoJson/scripts/build-arduino-package.sh diff --git a/software/firmware/libraries/ArduinoJson/scripts/build-single-header.sh b/software/firmware/archive/libraries/ArduinoJson/scripts/build-single-header.sh similarity index 100% rename from software/firmware/libraries/ArduinoJson/scripts/build-single-header.sh rename to software/firmware/archive/libraries/ArduinoJson/scripts/build-single-header.sh diff --git a/software/firmware/libraries/ArduinoJson/scripts/create-build-envs.sh b/software/firmware/archive/libraries/ArduinoJson/scripts/create-build-envs.sh similarity index 100% rename from software/firmware/libraries/ArduinoJson/scripts/create-build-envs.sh rename to software/firmware/archive/libraries/ArduinoJson/scripts/create-build-envs.sh diff --git a/software/firmware/libraries/ArduinoJson/scripts/oss-fuzz/.gitignore b/software/firmware/archive/libraries/ArduinoJson/scripts/oss-fuzz/.gitignore similarity index 100% rename from software/firmware/libraries/ArduinoJson/scripts/oss-fuzz/.gitignore rename to software/firmware/archive/libraries/ArduinoJson/scripts/oss-fuzz/.gitignore diff --git a/software/firmware/libraries/ArduinoJson/scripts/oss-fuzz/Vagrantfile b/software/firmware/archive/libraries/ArduinoJson/scripts/oss-fuzz/Vagrantfile similarity index 100% rename from software/firmware/libraries/ArduinoJson/scripts/oss-fuzz/Vagrantfile rename to software/firmware/archive/libraries/ArduinoJson/scripts/oss-fuzz/Vagrantfile diff --git a/software/firmware/libraries/ArduinoJson/scripts/publish-particle-library.sh b/software/firmware/archive/libraries/ArduinoJson/scripts/publish-particle-library.sh similarity index 100% rename from software/firmware/libraries/ArduinoJson/scripts/publish-particle-library.sh rename to software/firmware/archive/libraries/ArduinoJson/scripts/publish-particle-library.sh diff --git a/software/firmware/libraries/ArduinoJson/scripts/travis/arduino.sh b/software/firmware/archive/libraries/ArduinoJson/scripts/travis/arduino.sh similarity index 100% rename from software/firmware/libraries/ArduinoJson/scripts/travis/arduino.sh rename to software/firmware/archive/libraries/ArduinoJson/scripts/travis/arduino.sh diff --git a/software/firmware/libraries/ArduinoJson/scripts/travis/cmake.sh b/software/firmware/archive/libraries/ArduinoJson/scripts/travis/cmake.sh similarity index 100% rename from software/firmware/libraries/ArduinoJson/scripts/travis/cmake.sh rename to software/firmware/archive/libraries/ArduinoJson/scripts/travis/cmake.sh diff --git a/software/firmware/libraries/ArduinoJson/scripts/travis/coverage.sh b/software/firmware/archive/libraries/ArduinoJson/scripts/travis/coverage.sh similarity index 100% rename from software/firmware/libraries/ArduinoJson/scripts/travis/coverage.sh rename to software/firmware/archive/libraries/ArduinoJson/scripts/travis/coverage.sh diff --git a/software/firmware/libraries/ArduinoJson/scripts/travis/fuzz.sh b/software/firmware/archive/libraries/ArduinoJson/scripts/travis/fuzz.sh similarity index 100% rename from software/firmware/libraries/ArduinoJson/scripts/travis/fuzz.sh rename to software/firmware/archive/libraries/ArduinoJson/scripts/travis/fuzz.sh diff --git a/software/firmware/libraries/ArduinoJson/scripts/travis/platformio.sh b/software/firmware/archive/libraries/ArduinoJson/scripts/travis/platformio.sh similarity index 100% rename from software/firmware/libraries/ArduinoJson/scripts/travis/platformio.sh rename to software/firmware/archive/libraries/ArduinoJson/scripts/travis/platformio.sh diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson.h b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson.h similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson.h rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson.h diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Configuration.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Configuration.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Configuration.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Configuration.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Data/Encoding.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Data/Encoding.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Data/Encoding.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Data/Encoding.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Data/JsonBufferAllocated.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Data/JsonBufferAllocated.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Data/JsonBufferAllocated.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Data/JsonBufferAllocated.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Data/JsonFloat.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Data/JsonFloat.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Data/JsonFloat.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Data/JsonFloat.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Data/JsonInteger.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Data/JsonInteger.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Data/JsonInteger.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Data/JsonInteger.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Data/JsonVariantAs.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Data/JsonVariantAs.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Data/JsonVariantAs.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Data/JsonVariantAs.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Data/JsonVariantContent.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Data/JsonVariantContent.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Data/JsonVariantContent.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Data/JsonVariantContent.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Data/JsonVariantDefault.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Data/JsonVariantDefault.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Data/JsonVariantDefault.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Data/JsonVariantDefault.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Data/JsonVariantType.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Data/JsonVariantType.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Data/JsonVariantType.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Data/JsonVariantType.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Data/List.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Data/List.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Data/List.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Data/List.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Data/ListConstIterator.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Data/ListConstIterator.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Data/ListConstIterator.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Data/ListConstIterator.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Data/ListIterator.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Data/ListIterator.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Data/ListIterator.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Data/ListIterator.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Data/ListNode.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Data/ListNode.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Data/ListNode.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Data/ListNode.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Data/NonCopyable.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Data/NonCopyable.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Data/NonCopyable.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Data/NonCopyable.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Data/ReferenceType.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Data/ReferenceType.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Data/ReferenceType.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Data/ReferenceType.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Data/ValueSaver.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Data/ValueSaver.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Data/ValueSaver.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Data/ValueSaver.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Deserialization/Comments.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Deserialization/Comments.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Deserialization/Comments.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Deserialization/Comments.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Deserialization/JsonParser.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Deserialization/JsonParser.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Deserialization/JsonParser.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Deserialization/JsonParser.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Deserialization/JsonParserImpl.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Deserialization/JsonParserImpl.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Deserialization/JsonParserImpl.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Deserialization/JsonParserImpl.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Deserialization/StringWriter.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Deserialization/StringWriter.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Deserialization/StringWriter.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Deserialization/StringWriter.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/DynamicJsonBuffer.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/DynamicJsonBuffer.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/DynamicJsonBuffer.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/DynamicJsonBuffer.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonArray.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonArray.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonArray.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonArray.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonArrayImpl.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonArrayImpl.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonArrayImpl.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonArrayImpl.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonArraySubscript.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonArraySubscript.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonArraySubscript.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonArraySubscript.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonBuffer.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonBuffer.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonBuffer.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonBuffer.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonBufferBase.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonBufferBase.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonBufferBase.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonBufferBase.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonBufferImpl.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonBufferImpl.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonBufferImpl.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonBufferImpl.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonObject.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonObject.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonObject.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonObject.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonObjectImpl.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonObjectImpl.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonObjectImpl.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonObjectImpl.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonObjectSubscript.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonObjectSubscript.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonObjectSubscript.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonObjectSubscript.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonPair.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonPair.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonPair.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonPair.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonVariant.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonVariant.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonVariant.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonVariant.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonVariantBase.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonVariantBase.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonVariantBase.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonVariantBase.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonVariantCasts.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonVariantCasts.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonVariantCasts.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonVariantCasts.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonVariantComparisons.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonVariantComparisons.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonVariantComparisons.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonVariantComparisons.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonVariantImpl.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonVariantImpl.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonVariantImpl.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonVariantImpl.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonVariantOr.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonVariantOr.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonVariantOr.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonVariantOr.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonVariantSubscripts.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonVariantSubscripts.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/JsonVariantSubscripts.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/JsonVariantSubscripts.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Polyfills/alias_cast.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Polyfills/alias_cast.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Polyfills/alias_cast.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Polyfills/alias_cast.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Polyfills/attributes.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Polyfills/attributes.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Polyfills/attributes.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Polyfills/attributes.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Polyfills/ctype.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Polyfills/ctype.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Polyfills/ctype.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Polyfills/ctype.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Polyfills/isFloat.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Polyfills/isFloat.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Polyfills/isFloat.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Polyfills/isFloat.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Polyfills/isInteger.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Polyfills/isInteger.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Polyfills/isInteger.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Polyfills/isInteger.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Polyfills/math.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Polyfills/math.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Polyfills/math.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Polyfills/math.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Polyfills/parseFloat.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Polyfills/parseFloat.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Polyfills/parseFloat.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Polyfills/parseFloat.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Polyfills/parseInteger.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Polyfills/parseInteger.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Polyfills/parseInteger.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Polyfills/parseInteger.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/RawJson.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/RawJson.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/RawJson.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/RawJson.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Serialization/DummyPrint.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Serialization/DummyPrint.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Serialization/DummyPrint.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Serialization/DummyPrint.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Serialization/DynamicStringBuilder.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Serialization/DynamicStringBuilder.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Serialization/DynamicStringBuilder.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Serialization/DynamicStringBuilder.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Serialization/FloatParts.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Serialization/FloatParts.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Serialization/FloatParts.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Serialization/FloatParts.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Serialization/IndentedPrint.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Serialization/IndentedPrint.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Serialization/IndentedPrint.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Serialization/IndentedPrint.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Serialization/JsonPrintable.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Serialization/JsonPrintable.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Serialization/JsonPrintable.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Serialization/JsonPrintable.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Serialization/JsonSerializer.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Serialization/JsonSerializer.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Serialization/JsonSerializer.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Serialization/JsonSerializer.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Serialization/JsonSerializerImpl.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Serialization/JsonSerializerImpl.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Serialization/JsonSerializerImpl.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Serialization/JsonSerializerImpl.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Serialization/JsonWriter.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Serialization/JsonWriter.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Serialization/JsonWriter.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Serialization/JsonWriter.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Serialization/Prettyfier.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Serialization/Prettyfier.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Serialization/Prettyfier.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Serialization/Prettyfier.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Serialization/StaticStringBuilder.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Serialization/StaticStringBuilder.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Serialization/StaticStringBuilder.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Serialization/StaticStringBuilder.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/Serialization/StreamPrintAdapter.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Serialization/StreamPrintAdapter.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/Serialization/StreamPrintAdapter.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/Serialization/StreamPrintAdapter.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/StaticJsonBuffer.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/StaticJsonBuffer.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/StaticJsonBuffer.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/StaticJsonBuffer.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/StringTraits/ArduinoStream.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/StringTraits/ArduinoStream.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/StringTraits/ArduinoStream.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/StringTraits/ArduinoStream.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/StringTraits/CharPointer.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/StringTraits/CharPointer.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/StringTraits/CharPointer.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/StringTraits/CharPointer.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/StringTraits/FlashString.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/StringTraits/FlashString.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/StringTraits/FlashString.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/StringTraits/FlashString.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/StringTraits/StdStream.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/StringTraits/StdStream.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/StringTraits/StdStream.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/StringTraits/StdStream.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/StringTraits/StdString.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/StringTraits/StdString.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/StringTraits/StdString.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/StringTraits/StdString.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/StringTraits/StringTraits.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/StringTraits/StringTraits.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/StringTraits/StringTraits.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/StringTraits/StringTraits.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/EnableIf.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/EnableIf.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/EnableIf.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/EnableIf.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/FloatTraits.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/FloatTraits.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/FloatTraits.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/FloatTraits.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsArray.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsArray.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsArray.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsArray.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsBaseOf.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsBaseOf.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsBaseOf.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsBaseOf.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsChar.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsChar.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsChar.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsChar.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsConst.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsConst.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsConst.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsConst.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsFloatingPoint.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsFloatingPoint.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsFloatingPoint.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsFloatingPoint.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsIntegral.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsIntegral.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsIntegral.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsIntegral.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsSame.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsSame.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsSame.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsSame.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsSignedIntegral.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsSignedIntegral.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsSignedIntegral.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsSignedIntegral.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsUnsignedIntegral.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsUnsignedIntegral.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsUnsignedIntegral.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsUnsignedIntegral.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsVariant.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsVariant.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsVariant.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/IsVariant.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/RemoveConst.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/RemoveConst.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/RemoveConst.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/RemoveConst.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/RemoveReference.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/RemoveReference.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/RemoveReference.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/TypeTraits/RemoveReference.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/compatibility.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/compatibility.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/compatibility.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/compatibility.hpp diff --git a/software/firmware/libraries/ArduinoJson/src/ArduinoJson/version.hpp b/software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/version.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/src/ArduinoJson/version.hpp rename to software/firmware/archive/libraries/ArduinoJson/src/ArduinoJson/version.hpp diff --git a/software/firmware/libraries/ArduinoJson/test/CMakeLists.txt b/software/firmware/archive/libraries/ArduinoJson/test/CMakeLists.txt similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/CMakeLists.txt rename to software/firmware/archive/libraries/ArduinoJson/test/CMakeLists.txt diff --git a/software/firmware/libraries/ArduinoJson/test/DynamicJsonBuffer/CMakeLists.txt b/software/firmware/archive/libraries/ArduinoJson/test/DynamicJsonBuffer/CMakeLists.txt similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/DynamicJsonBuffer/CMakeLists.txt rename to software/firmware/archive/libraries/ArduinoJson/test/DynamicJsonBuffer/CMakeLists.txt diff --git a/software/firmware/libraries/ArduinoJson/test/DynamicJsonBuffer/alloc.cpp b/software/firmware/archive/libraries/ArduinoJson/test/DynamicJsonBuffer/alloc.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/DynamicJsonBuffer/alloc.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/DynamicJsonBuffer/alloc.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/DynamicJsonBuffer/createArray.cpp b/software/firmware/archive/libraries/ArduinoJson/test/DynamicJsonBuffer/createArray.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/DynamicJsonBuffer/createArray.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/DynamicJsonBuffer/createArray.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/DynamicJsonBuffer/createObject.cpp b/software/firmware/archive/libraries/ArduinoJson/test/DynamicJsonBuffer/createObject.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/DynamicJsonBuffer/createObject.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/DynamicJsonBuffer/createObject.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/DynamicJsonBuffer/no_memory.cpp b/software/firmware/archive/libraries/ArduinoJson/test/DynamicJsonBuffer/no_memory.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/DynamicJsonBuffer/no_memory.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/DynamicJsonBuffer/no_memory.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/DynamicJsonBuffer/size.cpp b/software/firmware/archive/libraries/ArduinoJson/test/DynamicJsonBuffer/size.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/DynamicJsonBuffer/size.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/DynamicJsonBuffer/size.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/DynamicJsonBuffer/startString.cpp b/software/firmware/archive/libraries/ArduinoJson/test/DynamicJsonBuffer/startString.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/DynamicJsonBuffer/startString.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/DynamicJsonBuffer/startString.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/IntegrationTests/CMakeLists.txt b/software/firmware/archive/libraries/ArduinoJson/test/IntegrationTests/CMakeLists.txt similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/IntegrationTests/CMakeLists.txt rename to software/firmware/archive/libraries/ArduinoJson/test/IntegrationTests/CMakeLists.txt diff --git a/software/firmware/libraries/ArduinoJson/test/IntegrationTests/gbathree.cpp b/software/firmware/archive/libraries/ArduinoJson/test/IntegrationTests/gbathree.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/IntegrationTests/gbathree.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/IntegrationTests/gbathree.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/IntegrationTests/round_trip.cpp b/software/firmware/archive/libraries/ArduinoJson/test/IntegrationTests/round_trip.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/IntegrationTests/round_trip.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/IntegrationTests/round_trip.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonArray/CMakeLists.txt b/software/firmware/archive/libraries/ArduinoJson/test/JsonArray/CMakeLists.txt similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonArray/CMakeLists.txt rename to software/firmware/archive/libraries/ArduinoJson/test/JsonArray/CMakeLists.txt diff --git a/software/firmware/libraries/ArduinoJson/test/JsonArray/add.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonArray/add.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonArray/add.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonArray/add.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonArray/basics.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonArray/basics.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonArray/basics.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonArray/basics.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonArray/copyFrom.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonArray/copyFrom.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonArray/copyFrom.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonArray/copyFrom.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonArray/copyTo.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonArray/copyTo.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonArray/copyTo.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonArray/copyTo.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonArray/invalid.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonArray/invalid.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonArray/invalid.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonArray/invalid.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonArray/iterator.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonArray/iterator.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonArray/iterator.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonArray/iterator.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonArray/prettyPrintTo.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonArray/prettyPrintTo.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonArray/prettyPrintTo.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonArray/prettyPrintTo.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonArray/printTo.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonArray/printTo.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonArray/printTo.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonArray/printTo.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonArray/remove.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonArray/remove.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonArray/remove.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonArray/remove.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonArray/set.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonArray/set.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonArray/set.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonArray/set.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonArray/size.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonArray/size.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonArray/size.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonArray/size.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonArray/subscript.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonArray/subscript.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonArray/subscript.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonArray/subscript.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonBuffer/CMakeLists.txt b/software/firmware/archive/libraries/ArduinoJson/test/JsonBuffer/CMakeLists.txt similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonBuffer/CMakeLists.txt rename to software/firmware/archive/libraries/ArduinoJson/test/JsonBuffer/CMakeLists.txt diff --git a/software/firmware/libraries/ArduinoJson/test/JsonBuffer/nested.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonBuffer/nested.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonBuffer/nested.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonBuffer/nested.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonBuffer/nestingLimit.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonBuffer/nestingLimit.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonBuffer/nestingLimit.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonBuffer/nestingLimit.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonBuffer/parse.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonBuffer/parse.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonBuffer/parse.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonBuffer/parse.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonBuffer/parseArray.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonBuffer/parseArray.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonBuffer/parseArray.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonBuffer/parseArray.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonBuffer/parseObject.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonBuffer/parseObject.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonBuffer/parseObject.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonBuffer/parseObject.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonObject/CMakeLists.txt b/software/firmware/archive/libraries/ArduinoJson/test/JsonObject/CMakeLists.txt similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonObject/CMakeLists.txt rename to software/firmware/archive/libraries/ArduinoJson/test/JsonObject/CMakeLists.txt diff --git a/software/firmware/libraries/ArduinoJson/test/JsonObject/basics.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonObject/basics.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonObject/basics.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonObject/basics.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonObject/containsKey.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonObject/containsKey.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonObject/containsKey.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonObject/containsKey.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonObject/get.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonObject/get.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonObject/get.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonObject/get.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonObject/invalid.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonObject/invalid.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonObject/invalid.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonObject/invalid.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonObject/iterator.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonObject/iterator.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonObject/iterator.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonObject/iterator.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonObject/prettyPrintTo.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonObject/prettyPrintTo.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonObject/prettyPrintTo.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonObject/prettyPrintTo.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonObject/printTo.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonObject/printTo.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonObject/printTo.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonObject/printTo.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonObject/remove.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonObject/remove.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonObject/remove.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonObject/remove.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonObject/set.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonObject/set.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonObject/set.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonObject/set.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonObject/size.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonObject/size.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonObject/size.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonObject/size.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonObject/subscript.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonObject/subscript.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonObject/subscript.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonObject/subscript.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonVariant/CMakeLists.txt b/software/firmware/archive/libraries/ArduinoJson/test/JsonVariant/CMakeLists.txt similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonVariant/CMakeLists.txt rename to software/firmware/archive/libraries/ArduinoJson/test/JsonVariant/CMakeLists.txt diff --git a/software/firmware/libraries/ArduinoJson/test/JsonVariant/as.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonVariant/as.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonVariant/as.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonVariant/as.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonVariant/compare.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonVariant/compare.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonVariant/compare.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonVariant/compare.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonVariant/copy.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonVariant/copy.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonVariant/copy.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonVariant/copy.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonVariant/is.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonVariant/is.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonVariant/is.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonVariant/is.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonVariant/or.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonVariant/or.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonVariant/or.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonVariant/or.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonVariant/printTo.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonVariant/printTo.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonVariant/printTo.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonVariant/printTo.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonVariant/set_get.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonVariant/set_get.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonVariant/set_get.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonVariant/set_get.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonVariant/subscript.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonVariant/subscript.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonVariant/subscript.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonVariant/subscript.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonVariant/success.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonVariant/success.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonVariant/success.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonVariant/success.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonVariant/undefined.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonVariant/undefined.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonVariant/undefined.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonVariant/undefined.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonWriter/CMakeLists.txt b/software/firmware/archive/libraries/ArduinoJson/test/JsonWriter/CMakeLists.txt similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonWriter/CMakeLists.txt rename to software/firmware/archive/libraries/ArduinoJson/test/JsonWriter/CMakeLists.txt diff --git a/software/firmware/libraries/ArduinoJson/test/JsonWriter/writeFloat.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonWriter/writeFloat.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonWriter/writeFloat.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonWriter/writeFloat.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/JsonWriter/writeString.cpp b/software/firmware/archive/libraries/ArduinoJson/test/JsonWriter/writeString.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/JsonWriter/writeString.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/JsonWriter/writeString.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/Misc/CMakeLists.txt b/software/firmware/archive/libraries/ArduinoJson/test/Misc/CMakeLists.txt similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/Misc/CMakeLists.txt rename to software/firmware/archive/libraries/ArduinoJson/test/Misc/CMakeLists.txt diff --git a/software/firmware/libraries/ArduinoJson/test/Misc/FloatParts.cpp b/software/firmware/archive/libraries/ArduinoJson/test/Misc/FloatParts.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/Misc/FloatParts.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/Misc/FloatParts.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/Misc/StringBuilder.cpp b/software/firmware/archive/libraries/ArduinoJson/test/Misc/StringBuilder.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/Misc/StringBuilder.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/Misc/StringBuilder.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/Misc/StringTraits.cpp b/software/firmware/archive/libraries/ArduinoJson/test/Misc/StringTraits.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/Misc/StringTraits.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/Misc/StringTraits.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/Misc/TypeTraits.cpp b/software/firmware/archive/libraries/ArduinoJson/test/Misc/TypeTraits.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/Misc/TypeTraits.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/Misc/TypeTraits.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/Misc/deprecated.cpp b/software/firmware/archive/libraries/ArduinoJson/test/Misc/deprecated.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/Misc/deprecated.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/Misc/deprecated.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/Misc/empty.cpp b/software/firmware/archive/libraries/ArduinoJson/test/Misc/empty.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/Misc/empty.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/Misc/empty.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/Misc/std_stream.cpp b/software/firmware/archive/libraries/ArduinoJson/test/Misc/std_stream.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/Misc/std_stream.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/Misc/std_stream.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/Misc/std_string.cpp b/software/firmware/archive/libraries/ArduinoJson/test/Misc/std_string.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/Misc/std_string.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/Misc/std_string.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/Misc/unsigned_char.cpp b/software/firmware/archive/libraries/ArduinoJson/test/Misc/unsigned_char.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/Misc/unsigned_char.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/Misc/unsigned_char.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/Misc/version.cpp b/software/firmware/archive/libraries/ArduinoJson/test/Misc/version.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/Misc/version.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/Misc/version.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/Misc/vla.cpp b/software/firmware/archive/libraries/ArduinoJson/test/Misc/vla.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/Misc/vla.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/Misc/vla.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/Polyfills/CMakeLists.txt b/software/firmware/archive/libraries/ArduinoJson/test/Polyfills/CMakeLists.txt similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/Polyfills/CMakeLists.txt rename to software/firmware/archive/libraries/ArduinoJson/test/Polyfills/CMakeLists.txt diff --git a/software/firmware/libraries/ArduinoJson/test/Polyfills/isFloat.cpp b/software/firmware/archive/libraries/ArduinoJson/test/Polyfills/isFloat.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/Polyfills/isFloat.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/Polyfills/isFloat.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/Polyfills/isInteger.cpp b/software/firmware/archive/libraries/ArduinoJson/test/Polyfills/isInteger.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/Polyfills/isInteger.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/Polyfills/isInteger.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/Polyfills/parseFloat.cpp b/software/firmware/archive/libraries/ArduinoJson/test/Polyfills/parseFloat.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/Polyfills/parseFloat.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/Polyfills/parseFloat.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/Polyfills/parseInteger.cpp b/software/firmware/archive/libraries/ArduinoJson/test/Polyfills/parseInteger.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/Polyfills/parseInteger.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/Polyfills/parseInteger.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/StaticJsonBuffer/CMakeLists.txt b/software/firmware/archive/libraries/ArduinoJson/test/StaticJsonBuffer/CMakeLists.txt similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/StaticJsonBuffer/CMakeLists.txt rename to software/firmware/archive/libraries/ArduinoJson/test/StaticJsonBuffer/CMakeLists.txt diff --git a/software/firmware/libraries/ArduinoJson/test/StaticJsonBuffer/alloc.cpp b/software/firmware/archive/libraries/ArduinoJson/test/StaticJsonBuffer/alloc.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/StaticJsonBuffer/alloc.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/StaticJsonBuffer/alloc.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/StaticJsonBuffer/createArray.cpp b/software/firmware/archive/libraries/ArduinoJson/test/StaticJsonBuffer/createArray.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/StaticJsonBuffer/createArray.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/StaticJsonBuffer/createArray.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/StaticJsonBuffer/createObject.cpp b/software/firmware/archive/libraries/ArduinoJson/test/StaticJsonBuffer/createObject.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/StaticJsonBuffer/createObject.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/StaticJsonBuffer/createObject.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/StaticJsonBuffer/parseArray.cpp b/software/firmware/archive/libraries/ArduinoJson/test/StaticJsonBuffer/parseArray.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/StaticJsonBuffer/parseArray.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/StaticJsonBuffer/parseArray.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/StaticJsonBuffer/parseObject.cpp b/software/firmware/archive/libraries/ArduinoJson/test/StaticJsonBuffer/parseObject.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/StaticJsonBuffer/parseObject.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/StaticJsonBuffer/parseObject.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/StaticJsonBuffer/size.cpp b/software/firmware/archive/libraries/ArduinoJson/test/StaticJsonBuffer/size.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/StaticJsonBuffer/size.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/StaticJsonBuffer/size.cpp diff --git a/software/firmware/libraries/ArduinoJson/test/StaticJsonBuffer/startString.cpp b/software/firmware/archive/libraries/ArduinoJson/test/StaticJsonBuffer/startString.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/test/StaticJsonBuffer/startString.cpp rename to software/firmware/archive/libraries/ArduinoJson/test/StaticJsonBuffer/startString.cpp diff --git a/software/firmware/libraries/ArduinoJson/third-party/catch/CMakeLists.txt b/software/firmware/archive/libraries/ArduinoJson/third-party/catch/CMakeLists.txt similarity index 100% rename from software/firmware/libraries/ArduinoJson/third-party/catch/CMakeLists.txt rename to software/firmware/archive/libraries/ArduinoJson/third-party/catch/CMakeLists.txt diff --git a/software/firmware/libraries/ArduinoJson/third-party/catch/catch.cpp b/software/firmware/archive/libraries/ArduinoJson/third-party/catch/catch.cpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/third-party/catch/catch.cpp rename to software/firmware/archive/libraries/ArduinoJson/third-party/catch/catch.cpp diff --git a/software/firmware/libraries/ArduinoJson/third-party/catch/catch.hpp b/software/firmware/archive/libraries/ArduinoJson/third-party/catch/catch.hpp similarity index 100% rename from software/firmware/libraries/ArduinoJson/third-party/catch/catch.hpp rename to software/firmware/archive/libraries/ArduinoJson/third-party/catch/catch.hpp diff --git a/software/firmware/libraries/CSTS/CSTS.h b/software/firmware/archive/libraries/CSTS/CSTS.h similarity index 95% rename from software/firmware/libraries/CSTS/CSTS.h rename to software/firmware/archive/libraries/CSTS/CSTS.h index 18a9e48..e728193 100644 --- a/software/firmware/libraries/CSTS/CSTS.h +++ b/software/firmware/archive/libraries/CSTS/CSTS.h @@ -1,49 +1,49 @@ -#include - -const int size = 50; -int datac[size]; //for not using averages, comment out lines 3,4,17,18 and uncomment 31,32 -int datat[size]; - -average average_current(datac,size); -average average_temp(datat,size); - - -/*********************************************** -normal cals are voltage cal = 3.3/1024 -cs_scale = 50 -cs_offset = 2.2 -temp_scale = 158 -temp_offset = 81 -*************************************************/ - - -class CSTS{ - public: - CSTS(int,float,int,int,float); - void update(float&,float&); - private: - int cs_scale; - float cs_offset; - int temp_scale; - int temp_offset; - float voltage_cal; -}; - - - -void CSTS::update(float& CS,float& Temp){ - float avgc = average_current.update(analogRead(A4)); - float avgt = average_temp.update(analogRead(A9)); - float cs_voltage = avgc*(voltage_cal) + 0.002; - float temp_voltage = avgt*(voltage_cal)+0.002; - CS = cs_voltage*cs_scale-cs_offset; - Temp = ((temp_voltage-.75)*100)+25; -} - -CSTS::CSTS(int csScale,float csOffset,int tempScale,int tempOffset,float vcal){ - cs_scale = csScale; - cs_offset = csOffset; - temp_scale = tempScale; - temp_offset = tempOffset; - voltage_cal = vcal; -} +#include + +const int size = 50; +int datac[size]; //for not using averages, comment out lines 3,4,17,18 and uncomment 31,32 +int datat[size]; + +average average_current(datac,size); +average average_temp(datat,size); + + +/*********************************************** +normal cals are voltage cal = 3.3/1024 +cs_scale = 50 +cs_offset = 2.2 +temp_scale = 158 +temp_offset = 81 +*************************************************/ + + +class CSTS{ + public: + CSTS(int,float,int,int,float); + void update(float&,float&); + private: + int cs_scale; + float cs_offset; + int temp_scale; + int temp_offset; + float voltage_cal; +}; + + + +void CSTS::update(float& CS,float& Temp){ + float avgc = average_current.update(analogRead(A4)); + float avgt = average_temp.update(analogRead(A9)); + float cs_voltage = avgc*(voltage_cal) + 0.002; + float temp_voltage = avgt*(voltage_cal)+0.002; + CS = cs_voltage*cs_scale-cs_offset; + Temp = ((temp_voltage-.75)*100)+25; +} + +CSTS::CSTS(int csScale,float csOffset,int tempScale,int tempOffset,float vcal){ + cs_scale = csScale; + cs_offset = csOffset; + temp_scale = tempScale; + temp_offset = tempOffset; + voltage_cal = vcal; +} diff --git a/software/firmware/libraries/CSTS/README.md b/software/firmware/archive/libraries/CSTS/README.md similarity index 100% rename from software/firmware/libraries/CSTS/README.md rename to software/firmware/archive/libraries/CSTS/README.md diff --git a/software/firmware/libraries/CSTS/average.h b/software/firmware/archive/libraries/CSTS/average.h similarity index 93% rename from software/firmware/libraries/CSTS/average.h rename to software/firmware/archive/libraries/CSTS/average.h index ae81be7..f01f199 100644 --- a/software/firmware/libraries/CSTS/average.h +++ b/software/firmware/archive/libraries/CSTS/average.h @@ -1,79 +1,79 @@ -class average{ - private: - int* loc; - int ar; - public: - average(int*,int); - float update(int); -}; - -average::average(int* in, int a){ - loc = in; - ar = a; - for(int i=0;i high1) - { - high2 = high1; - high1 = temp[i]; - } - } - - - //Update the proper array - for(int i=0;i high1) + { + high2 = high1; + high1 = temp[i]; + } + } + + + //Update the proper array + for(int i=0;i //required for library - - -CSTS sense(50,2.2,158,81,(3.3/1024)); // This is the constructor for the library where you set calibration values - -float Temp; -float CS; - - void setColor(int speed, bool forward, int bluepin, int redpin, int greenpin) -{ - analogWrite(bluepin, 127); - int onPin; - int offPin; - - if (forward){ - onPin = greenpin; - offPin = redpin; - } - if (!forward){ - onPin = redpin; - offPin = greenpin; - } - digitalWrite(offPin, LOW); - analogWrite(onPin, speed); -} - -void setup() { - Serial.begin(9600); - //Serial.setTimeout(10); - pinMode(19,OUTPUT); - - analogReference(EXTERNAL); -} - -int spd, last; -bool dir; - -void loop() { - - //read serial - while(Serial.available()){ // this serial read section allows you to input motor speed through the serial monitor - spd = Serial.parseInt(); // the speed range varies from 0 through 255 and direction can be changed by adding an 'f' after the speed - Serial.print(spd); // examples: 110, 50, 40f, 200f, 255, 0, 92f - if(Serial.read() == 'f'){ - dir = true; - Serial.println(" Forwards"); - }else{ - dir = false; - Serial.println(" Backwords"); - } - Serial.read(); - } - - - //MotorWrite - analogWrite(20,spd); - digitalWrite(19,dir); - - setColor(spd,dir,6,32,25); - - sense.update(CS,Temp); // This is a pass by reference function changes the values "CS" and "Temp" to the correct current and temperature values. - - //Current Sense - /* - int raw = analogRead(A4); - Serial.print(raw); - Serial.print(" "); - float raw_v = raw*(3.3/1023); - Serial.println(raw_v,4); -*/ - // Noise Reduction - //int Data [10] = 0; - - - - - delay(20); -} - - - - - - - - - - - - - - - - - - - - - - - +/********************************************** +*This is example code written by Anthony Grana +*This code was written for the current sense / temperature sense (CSTS) library +*default calibration values for the csts are 50, 2.2, 158, 81, (3.3/1024) +* +* +* +* +* +**********************************************/ + + + + + +#include //required for library + + +CSTS sense(50,2.2,158,81,(3.3/1024)); // This is the constructor for the library where you set calibration values + +float Temp; +float CS; + + void setColor(int speed, bool forward, int bluepin, int redpin, int greenpin) +{ + analogWrite(bluepin, 127); + int onPin; + int offPin; + + if (forward){ + onPin = greenpin; + offPin = redpin; + } + if (!forward){ + onPin = redpin; + offPin = greenpin; + } + digitalWrite(offPin, LOW); + analogWrite(onPin, speed); +} + +void setup() { + Serial.begin(9600); + //Serial.setTimeout(10); + pinMode(19,OUTPUT); + + analogReference(EXTERNAL); +} + +int spd, last; +bool dir; + +void loop() { + + //read serial + while(Serial.available()){ // this serial read section allows you to input motor speed through the serial monitor + spd = Serial.parseInt(); // the speed range varies from 0 through 255 and direction can be changed by adding an 'f' after the speed + Serial.print(spd); // examples: 110, 50, 40f, 200f, 255, 0, 92f + if(Serial.read() == 'f'){ + dir = true; + Serial.println(" Forwards"); + }else{ + dir = false; + Serial.println(" Backwords"); + } + Serial.read(); + } + + + //MotorWrite + analogWrite(20,spd); + digitalWrite(19,dir); + + setColor(spd,dir,6,32,25); + + sense.update(CS,Temp); // This is a pass by reference function changes the values "CS" and "Temp" to the correct current and temperature values. + + //Current Sense + /* + int raw = analogRead(A4); + Serial.print(raw); + Serial.print(" "); + float raw_v = raw*(3.3/1023); + Serial.println(raw_v,4); +*/ + // Noise Reduction + //int Data [10] = 0; + + + + + delay(20); +} + + + + + + + + + + + + + + + + + + + + + + + diff --git a/software/firmware/libraries/NeoGPS/.gitattributes b/software/firmware/archive/libraries/NeoGPS/.gitattributes similarity index 100% rename from software/firmware/libraries/NeoGPS/.gitattributes rename to software/firmware/archive/libraries/NeoGPS/.gitattributes diff --git a/software/firmware/libraries/NeoGPS/.gitignore b/software/firmware/archive/libraries/NeoGPS/.gitignore similarity index 100% rename from software/firmware/libraries/NeoGPS/.gitignore rename to software/firmware/archive/libraries/NeoGPS/.gitignore diff --git a/software/firmware/libraries/NeoGPS/LICENSE b/software/firmware/archive/libraries/NeoGPS/LICENSE similarity index 100% rename from software/firmware/libraries/NeoGPS/LICENSE rename to software/firmware/archive/libraries/NeoGPS/LICENSE diff --git a/software/firmware/libraries/NeoGPS/README.md b/software/firmware/archive/libraries/NeoGPS/README.md similarity index 100% rename from software/firmware/libraries/NeoGPS/README.md rename to software/firmware/archive/libraries/NeoGPS/README.md diff --git a/software/firmware/libraries/NeoGPS/examples/NMEA/NMEA.ino b/software/firmware/archive/libraries/NeoGPS/examples/NMEA/NMEA.ino similarity index 100% rename from software/firmware/libraries/NeoGPS/examples/NMEA/NMEA.ino rename to software/firmware/archive/libraries/NeoGPS/examples/NMEA/NMEA.ino diff --git a/software/firmware/libraries/NeoGPS/examples/NMEAGSV/NMEAGSV.ino b/software/firmware/archive/libraries/NeoGPS/examples/NMEAGSV/NMEAGSV.ino similarity index 100% rename from software/firmware/libraries/NeoGPS/examples/NMEAGSV/NMEAGSV.ino rename to software/firmware/archive/libraries/NeoGPS/examples/NMEAGSV/NMEAGSV.ino diff --git a/software/firmware/libraries/NeoGPS/examples/NMEASDlog/NMEASDlog.ino b/software/firmware/archive/libraries/NeoGPS/examples/NMEASDlog/NMEASDlog.ino similarity index 100% rename from software/firmware/libraries/NeoGPS/examples/NMEASDlog/NMEASDlog.ino rename to software/firmware/archive/libraries/NeoGPS/examples/NMEASDlog/NMEASDlog.ino diff --git a/software/firmware/libraries/NeoGPS/examples/NMEA_isr/NMEA_isr.ino b/software/firmware/archive/libraries/NeoGPS/examples/NMEA_isr/NMEA_isr.ino similarity index 100% rename from software/firmware/libraries/NeoGPS/examples/NMEA_isr/NMEA_isr.ino rename to software/firmware/archive/libraries/NeoGPS/examples/NMEA_isr/NMEA_isr.ino diff --git a/software/firmware/libraries/NeoGPS/examples/NMEAaverage/NMEAaverage.ino b/software/firmware/archive/libraries/NeoGPS/examples/NMEAaverage/NMEAaverage.ino similarity index 100% rename from software/firmware/libraries/NeoGPS/examples/NMEAaverage/NMEAaverage.ino rename to software/firmware/archive/libraries/NeoGPS/examples/NMEAaverage/NMEAaverage.ino diff --git a/software/firmware/libraries/NeoGPS/examples/NMEAbenchmark/NMEAbenchmark.ino b/software/firmware/archive/libraries/NeoGPS/examples/NMEAbenchmark/NMEAbenchmark.ino similarity index 100% rename from software/firmware/libraries/NeoGPS/examples/NMEAbenchmark/NMEAbenchmark.ino rename to software/firmware/archive/libraries/NeoGPS/examples/NMEAbenchmark/NMEAbenchmark.ino diff --git a/software/firmware/libraries/NeoGPS/examples/NMEAblink/NMEAblink.ino b/software/firmware/archive/libraries/NeoGPS/examples/NMEAblink/NMEAblink.ino similarity index 100% rename from software/firmware/libraries/NeoGPS/examples/NMEAblink/NMEAblink.ino rename to software/firmware/archive/libraries/NeoGPS/examples/NMEAblink/NMEAblink.ino diff --git a/software/firmware/libraries/NeoGPS/examples/NMEAdiagnostic/NMEAdiagnostic.ino b/software/firmware/archive/libraries/NeoGPS/examples/NMEAdiagnostic/NMEAdiagnostic.ino similarity index 100% rename from software/firmware/libraries/NeoGPS/examples/NMEAdiagnostic/NMEAdiagnostic.ino rename to software/firmware/archive/libraries/NeoGPS/examples/NMEAdiagnostic/NMEAdiagnostic.ino diff --git a/software/firmware/libraries/NeoGPS/examples/NMEAdistance/NMEAdistance.ino b/software/firmware/archive/libraries/NeoGPS/examples/NMEAdistance/NMEAdistance.ino similarity index 100% rename from software/firmware/libraries/NeoGPS/examples/NMEAdistance/NMEAdistance.ino rename to software/firmware/archive/libraries/NeoGPS/examples/NMEAdistance/NMEAdistance.ino diff --git a/software/firmware/libraries/NeoGPS/examples/NMEAloc/NMEAloc.ino b/software/firmware/archive/libraries/NeoGPS/examples/NMEAloc/NMEAloc.ino similarity index 100% rename from software/firmware/libraries/NeoGPS/examples/NMEAloc/NMEAloc.ino rename to software/firmware/archive/libraries/NeoGPS/examples/NMEAloc/NMEAloc.ino diff --git a/software/firmware/libraries/NeoGPS/examples/NMEAlocDMS/NMEAlocDMS.ino b/software/firmware/archive/libraries/NeoGPS/examples/NMEAlocDMS/NMEAlocDMS.ino similarity index 100% rename from software/firmware/libraries/NeoGPS/examples/NMEAlocDMS/NMEAlocDMS.ino rename to software/firmware/archive/libraries/NeoGPS/examples/NMEAlocDMS/NMEAlocDMS.ino diff --git a/software/firmware/libraries/NeoGPS/examples/NMEAorder/NMEAorder.ino b/software/firmware/archive/libraries/NeoGPS/examples/NMEAorder/NMEAorder.ino similarity index 100% rename from software/firmware/libraries/NeoGPS/examples/NMEAorder/NMEAorder.ino rename to software/firmware/archive/libraries/NeoGPS/examples/NMEAorder/NMEAorder.ino diff --git a/software/firmware/libraries/NeoGPS/examples/NMEArevGeoCache/NMEArevGeoCache.ino b/software/firmware/archive/libraries/NeoGPS/examples/NMEArevGeoCache/NMEArevGeoCache.ino similarity index 100% rename from software/firmware/libraries/NeoGPS/examples/NMEArevGeoCache/NMEArevGeoCache.ino rename to software/firmware/archive/libraries/NeoGPS/examples/NMEArevGeoCache/NMEArevGeoCache.ino diff --git a/software/firmware/libraries/NeoGPS/examples/NMEAsimple/NMEAsimple.ino b/software/firmware/archive/libraries/NeoGPS/examples/NMEAsimple/NMEAsimple.ino similarity index 100% rename from software/firmware/libraries/NeoGPS/examples/NMEAsimple/NMEAsimple.ino rename to software/firmware/archive/libraries/NeoGPS/examples/NMEAsimple/NMEAsimple.ino diff --git a/software/firmware/libraries/NeoGPS/examples/NMEAtest/NMEAtest.ino b/software/firmware/archive/libraries/NeoGPS/examples/NMEAtest/NMEAtest.ino similarity index 100% rename from software/firmware/libraries/NeoGPS/examples/NMEAtest/NMEAtest.ino rename to software/firmware/archive/libraries/NeoGPS/examples/NMEAtest/NMEAtest.ino diff --git a/software/firmware/libraries/NeoGPS/examples/NMEAtimezone/NMEAtimezone.ino b/software/firmware/archive/libraries/NeoGPS/examples/NMEAtimezone/NMEAtimezone.ino similarity index 100% rename from software/firmware/libraries/NeoGPS/examples/NMEAtimezone/NMEAtimezone.ino rename to software/firmware/archive/libraries/NeoGPS/examples/NMEAtimezone/NMEAtimezone.ino diff --git a/software/firmware/libraries/NeoGPS/examples/PUBX/PUBX.ino b/software/firmware/archive/libraries/NeoGPS/examples/PUBX/PUBX.ino similarity index 100% rename from software/firmware/libraries/NeoGPS/examples/PUBX/PUBX.ino rename to software/firmware/archive/libraries/NeoGPS/examples/PUBX/PUBX.ino diff --git a/software/firmware/libraries/NeoGPS/examples/SyncTime/SyncTime.ino b/software/firmware/archive/libraries/NeoGPS/examples/SyncTime/SyncTime.ino similarity index 100% rename from software/firmware/libraries/NeoGPS/examples/SyncTime/SyncTime.ino rename to software/firmware/archive/libraries/NeoGPS/examples/SyncTime/SyncTime.ino diff --git a/software/firmware/libraries/NeoGPS/examples/Tabular/Tabular.ino b/software/firmware/archive/libraries/NeoGPS/examples/Tabular/Tabular.ino similarity index 100% rename from software/firmware/libraries/NeoGPS/examples/Tabular/Tabular.ino rename to software/firmware/archive/libraries/NeoGPS/examples/Tabular/Tabular.ino diff --git a/software/firmware/libraries/NeoGPS/examples/ublox/ublox.ino b/software/firmware/archive/libraries/NeoGPS/examples/ublox/ublox.ino similarity index 100% rename from software/firmware/libraries/NeoGPS/examples/ublox/ublox.ino rename to software/firmware/archive/libraries/NeoGPS/examples/ublox/ublox.ino diff --git a/software/firmware/libraries/NeoGPS/examples/ubloxRate/ubloxRate.ino b/software/firmware/archive/libraries/NeoGPS/examples/ubloxRate/ubloxRate.ino similarity index 100% rename from software/firmware/libraries/NeoGPS/examples/ubloxRate/ubloxRate.ino rename to software/firmware/archive/libraries/NeoGPS/examples/ubloxRate/ubloxRate.ino diff --git a/software/firmware/libraries/NeoGPS/extras/configs/DTL/GPSfix_cfg.h b/software/firmware/archive/libraries/NeoGPS/extras/configs/DTL/GPSfix_cfg.h similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/configs/DTL/GPSfix_cfg.h rename to software/firmware/archive/libraries/NeoGPS/extras/configs/DTL/GPSfix_cfg.h diff --git a/software/firmware/libraries/NeoGPS/extras/configs/DTL/NMEAGPS_cfg.h b/software/firmware/archive/libraries/NeoGPS/extras/configs/DTL/NMEAGPS_cfg.h similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/configs/DTL/NMEAGPS_cfg.h rename to software/firmware/archive/libraries/NeoGPS/extras/configs/DTL/NMEAGPS_cfg.h diff --git a/software/firmware/libraries/NeoGPS/extras/configs/DTL/NeoGPS_cfg.h b/software/firmware/archive/libraries/NeoGPS/extras/configs/DTL/NeoGPS_cfg.h similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/configs/DTL/NeoGPS_cfg.h rename to software/firmware/archive/libraries/NeoGPS/extras/configs/DTL/NeoGPS_cfg.h diff --git a/software/firmware/libraries/NeoGPS/extras/configs/Full/GPSfix_cfg.h b/software/firmware/archive/libraries/NeoGPS/extras/configs/Full/GPSfix_cfg.h similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/configs/Full/GPSfix_cfg.h rename to software/firmware/archive/libraries/NeoGPS/extras/configs/Full/GPSfix_cfg.h diff --git a/software/firmware/libraries/NeoGPS/extras/configs/Full/NMEAGPS_cfg.h b/software/firmware/archive/libraries/NeoGPS/extras/configs/Full/NMEAGPS_cfg.h similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/configs/Full/NMEAGPS_cfg.h rename to software/firmware/archive/libraries/NeoGPS/extras/configs/Full/NMEAGPS_cfg.h diff --git a/software/firmware/libraries/NeoGPS/extras/configs/Full/NeoGPS_cfg.h b/software/firmware/archive/libraries/NeoGPS/extras/configs/Full/NeoGPS_cfg.h similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/configs/Full/NeoGPS_cfg.h rename to software/firmware/archive/libraries/NeoGPS/extras/configs/Full/NeoGPS_cfg.h diff --git a/software/firmware/libraries/NeoGPS/extras/configs/Minimal/GPSfix_cfg.h b/software/firmware/archive/libraries/NeoGPS/extras/configs/Minimal/GPSfix_cfg.h similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/configs/Minimal/GPSfix_cfg.h rename to software/firmware/archive/libraries/NeoGPS/extras/configs/Minimal/GPSfix_cfg.h diff --git a/software/firmware/libraries/NeoGPS/extras/configs/Minimal/NMEAGPS_cfg.h b/software/firmware/archive/libraries/NeoGPS/extras/configs/Minimal/NMEAGPS_cfg.h similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/configs/Minimal/NMEAGPS_cfg.h rename to software/firmware/archive/libraries/NeoGPS/extras/configs/Minimal/NMEAGPS_cfg.h diff --git a/software/firmware/libraries/NeoGPS/extras/configs/Minimal/NeoGPS_cfg.h b/software/firmware/archive/libraries/NeoGPS/extras/configs/Minimal/NeoGPS_cfg.h similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/configs/Minimal/NeoGPS_cfg.h rename to software/firmware/archive/libraries/NeoGPS/extras/configs/Minimal/NeoGPS_cfg.h diff --git a/software/firmware/libraries/NeoGPS/extras/configs/Nominal/GPSfix_cfg.h b/software/firmware/archive/libraries/NeoGPS/extras/configs/Nominal/GPSfix_cfg.h similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/configs/Nominal/GPSfix_cfg.h rename to software/firmware/archive/libraries/NeoGPS/extras/configs/Nominal/GPSfix_cfg.h diff --git a/software/firmware/libraries/NeoGPS/extras/configs/Nominal/NMEAGPS_cfg.h b/software/firmware/archive/libraries/NeoGPS/extras/configs/Nominal/NMEAGPS_cfg.h similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/configs/Nominal/NMEAGPS_cfg.h rename to software/firmware/archive/libraries/NeoGPS/extras/configs/Nominal/NMEAGPS_cfg.h diff --git a/software/firmware/libraries/NeoGPS/extras/configs/Nominal/NeoGPS_cfg.h b/software/firmware/archive/libraries/NeoGPS/extras/configs/Nominal/NeoGPS_cfg.h similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/configs/Nominal/NeoGPS_cfg.h rename to software/firmware/archive/libraries/NeoGPS/extras/configs/Nominal/NeoGPS_cfg.h diff --git a/software/firmware/libraries/NeoGPS/extras/configs/PUBX/GPSfix_cfg.h b/software/firmware/archive/libraries/NeoGPS/extras/configs/PUBX/GPSfix_cfg.h similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/configs/PUBX/GPSfix_cfg.h rename to software/firmware/archive/libraries/NeoGPS/extras/configs/PUBX/GPSfix_cfg.h diff --git a/software/firmware/libraries/NeoGPS/extras/configs/PUBX/NMEAGPS_cfg.h b/software/firmware/archive/libraries/NeoGPS/extras/configs/PUBX/NMEAGPS_cfg.h similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/configs/PUBX/NMEAGPS_cfg.h rename to software/firmware/archive/libraries/NeoGPS/extras/configs/PUBX/NMEAGPS_cfg.h diff --git a/software/firmware/libraries/NeoGPS/extras/configs/PUBX/NeoGPS_cfg.h b/software/firmware/archive/libraries/NeoGPS/extras/configs/PUBX/NeoGPS_cfg.h similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/configs/PUBX/NeoGPS_cfg.h rename to software/firmware/archive/libraries/NeoGPS/extras/configs/PUBX/NeoGPS_cfg.h diff --git a/software/firmware/libraries/NeoGPS/extras/configs/Speed/GPSfix_cfg.h b/software/firmware/archive/libraries/NeoGPS/extras/configs/Speed/GPSfix_cfg.h similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/configs/Speed/GPSfix_cfg.h rename to software/firmware/archive/libraries/NeoGPS/extras/configs/Speed/GPSfix_cfg.h diff --git a/software/firmware/libraries/NeoGPS/extras/configs/Speed/NMEAGPS_cfg.h b/software/firmware/archive/libraries/NeoGPS/extras/configs/Speed/NMEAGPS_cfg.h similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/configs/Speed/NMEAGPS_cfg.h rename to software/firmware/archive/libraries/NeoGPS/extras/configs/Speed/NMEAGPS_cfg.h diff --git a/software/firmware/libraries/NeoGPS/extras/configs/Speed/NeoGPS_cfg.h b/software/firmware/archive/libraries/NeoGPS/extras/configs/Speed/NeoGPS_cfg.h similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/configs/Speed/NeoGPS_cfg.h rename to software/firmware/archive/libraries/NeoGPS/extras/configs/Speed/NeoGPS_cfg.h diff --git a/software/firmware/libraries/NeoGPS/extras/doc/Acknowledgements.md b/software/firmware/archive/libraries/NeoGPS/extras/doc/Acknowledgements.md similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/doc/Acknowledgements.md rename to software/firmware/archive/libraries/NeoGPS/extras/doc/Acknowledgements.md diff --git a/software/firmware/libraries/NeoGPS/extras/doc/CharOriented.md b/software/firmware/archive/libraries/NeoGPS/extras/doc/CharOriented.md similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/doc/CharOriented.md rename to software/firmware/archive/libraries/NeoGPS/extras/doc/CharOriented.md diff --git a/software/firmware/libraries/NeoGPS/extras/doc/Choosing.md b/software/firmware/archive/libraries/NeoGPS/extras/doc/Choosing.md similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/doc/Choosing.md rename to software/firmware/archive/libraries/NeoGPS/extras/doc/Choosing.md diff --git a/software/firmware/libraries/NeoGPS/extras/doc/Coherency.md b/software/firmware/archive/libraries/NeoGPS/extras/doc/Coherency.md similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/doc/Coherency.md rename to software/firmware/archive/libraries/NeoGPS/extras/doc/Coherency.md diff --git a/software/firmware/libraries/NeoGPS/extras/doc/Configurations.md b/software/firmware/archive/libraries/NeoGPS/extras/doc/Configurations.md similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/doc/Configurations.md rename to software/firmware/archive/libraries/NeoGPS/extras/doc/Configurations.md diff --git a/software/firmware/libraries/NeoGPS/extras/doc/Data Model.md b/software/firmware/archive/libraries/NeoGPS/extras/doc/Data Model.md similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/doc/Data Model.md rename to software/firmware/archive/libraries/NeoGPS/extras/doc/Data Model.md diff --git a/software/firmware/libraries/NeoGPS/extras/doc/Examples.md b/software/firmware/archive/libraries/NeoGPS/extras/doc/Examples.md similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/doc/Examples.md rename to software/firmware/archive/libraries/NeoGPS/extras/doc/Examples.md diff --git a/software/firmware/libraries/NeoGPS/extras/doc/Extending.md b/software/firmware/archive/libraries/NeoGPS/extras/doc/Extending.md similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/doc/Extending.md rename to software/firmware/archive/libraries/NeoGPS/extras/doc/Extending.md diff --git a/software/firmware/libraries/NeoGPS/extras/doc/Installing.md b/software/firmware/archive/libraries/NeoGPS/extras/doc/Installing.md similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/doc/Installing.md rename to software/firmware/archive/libraries/NeoGPS/extras/doc/Installing.md diff --git a/software/firmware/libraries/NeoGPS/extras/doc/License.md b/software/firmware/archive/libraries/NeoGPS/extras/doc/License.md similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/doc/License.md rename to software/firmware/archive/libraries/NeoGPS/extras/doc/License.md diff --git a/software/firmware/libraries/NeoGPS/extras/doc/Location.md b/software/firmware/archive/libraries/NeoGPS/extras/doc/Location.md similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/doc/Location.md rename to software/firmware/archive/libraries/NeoGPS/extras/doc/Location.md diff --git a/software/firmware/libraries/NeoGPS/extras/doc/Merging.md b/software/firmware/archive/libraries/NeoGPS/extras/doc/Merging.md similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/doc/Merging.md rename to software/firmware/archive/libraries/NeoGPS/extras/doc/Merging.md diff --git a/software/firmware/libraries/NeoGPS/extras/doc/Performance.md b/software/firmware/archive/libraries/NeoGPS/extras/doc/Performance.md similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/doc/Performance.md rename to software/firmware/archive/libraries/NeoGPS/extras/doc/Performance.md diff --git a/software/firmware/libraries/NeoGPS/extras/doc/Program.md b/software/firmware/archive/libraries/NeoGPS/extras/doc/Program.md similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/doc/Program.md rename to software/firmware/archive/libraries/NeoGPS/extras/doc/Program.md diff --git a/software/firmware/libraries/NeoGPS/extras/doc/RAM.md b/software/firmware/archive/libraries/NeoGPS/extras/doc/RAM.md similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/doc/RAM.md rename to software/firmware/archive/libraries/NeoGPS/extras/doc/RAM.md diff --git a/software/firmware/libraries/NeoGPS/extras/doc/Tradeoffs.md b/software/firmware/archive/libraries/NeoGPS/extras/doc/Tradeoffs.md similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/doc/Tradeoffs.md rename to software/firmware/archive/libraries/NeoGPS/extras/doc/Tradeoffs.md diff --git a/software/firmware/libraries/NeoGPS/extras/doc/Troubleshooting.md b/software/firmware/archive/libraries/NeoGPS/extras/doc/Troubleshooting.md similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/doc/Troubleshooting.md rename to software/firmware/archive/libraries/NeoGPS/extras/doc/Troubleshooting.md diff --git a/software/firmware/libraries/NeoGPS/extras/doc/readme.txt b/software/firmware/archive/libraries/NeoGPS/extras/doc/readme.txt similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/doc/readme.txt rename to software/firmware/archive/libraries/NeoGPS/extras/doc/readme.txt diff --git a/software/firmware/libraries/NeoGPS/extras/doc/ublox.md b/software/firmware/archive/libraries/NeoGPS/extras/doc/ublox.md similarity index 100% rename from software/firmware/libraries/NeoGPS/extras/doc/ublox.md rename to software/firmware/archive/libraries/NeoGPS/extras/doc/ublox.md diff --git a/software/firmware/libraries/NeoGPS/library.properties b/software/firmware/archive/libraries/NeoGPS/library.properties similarity index 100% rename from software/firmware/libraries/NeoGPS/library.properties rename to software/firmware/archive/libraries/NeoGPS/library.properties diff --git a/software/firmware/libraries/NeoGPS/src/CosaCompat.h b/software/firmware/archive/libraries/NeoGPS/src/CosaCompat.h similarity index 100% rename from software/firmware/libraries/NeoGPS/src/CosaCompat.h rename to software/firmware/archive/libraries/NeoGPS/src/CosaCompat.h diff --git a/software/firmware/libraries/NeoGPS/src/DMS.cpp b/software/firmware/archive/libraries/NeoGPS/src/DMS.cpp similarity index 100% rename from software/firmware/libraries/NeoGPS/src/DMS.cpp rename to software/firmware/archive/libraries/NeoGPS/src/DMS.cpp diff --git a/software/firmware/libraries/NeoGPS/src/DMS.h b/software/firmware/archive/libraries/NeoGPS/src/DMS.h similarity index 100% rename from software/firmware/libraries/NeoGPS/src/DMS.h rename to software/firmware/archive/libraries/NeoGPS/src/DMS.h diff --git a/software/firmware/libraries/NeoGPS/src/GPSTime.cpp b/software/firmware/archive/libraries/NeoGPS/src/GPSTime.cpp similarity index 100% rename from software/firmware/libraries/NeoGPS/src/GPSTime.cpp rename to software/firmware/archive/libraries/NeoGPS/src/GPSTime.cpp diff --git a/software/firmware/libraries/NeoGPS/src/GPSTime.h b/software/firmware/archive/libraries/NeoGPS/src/GPSTime.h similarity index 100% rename from software/firmware/libraries/NeoGPS/src/GPSTime.h rename to software/firmware/archive/libraries/NeoGPS/src/GPSTime.h diff --git a/software/firmware/libraries/NeoGPS/src/GPSfix.h b/software/firmware/archive/libraries/NeoGPS/src/GPSfix.h similarity index 100% rename from software/firmware/libraries/NeoGPS/src/GPSfix.h rename to software/firmware/archive/libraries/NeoGPS/src/GPSfix.h diff --git a/software/firmware/libraries/NeoGPS/src/GPSfix_cfg.h b/software/firmware/archive/libraries/NeoGPS/src/GPSfix_cfg.h similarity index 100% rename from software/firmware/libraries/NeoGPS/src/GPSfix_cfg.h rename to software/firmware/archive/libraries/NeoGPS/src/GPSfix_cfg.h diff --git a/software/firmware/libraries/NeoGPS/src/GPSport.h b/software/firmware/archive/libraries/NeoGPS/src/GPSport.h similarity index 100% rename from software/firmware/libraries/NeoGPS/src/GPSport.h rename to software/firmware/archive/libraries/NeoGPS/src/GPSport.h diff --git a/software/firmware/libraries/NeoGPS/src/Location.cpp b/software/firmware/archive/libraries/NeoGPS/src/Location.cpp similarity index 100% rename from software/firmware/libraries/NeoGPS/src/Location.cpp rename to software/firmware/archive/libraries/NeoGPS/src/Location.cpp diff --git a/software/firmware/libraries/NeoGPS/src/Location.h b/software/firmware/archive/libraries/NeoGPS/src/Location.h similarity index 100% rename from software/firmware/libraries/NeoGPS/src/Location.h rename to software/firmware/archive/libraries/NeoGPS/src/Location.h diff --git a/software/firmware/libraries/NeoGPS/src/NMEAGPS.cpp b/software/firmware/archive/libraries/NeoGPS/src/NMEAGPS.cpp similarity index 100% rename from software/firmware/libraries/NeoGPS/src/NMEAGPS.cpp rename to software/firmware/archive/libraries/NeoGPS/src/NMEAGPS.cpp diff --git a/software/firmware/libraries/NeoGPS/src/NMEAGPS.h b/software/firmware/archive/libraries/NeoGPS/src/NMEAGPS.h similarity index 100% rename from software/firmware/libraries/NeoGPS/src/NMEAGPS.h rename to software/firmware/archive/libraries/NeoGPS/src/NMEAGPS.h diff --git a/software/firmware/libraries/NeoGPS/src/NMEAGPS_cfg.h b/software/firmware/archive/libraries/NeoGPS/src/NMEAGPS_cfg.h similarity index 100% rename from software/firmware/libraries/NeoGPS/src/NMEAGPS_cfg.h rename to software/firmware/archive/libraries/NeoGPS/src/NMEAGPS_cfg.h diff --git a/software/firmware/libraries/NeoGPS/src/NMEAGPSprivate.h b/software/firmware/archive/libraries/NeoGPS/src/NMEAGPSprivate.h similarity index 100% rename from software/firmware/libraries/NeoGPS/src/NMEAGPSprivate.h rename to software/firmware/archive/libraries/NeoGPS/src/NMEAGPSprivate.h diff --git a/software/firmware/libraries/NeoGPS/src/NeoGPS_cfg.h b/software/firmware/archive/libraries/NeoGPS/src/NeoGPS_cfg.h similarity index 100% rename from software/firmware/libraries/NeoGPS/src/NeoGPS_cfg.h rename to software/firmware/archive/libraries/NeoGPS/src/NeoGPS_cfg.h diff --git a/software/firmware/libraries/NeoGPS/src/NeoTime.cpp b/software/firmware/archive/libraries/NeoGPS/src/NeoTime.cpp similarity index 100% rename from software/firmware/libraries/NeoGPS/src/NeoTime.cpp rename to software/firmware/archive/libraries/NeoGPS/src/NeoTime.cpp diff --git a/software/firmware/libraries/NeoGPS/src/NeoTime.h b/software/firmware/archive/libraries/NeoGPS/src/NeoTime.h similarity index 100% rename from software/firmware/libraries/NeoGPS/src/NeoTime.h rename to software/firmware/archive/libraries/NeoGPS/src/NeoTime.h diff --git a/software/firmware/libraries/NeoGPS/src/Streamers.cpp b/software/firmware/archive/libraries/NeoGPS/src/Streamers.cpp similarity index 100% rename from software/firmware/libraries/NeoGPS/src/Streamers.cpp rename to software/firmware/archive/libraries/NeoGPS/src/Streamers.cpp diff --git a/software/firmware/libraries/NeoGPS/src/Streamers.h b/software/firmware/archive/libraries/NeoGPS/src/Streamers.h similarity index 100% rename from software/firmware/libraries/NeoGPS/src/Streamers.h rename to software/firmware/archive/libraries/NeoGPS/src/Streamers.h diff --git a/software/firmware/libraries/NeoGPS/src/ublox/ubxGPS.cpp b/software/firmware/archive/libraries/NeoGPS/src/ublox/ubxGPS.cpp similarity index 100% rename from software/firmware/libraries/NeoGPS/src/ublox/ubxGPS.cpp rename to software/firmware/archive/libraries/NeoGPS/src/ublox/ubxGPS.cpp diff --git a/software/firmware/libraries/NeoGPS/src/ublox/ubxGPS.h b/software/firmware/archive/libraries/NeoGPS/src/ublox/ubxGPS.h similarity index 100% rename from software/firmware/libraries/NeoGPS/src/ublox/ubxGPS.h rename to software/firmware/archive/libraries/NeoGPS/src/ublox/ubxGPS.h diff --git a/software/firmware/libraries/NeoGPS/src/ublox/ubxNMEA.cpp b/software/firmware/archive/libraries/NeoGPS/src/ublox/ubxNMEA.cpp similarity index 100% rename from software/firmware/libraries/NeoGPS/src/ublox/ubxNMEA.cpp rename to software/firmware/archive/libraries/NeoGPS/src/ublox/ubxNMEA.cpp diff --git a/software/firmware/libraries/NeoGPS/src/ublox/ubxNMEA.h b/software/firmware/archive/libraries/NeoGPS/src/ublox/ubxNMEA.h similarity index 100% rename from software/firmware/libraries/NeoGPS/src/ublox/ubxNMEA.h rename to software/firmware/archive/libraries/NeoGPS/src/ublox/ubxNMEA.h diff --git a/software/firmware/libraries/NeoGPS/src/ublox/ubx_cfg.h b/software/firmware/archive/libraries/NeoGPS/src/ublox/ubx_cfg.h similarity index 100% rename from software/firmware/libraries/NeoGPS/src/ublox/ubx_cfg.h rename to software/firmware/archive/libraries/NeoGPS/src/ublox/ubx_cfg.h diff --git a/software/firmware/libraries/NeoGPS/src/ublox/ubxmsg.cpp b/software/firmware/archive/libraries/NeoGPS/src/ublox/ubxmsg.cpp similarity index 100% rename from software/firmware/libraries/NeoGPS/src/ublox/ubxmsg.cpp rename to software/firmware/archive/libraries/NeoGPS/src/ublox/ubxmsg.cpp diff --git a/software/firmware/libraries/NeoGPS/src/ublox/ubxmsg.h b/software/firmware/archive/libraries/NeoGPS/src/ublox/ubxmsg.h similarity index 100% rename from software/firmware/libraries/NeoGPS/src/ublox/ubxmsg.h rename to software/firmware/archive/libraries/NeoGPS/src/ublox/ubxmsg.h diff --git a/software/firmware/libraries/SBUS/README.md b/software/firmware/archive/libraries/SBUS/README.md similarity index 100% rename from software/firmware/libraries/SBUS/README.md rename to software/firmware/archive/libraries/SBUS/README.md diff --git a/software/firmware/libraries/SBUS/SBUS.cpp b/software/firmware/archive/libraries/SBUS/SBUS.cpp similarity index 100% rename from software/firmware/libraries/SBUS/SBUS.cpp rename to software/firmware/archive/libraries/SBUS/SBUS.cpp diff --git a/software/firmware/libraries/SBUS/SBUS.h b/software/firmware/archive/libraries/SBUS/SBUS.h similarity index 100% rename from software/firmware/libraries/SBUS/SBUS.h rename to software/firmware/archive/libraries/SBUS/SBUS.h diff --git a/software/firmware/libraries/SBUS/docs/bit-mapping.ods b/software/firmware/archive/libraries/SBUS/docs/bit-mapping.ods similarity index 100% rename from software/firmware/libraries/SBUS/docs/bit-mapping.ods rename to software/firmware/archive/libraries/SBUS/docs/bit-mapping.ods diff --git a/software/firmware/libraries/SBUS/docs/bit-mapping.pdf b/software/firmware/archive/libraries/SBUS/docs/bit-mapping.pdf similarity index 100% rename from software/firmware/libraries/SBUS/docs/bit-mapping.pdf rename to software/firmware/archive/libraries/SBUS/docs/bit-mapping.pdf diff --git a/software/firmware/libraries/SBUS/examples/AIN_SBUS_example/AIN_SBUS_example.ino b/software/firmware/archive/libraries/SBUS/examples/AIN_SBUS_example/AIN_SBUS_example.ino similarity index 100% rename from software/firmware/libraries/SBUS/examples/AIN_SBUS_example/AIN_SBUS_example.ino rename to software/firmware/archive/libraries/SBUS/examples/AIN_SBUS_example/AIN_SBUS_example.ino diff --git a/software/firmware/libraries/SBUS/examples/SBUS_example/SBUS_example.ino b/software/firmware/archive/libraries/SBUS/examples/SBUS_example/SBUS_example.ino similarity index 100% rename from software/firmware/libraries/SBUS/examples/SBUS_example/SBUS_example.ino rename to software/firmware/archive/libraries/SBUS/examples/SBUS_example/SBUS_example.ino diff --git a/software/firmware/libraries/SBUS/keywords.txt b/software/firmware/archive/libraries/SBUS/keywords.txt similarity index 100% rename from software/firmware/libraries/SBUS/keywords.txt rename to software/firmware/archive/libraries/SBUS/keywords.txt diff --git a/software/firmware/libraries/i2c_t3-master/README.md b/software/firmware/archive/libraries/i2c_t3-master/README.md similarity index 100% rename from software/firmware/libraries/i2c_t3-master/README.md rename to software/firmware/archive/libraries/i2c_t3-master/README.md diff --git a/software/firmware/libraries/i2c_t3-master/archive/README.md b/software/firmware/archive/libraries/i2c_t3-master/archive/README.md similarity index 100% rename from software/firmware/libraries/i2c_t3-master/archive/README.md rename to software/firmware/archive/libraries/i2c_t3-master/archive/README.md diff --git a/software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v01.zip b/software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v01.zip similarity index 100% rename from software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v01.zip rename to software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v01.zip diff --git a/software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v02.zip b/software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v02.zip similarity index 100% rename from software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v02.zip rename to software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v02.zip diff --git a/software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v03.zip b/software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v03.zip similarity index 100% rename from software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v03.zip rename to software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v03.zip diff --git a/software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v04.zip b/software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v04.zip similarity index 100% rename from software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v04.zip rename to software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v04.zip diff --git a/software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v05.zip b/software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v05.zip similarity index 100% rename from software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v05.zip rename to software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v05.zip diff --git a/software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v06b.zip b/software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v06b.zip similarity index 100% rename from software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v06b.zip rename to software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v06b.zip diff --git a/software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v07.zip b/software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v07.zip similarity index 100% rename from software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v07.zip rename to software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v07.zip diff --git a/software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v08.zip b/software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v08.zip similarity index 100% rename from software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v08.zip rename to software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v08.zip diff --git a/software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v08_1.zip b/software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v08_1.zip similarity index 100% rename from software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v08_1.zip rename to software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v08_1.zip diff --git a/software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v09.zip b/software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v09.zip similarity index 100% rename from software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v09.zip rename to software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v09.zip diff --git a/software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v09_1.zip b/software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v09_1.zip similarity index 100% rename from software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v09_1.zip rename to software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v09_1.zip diff --git a/software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v09_2.zip b/software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v09_2.zip similarity index 100% rename from software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v09_2.zip rename to software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v09_2.zip diff --git a/software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v09_3.zip b/software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v09_3.zip similarity index 100% rename from software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v09_3.zip rename to software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v09_3.zip diff --git a/software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v09_4.zip b/software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v09_4.zip similarity index 100% rename from software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v09_4.zip rename to software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v09_4.zip diff --git a/software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v10_0.zip b/software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v10_0.zip similarity index 100% rename from software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v10_0.zip rename to software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v10_0.zip diff --git a/software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v10_1.zip b/software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v10_1.zip similarity index 100% rename from software/firmware/libraries/i2c_t3-master/archive/i2c_t3_lib_v10_1.zip rename to software/firmware/archive/libraries/i2c_t3-master/archive/i2c_t3_lib_v10_1.zip diff --git a/software/firmware/libraries/i2c_t3-master/examples/advanced_loopback/advanced_loopback.ino b/software/firmware/archive/libraries/i2c_t3-master/examples/advanced_loopback/advanced_loopback.ino similarity index 99% rename from software/firmware/libraries/i2c_t3-master/examples/advanced_loopback/advanced_loopback.ino rename to software/firmware/archive/libraries/i2c_t3-master/examples/advanced_loopback/advanced_loopback.ino index ed100fe..8824451 100644 --- a/software/firmware/libraries/i2c_t3-master/examples/advanced_loopback/advanced_loopback.ino +++ b/software/firmware/archive/libraries/i2c_t3-master/examples/advanced_loopback/advanced_loopback.ino @@ -241,4 +241,4 @@ void printStatus(i2c_status status) default: Serial.print("I2C busy\n"); break; } } - + diff --git a/software/firmware/libraries/i2c_t3-master/examples/advanced_master/advanced_master.ino b/software/firmware/archive/libraries/i2c_t3-master/examples/advanced_master/advanced_master.ino similarity index 99% rename from software/firmware/libraries/i2c_t3-master/examples/advanced_master/advanced_master.ino rename to software/firmware/archive/libraries/i2c_t3-master/examples/advanced_master/advanced_master.ino index 08042a6..f84d023 100644 --- a/software/firmware/libraries/i2c_t3-master/examples/advanced_master/advanced_master.ino +++ b/software/firmware/archive/libraries/i2c_t3-master/examples/advanced_master/advanced_master.ino @@ -530,4 +530,4 @@ void test_rate(uint8_t target, uint32_t rate, uint8_t& fail) print_i2c_status(); } } -} +} diff --git a/software/firmware/libraries/i2c_t3-master/examples/advanced_scanner/advanced_scanner.ino b/software/firmware/archive/libraries/i2c_t3-master/examples/advanced_scanner/advanced_scanner.ino similarity index 99% rename from software/firmware/libraries/i2c_t3-master/examples/advanced_scanner/advanced_scanner.ino rename to software/firmware/archive/libraries/i2c_t3-master/examples/advanced_scanner/advanced_scanner.ino index 1b3fff7..a13eefe 100644 --- a/software/firmware/libraries/i2c_t3-master/examples/advanced_scanner/advanced_scanner.ino +++ b/software/firmware/archive/libraries/i2c_t3-master/examples/advanced_scanner/advanced_scanner.ino @@ -172,4 +172,4 @@ void print_scan_status(struct i2cStruct* i2c, uint8_t target, uint8_t& found, ui default: break; } } - + diff --git a/software/firmware/libraries/i2c_t3-master/examples/advanced_slave/advanced_slave.ino b/software/firmware/archive/libraries/i2c_t3-master/examples/advanced_slave/advanced_slave.ino similarity index 99% rename from software/firmware/libraries/i2c_t3-master/examples/advanced_slave/advanced_slave.ino rename to software/firmware/archive/libraries/i2c_t3-master/examples/advanced_slave/advanced_slave.ino index 8784697..5fb6c01 100644 --- a/software/firmware/libraries/i2c_t3-master/examples/advanced_slave/advanced_slave.ino +++ b/software/firmware/archive/libraries/i2c_t3-master/examples/advanced_slave/advanced_slave.ino @@ -150,4 +150,4 @@ void requestEvent(void) break; } } - + diff --git a/software/firmware/libraries/i2c_t3-master/examples/basic_echo/basic_echo.ino b/software/firmware/archive/libraries/i2c_t3-master/examples/basic_echo/basic_echo.ino similarity index 99% rename from software/firmware/libraries/i2c_t3-master/examples/basic_echo/basic_echo.ino rename to software/firmware/archive/libraries/i2c_t3-master/examples/basic_echo/basic_echo.ino index 9a86261..b37f915 100644 --- a/software/firmware/libraries/i2c_t3-master/examples/basic_echo/basic_echo.ino +++ b/software/firmware/archive/libraries/i2c_t3-master/examples/basic_echo/basic_echo.ino @@ -92,4 +92,4 @@ void requestEvent(void) { Wire1.write(databuf, MEM_LEN); // fill Tx buffer (send full mem) } - + diff --git a/software/firmware/libraries/i2c_t3-master/examples/basic_interrupt/basic_interrupt.ino b/software/firmware/archive/libraries/i2c_t3-master/examples/basic_interrupt/basic_interrupt.ino similarity index 99% rename from software/firmware/libraries/i2c_t3-master/examples/basic_interrupt/basic_interrupt.ino rename to software/firmware/archive/libraries/i2c_t3-master/examples/basic_interrupt/basic_interrupt.ino index 84cf82f..01e3001 100644 --- a/software/firmware/libraries/i2c_t3-master/examples/basic_interrupt/basic_interrupt.ino +++ b/software/firmware/archive/libraries/i2c_t3-master/examples/basic_interrupt/basic_interrupt.ino @@ -83,4 +83,4 @@ void rwSlave(void) } digitalWrite(LED_BUILTIN,LOW); -} +} diff --git a/software/firmware/libraries/i2c_t3-master/examples/basic_master/basic_master.ino b/software/firmware/archive/libraries/i2c_t3-master/examples/basic_master/basic_master.ino similarity index 99% rename from software/firmware/libraries/i2c_t3-master/examples/basic_master/basic_master.ino rename to software/firmware/archive/libraries/i2c_t3-master/examples/basic_master/basic_master.ino index 3b47d75..ebd7321 100644 --- a/software/firmware/libraries/i2c_t3-master/examples/basic_master/basic_master.ino +++ b/software/firmware/archive/libraries/i2c_t3-master/examples/basic_master/basic_master.ino @@ -95,4 +95,4 @@ void loop() delay(100); // Delay to space out tests } } - + diff --git a/software/firmware/libraries/i2c_t3-master/examples/basic_master_callback/basic_master_callback.ino b/software/firmware/archive/libraries/i2c_t3-master/examples/basic_master_callback/basic_master_callback.ino similarity index 99% rename from software/firmware/libraries/i2c_t3-master/examples/basic_master_callback/basic_master_callback.ino rename to software/firmware/archive/libraries/i2c_t3-master/examples/basic_master_callback/basic_master_callback.ino index 46592c8..21278a5 100644 --- a/software/firmware/libraries/i2c_t3-master/examples/basic_master_callback/basic_master_callback.ino +++ b/software/firmware/archive/libraries/i2c_t3-master/examples/basic_master_callback/basic_master_callback.ino @@ -165,4 +165,4 @@ void errorEvent(void) case I2C_DMA_ERR: Serial.print("DMA Error\n"); break; default: break; } -} +} diff --git a/software/firmware/libraries/i2c_t3-master/examples/basic_master_mux/basic_master_mux.ino b/software/firmware/archive/libraries/i2c_t3-master/examples/basic_master_mux/basic_master_mux.ino similarity index 99% rename from software/firmware/libraries/i2c_t3-master/examples/basic_master_mux/basic_master_mux.ino rename to software/firmware/archive/libraries/i2c_t3-master/examples/basic_master_mux/basic_master_mux.ino index 57a8466..86d5c73 100644 --- a/software/firmware/libraries/i2c_t3-master/examples/basic_master_mux/basic_master_mux.ino +++ b/software/firmware/archive/libraries/i2c_t3-master/examples/basic_master_mux/basic_master_mux.ino @@ -84,4 +84,4 @@ void loop() delay(100); // Delay to space out tests } } - + diff --git a/software/firmware/libraries/i2c_t3-master/examples/basic_scanner/basic_scanner.ino b/software/firmware/archive/libraries/i2c_t3-master/examples/basic_scanner/basic_scanner.ino similarity index 99% rename from software/firmware/libraries/i2c_t3-master/examples/basic_scanner/basic_scanner.ino rename to software/firmware/archive/libraries/i2c_t3-master/examples/basic_scanner/basic_scanner.ino index 8068ea7..39f9eb1 100644 --- a/software/firmware/libraries/i2c_t3-master/examples/basic_scanner/basic_scanner.ino +++ b/software/firmware/archive/libraries/i2c_t3-master/examples/basic_scanner/basic_scanner.ino @@ -75,4 +75,4 @@ void print_scan_status(uint8_t target, uint8_t all) break; } } - + diff --git a/software/firmware/libraries/i2c_t3-master/examples/basic_slave/basic_slave.ino b/software/firmware/archive/libraries/i2c_t3-master/examples/basic_slave/basic_slave.ino similarity index 99% rename from software/firmware/libraries/i2c_t3-master/examples/basic_slave/basic_slave.ino rename to software/firmware/archive/libraries/i2c_t3-master/examples/basic_slave/basic_slave.ino index f382de5..c71dd65 100644 --- a/software/firmware/libraries/i2c_t3-master/examples/basic_slave/basic_slave.ino +++ b/software/firmware/archive/libraries/i2c_t3-master/examples/basic_slave/basic_slave.ino @@ -70,4 +70,4 @@ void requestEvent(void) { Wire.write(databuf, MEM_LEN); // fill Tx buffer (send full mem) } - + diff --git a/software/firmware/libraries/i2c_t3-master/examples/basic_slave_range/basic_slave_range.ino b/software/firmware/archive/libraries/i2c_t3-master/examples/basic_slave_range/basic_slave_range.ino similarity index 99% rename from software/firmware/libraries/i2c_t3-master/examples/basic_slave_range/basic_slave_range.ino rename to software/firmware/archive/libraries/i2c_t3-master/examples/basic_slave_range/basic_slave_range.ino index d55be0f..f3aa9c5 100644 --- a/software/firmware/libraries/i2c_t3-master/examples/basic_slave_range/basic_slave_range.ino +++ b/software/firmware/archive/libraries/i2c_t3-master/examples/basic_slave_range/basic_slave_range.ino @@ -77,4 +77,4 @@ void requestEvent(void) { Wire.write(databuf, MEM_LEN); // fill Tx buffer (send full mem) } - + diff --git a/software/firmware/libraries/i2c_t3-master/i2c_t3.cpp b/software/firmware/archive/libraries/i2c_t3-master/i2c_t3.cpp similarity index 100% rename from software/firmware/libraries/i2c_t3-master/i2c_t3.cpp rename to software/firmware/archive/libraries/i2c_t3-master/i2c_t3.cpp diff --git a/software/firmware/libraries/i2c_t3-master/i2c_t3.h b/software/firmware/archive/libraries/i2c_t3-master/i2c_t3.h similarity index 100% rename from software/firmware/libraries/i2c_t3-master/i2c_t3.h rename to software/firmware/archive/libraries/i2c_t3-master/i2c_t3.h diff --git a/software/firmware/libraries/i2c_t3-master/keywords.txt b/software/firmware/archive/libraries/i2c_t3-master/keywords.txt similarity index 100% rename from software/firmware/libraries/i2c_t3-master/keywords.txt rename to software/firmware/archive/libraries/i2c_t3-master/keywords.txt diff --git a/software/firmware/libraries/i2c_t3-master/speedtest.jpg b/software/firmware/archive/libraries/i2c_t3-master/speedtest.jpg similarity index 100% rename from software/firmware/libraries/i2c_t3-master/speedtest.jpg rename to software/firmware/archive/libraries/i2c_t3-master/speedtest.jpg diff --git a/software/firmware/libraries/modbus/Doxyfile b/software/firmware/archive/libraries/modbus/Doxyfile similarity index 100% rename from software/firmware/libraries/modbus/Doxyfile rename to software/firmware/archive/libraries/modbus/Doxyfile diff --git a/software/firmware/libraries/modbus/LICENSE.md b/software/firmware/archive/libraries/modbus/LICENSE.md similarity index 100% rename from software/firmware/libraries/modbus/LICENSE.md rename to software/firmware/archive/libraries/modbus/LICENSE.md diff --git a/software/firmware/libraries/modbus/ModbusRtu.h b/software/firmware/archive/libraries/modbus/ModbusRtu.h similarity index 96% rename from software/firmware/libraries/modbus/ModbusRtu.h rename to software/firmware/archive/libraries/modbus/ModbusRtu.h index 693a3b2..ebea9fe 100644 --- a/software/firmware/libraries/modbus/ModbusRtu.h +++ b/software/firmware/archive/libraries/modbus/ModbusRtu.h @@ -1,1415 +1,1415 @@ -/** - * @file ModbusRtu.h - * @version 1.21 - * @date 2016.02.21 - * @author Samuel Marco i Armengol - * @contact sammarcoarmengol@gmail.com - * @contribution Helium6072 - * - * @description - * Arduino library for communicating with Modbus devices - * over RS232/USB/485 via RTU protocol. - * - * Further information: - * http://modbus.org/ - * http://modbus.org/docs/Modbus_over_serial_line_V1_02.pdf - * - * @license - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; version - * 2.1 of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * @defgroup setup Modbus Object Instantiation/Initialization - * @defgroup loop Modbus Object Management - * @defgroup buffer Modbus Buffer Management - * @defgroup discrete Modbus Function Codes for Discrete Coils/Inputs - * @defgroup register Modbus Function Codes for Holding/Input Registers - * - */ - -#ifndef ModbusRtu_H_ -#define ModbusRtu_H_ - -#include -#include "Arduino.h" -#include "Print.h" -#include - -/** - * @struct modbus_t - * @brief - * Master query structure: - * This includes all the necessary fields to make the Master generate a Modbus query. - * A Master may keep several of these structures and send them cyclically or - * use them according to program needs. - */ -typedef struct -{ - uint8_t u8id; /*!< Slave address between 1 and 247. 0 means broadcast */ - uint8_t u8fct; /*!< Function code: 1, 2, 3, 4, 5, 6, 15 or 16 */ - uint16_t u16RegAdd; /*!< Address of the first register to access at slave/s */ - uint16_t u16CoilsNo; /*!< Number of coils or registers to access */ - uint16_t *au16reg; /*!< Pointer to memory image in master */ -} -modbus_t; - -enum -{ - RESPONSE_SIZE = 6, - EXCEPTION_SIZE = 3, - CHECKSUM_SIZE = 2 -}; - -/** - * @enum MESSAGE - * @brief - * Indexes to telegram frame positions - */ -enum MESSAGE -{ - ID = 0, //!< ID field - FUNC, //!< Function code position - ADD_HI, //!< Address high byte - ADD_LO, //!< Address low byte - NB_HI, //!< Number of coils or registers high byte - NB_LO, //!< Number of coils or registers low byte - BYTE_CNT //!< byte counter -}; - -/** - * @enum MB_FC - * @brief - * Modbus function codes summary. - * These are the implement function codes either for Master or for Slave. - * - * @see also fctsupported - * @see also modbus_t - */ -enum MB_FC -{ - MB_FC_NONE = 0, /*!< null operator */ - MB_FC_READ_COILS = 1, /*!< FCT=1 -> read coils or digital outputs */ - MB_FC_READ_DISCRETE_INPUT = 2, /*!< FCT=2 -> read digital inputs */ - MB_FC_READ_REGISTERS = 3, /*!< FCT=3 -> read registers or analog outputs */ - MB_FC_READ_INPUT_REGISTER = 4, /*!< FCT=4 -> read analog inputs */ - MB_FC_WRITE_COIL = 5, /*!< FCT=5 -> write single coil or output */ - MB_FC_WRITE_REGISTER = 6, /*!< FCT=6 -> write single register */ - MB_FC_WRITE_MULTIPLE_COILS = 15, /*!< FCT=15 -> write multiple coils or outputs */ - MB_FC_WRITE_MULTIPLE_REGISTERS = 16 /*!< FCT=16 -> write multiple registers */ -}; - -enum COM_STATES -{ - COM_IDLE = 0, - COM_WAITING = 1 - -}; - -enum ERR_LIST -{ - ERR_NOT_MASTER = -1, - ERR_POLLING = -2, - ERR_BUFF_OVERFLOW = -3, - ERR_BAD_CRC = -4, - ERR_EXCEPTION = -5 -}; - -enum -{ - NO_REPLY = 255, - EXC_FUNC_CODE = 1, - EXC_ADDR_RANGE = 2, - EXC_REGS_QUANT = 3, - EXC_EXECUTE = 4 -}; - -const unsigned char fctsupported[] = -{ - MB_FC_READ_COILS, - MB_FC_READ_DISCRETE_INPUT, - MB_FC_READ_REGISTERS, - MB_FC_READ_INPUT_REGISTER, - MB_FC_WRITE_COIL, - MB_FC_WRITE_REGISTER, - MB_FC_WRITE_MULTIPLE_COILS, - MB_FC_WRITE_MULTIPLE_REGISTERS -}; - -#define T35 5 -#define MAX_BUFFER 64 //!< maximum size for the communication buffer in bytes - -/** - * @class Modbus - * @brief - * Arduino class library for communicating with Modbus devices over - * USB/RS232/485 (via RTU protocol). - */ -class Modbus -{ -private: - HardwareSerial *port; //!< Pointer to Serial class object - SoftwareSerial *softPort; //!< Pointer to SoftwareSerial class object - uint8_t u8id; //!< 0=master, 1..247=slave number - uint8_t u8serno; //!< serial port: 0-Serial, 1..3-Serial1..Serial3; 4: use software serial - uint8_t u8txenpin; //!< flow control pin: 0=USB or RS-232 mode, >0=RS-485 mode - uint8_t u8state; - uint8_t u8lastError; - uint8_t au8Buffer[MAX_BUFFER]; - uint8_t u8BufferSize; - uint8_t u8lastRec; - uint16_t *au16regs; - uint16_t u16InCnt, u16OutCnt, u16errCnt; - uint16_t u16timeOut; - uint32_t u32time, u32timeOut; - uint8_t u8regsize; - - void init(uint8_t u8id, uint8_t u8serno, uint8_t u8txenpin); - void init(uint8_t u8id); - void sendTxBuffer(); - int8_t getRxBuffer(); - uint16_t calcCRC(uint8_t u8length); - uint8_t validateAnswer(); - uint8_t validateRequest(); - void get_FC1(); - void get_FC3(); - int8_t process_FC1( uint16_t *regs, uint8_t u8size ); - int8_t process_FC3( uint16_t *regs, uint8_t u8size ); - int8_t process_FC5( uint16_t *regs, uint8_t u8size ); - int8_t process_FC6( uint16_t *regs, uint8_t u8size ); - int8_t process_FC15( uint16_t *regs, uint8_t u8size ); - int8_t process_FC16( uint16_t *regs, uint8_t u8size ); - void buildException( uint8_t u8exception ); // build exception message - -public: - Modbus(); - Modbus(uint8_t u8id, uint8_t u8serno); - Modbus(uint8_t u8id, uint8_t u8serno, uint8_t u8txenpin); - Modbus(uint8_t u8id); - void begin(long u32speed); - void begin(SoftwareSerial *sPort, long u32speed); - void begin(long u32speed, uint8_t u8config); - void begin(); - void setTimeOut( uint16_t u16timeout); //!begin(u32speed); - if (u8txenpin > 1) // pin 0 & pin 1 are reserved for RX/TX - { - // return RS485 transceiver to transmit mode - pinMode(u8txenpin, OUTPUT); - digitalWrite(u8txenpin, LOW); -#if defined(TEENSYDUINO) - port->transmitterEnable(u8txenpin); -#endif - } - - while(port->read() >= 0); - u8lastRec = u8BufferSize = 0; - u16InCnt = u16OutCnt = u16errCnt = 0; -} - -/** - * @brief - * Initialize class object. - * - * Sets up the software serial port using specified baud rate and SoftwareSerial object. - * Call once class has been instantiated, typically within setup(). - * - * @param speed *softPort, pointer to SoftwareSerial class object - * @param speed baud rate, in standard increments (300..115200) - * @ingroup setup - */ -void Modbus::begin(SoftwareSerial *sPort, long u32speed) -{ - - softPort=sPort; - - softPort->begin(u32speed); - - if (u8txenpin > 1) // pin 0 & pin 1 are reserved for RX/TX - { - // return RS485 transceiver to transmit mode - pinMode(u8txenpin, OUTPUT); - digitalWrite(u8txenpin, LOW); - } - - while(softPort->read() >= 0); - u8lastRec = u8BufferSize = 0; - u16InCnt = u16OutCnt = u16errCnt = 0; -} - -/** - * @brief - * Initialize class object. - * - * Sets up the serial port using specified baud rate. - * Call once class has been instantiated, typically within setup(). - * - * @see http://arduino.cc/en/Serial/Begin#.Uy4CJ6aKlHY - * @param speed baud rate, in standard increments (300..115200) - * @param config data frame settings (data length, parity and stop bits) - * @ingroup setup - */ -void Modbus::begin(long u32speed,uint8_t u8config) -{ - - switch( u8serno ) - { - case 1: - port = &Serial1; - break; - case 2: - port = &Serial2; - break; - case 3: - port = &Serial3; - break; - case 0: - default: - break; - } - - port->begin(u32speed, u8config); - if (u8txenpin > 1) // pin 0 & pin 1 are reserved for RX/TX - { - // return RS485 transceiver to transmit mode - pinMode(u8txenpin, OUTPUT); - digitalWrite(u8txenpin, LOW); - } - - while(port->read() >= 0); - u8lastRec = u8BufferSize = 0; - u16InCnt = u16OutCnt = u16errCnt = 0; -} - -/** - * @brief - * Initialize default class object. - * - * Sets up the serial port using 19200 baud. - * Call once class has been instantiated, typically within setup(). - * - * @overload Modbus::begin(uint16_t u16BaudRate) - * @ingroup setup - */ -void Modbus::begin() -{ - begin(19200); -} - -/** - * @brief - * Method to write a new slave ID address - * - * @param u8id new slave address between 1 and 247 - * @ingroup setup - */ -void Modbus::setID( uint8_t u8id) -{ - if (( u8id != 0) && (u8id <= 247)) - { - this->u8id = u8id; - } -} - -/** - * @brief - * Method to read current slave ID address - * - * @return u8id current slave address between 1 and 247 - * @ingroup setup - */ -uint8_t Modbus::getID() -{ - return this->u8id; -} - -/** - * @brief - * Initialize time-out parameter - * - * Call once class has been instantiated, typically within setup(). - * The time-out timer is reset each time that there is a successful communication - * between Master and Slave. It works for both. - * - * @param time-out value (ms) - * @ingroup setup - */ -void Modbus::setTimeOut( uint16_t u16timeOut) -{ - this->u16timeOut = u16timeOut; -} - -/** - * @brief - * Return communication Watchdog state. - * It could be usefull to reset outputs if the watchdog is fired. - * - * @return TRUE if millis() > u32timeOut - * @ingroup loop - */ -boolean Modbus::getTimeOutState() -{ - return (millis() > u32timeOut); -} - -/** - * @brief - * Get input messages counter value - * This can be useful to diagnose communication - * - * @return input messages counter - * @ingroup buffer - */ -uint16_t Modbus::getInCnt() -{ - return u16InCnt; -} - -/** - * @brief - * Get transmitted messages counter value - * This can be useful to diagnose communication - * - * @return transmitted messages counter - * @ingroup buffer - */ -uint16_t Modbus::getOutCnt() -{ - return u16OutCnt; -} - -/** - * @brief - * Get errors counter value - * This can be useful to diagnose communication - * - * @return errors counter - * @ingroup buffer - */ -uint16_t Modbus::getErrCnt() -{ - return u16errCnt; -} - -/** - * Get modbus master state - * - * @return = 0 IDLE, = 1 WAITING FOR ANSWER - * @ingroup buffer - */ -uint8_t Modbus::getState() -{ - return u8state; -} - -/** - * Get the last error in the protocol processor - * - * @returnreturn NO_REPLY = 255 Time-out - * @return EXC_FUNC_CODE = 1 Function code not available - * @return EXC_ADDR_RANGE = 2 Address beyond available space for Modbus registers - * @return EXC_REGS_QUANT = 3 Coils or registers number beyond the available space - * @ingroup buffer - */ -uint8_t Modbus::getLastError() -{ - return u8lastError; -} - -/** - * @brief - * *** Only Modbus Master *** - * Generate a query to an slave with a modbus_t telegram structure - * The Master must be in COM_IDLE mode. After it, its state would be COM_WAITING. - * This method has to be called only in loop() section. - * - * @see modbus_t - * @param modbus_t modbus telegram structure (id, fct, ...) - * @ingroup loop - * @todo finish function 15 - */ -int8_t Modbus::query( modbus_t telegram ) -{ - uint8_t u8regsno, u8bytesno; - if (u8id!=0) return -2; - if (u8state != COM_IDLE) return -1; - - if ((telegram.u8id==0) || (telegram.u8id>247)) return -3; - - au16regs = telegram.au16reg; - - // telegram header - au8Buffer[ ID ] = telegram.u8id; - au8Buffer[ FUNC ] = telegram.u8fct; - au8Buffer[ ADD_HI ] = highByte(telegram.u16RegAdd ); - au8Buffer[ ADD_LO ] = lowByte( telegram.u16RegAdd ); - - switch( telegram.u8fct ) - { - case MB_FC_READ_COILS: - case MB_FC_READ_DISCRETE_INPUT: - case MB_FC_READ_REGISTERS: - case MB_FC_READ_INPUT_REGISTER: - au8Buffer[ NB_HI ] = highByte(telegram.u16CoilsNo ); - au8Buffer[ NB_LO ] = lowByte( telegram.u16CoilsNo ); - u8BufferSize = 6; - break; - case MB_FC_WRITE_COIL: - au8Buffer[ NB_HI ] = ((au16regs[0] > 0) ? 0xff : 0); - au8Buffer[ NB_LO ] = 0; - u8BufferSize = 6; - break; - case MB_FC_WRITE_REGISTER: - au8Buffer[ NB_HI ] = highByte(au16regs[0]); - au8Buffer[ NB_LO ] = lowByte(au16regs[0]); - u8BufferSize = 6; - break; - case MB_FC_WRITE_MULTIPLE_COILS: // TODO: implement "sending coils" - u8regsno = telegram.u16CoilsNo / 16; - u8bytesno = u8regsno * 2; - if ((telegram.u16CoilsNo % 16) != 0) - { - u8bytesno++; - u8regsno++; - } - - au8Buffer[ NB_HI ] = highByte(telegram.u16CoilsNo ); - au8Buffer[ NB_LO ] = lowByte( telegram.u16CoilsNo ); - au8Buffer[ NB_LO+1 ] = u8bytesno; - u8BufferSize = 7; - - u8regsno = u8bytesno = 0; // now auxiliary registers - for (uint16_t i = 0; i < telegram.u16CoilsNo; i++) - { - - - } - break; - - case MB_FC_WRITE_MULTIPLE_REGISTERS: - au8Buffer[ NB_HI ] = highByte(telegram.u16CoilsNo ); - au8Buffer[ NB_LO ] = lowByte( telegram.u16CoilsNo ); - au8Buffer[ NB_LO+1 ] = (uint8_t) ( telegram.u16CoilsNo * 2 ); - u8BufferSize = 7; - - for (uint16_t i=0; i< telegram.u16CoilsNo; i++) - { - au8Buffer[ u8BufferSize ] = highByte( au16regs[ i ] ); - u8BufferSize++; - au8Buffer[ u8BufferSize ] = lowByte( au16regs[ i ] ); - u8BufferSize++; - } - break; - } - - sendTxBuffer(); - u8state = COM_WAITING; - return 0; -} - -/** - * @brief *** Only for Modbus Master *** - * This method checks if there is any incoming answer if pending. - * If there is no answer, it would change Master state to COM_IDLE. - * This method must be called only at loop section. - * Avoid any delay() function. - * - * Any incoming data would be redirected to au16regs pointer, - * as defined in its modbus_t query telegram. - * - * @params nothing - * @return errors counter - * @ingroup loop - */ -int8_t Modbus::poll() -{ - // check if there is any incoming frame - uint8_t u8current; - if(u8serno<4) - u8current = port->available(); - else - u8current = softPort->available(); - - if (millis() > u32timeOut) - { - u8state = COM_IDLE; - u8lastError = NO_REPLY; - u16errCnt++; - return 0; - } - - if (u8current == 0) return 0; - - // check T35 after frame end or still no frame end - if (u8current != u8lastRec) - { - u8lastRec = u8current; - u32time = millis() + T35; - return 0; - } - if (millis() < u32time) return 0; - - // transfer Serial buffer frame to auBuffer - u8lastRec = 0; - int8_t i8state = getRxBuffer(); - if (i8state < 7) - { - u8state = COM_IDLE; - u16errCnt++; - return i8state; - } - - // validate message: id, CRC, FCT, exception - uint8_t u8exception = validateAnswer(); - if (u8exception != 0) - { - u8state = COM_IDLE; - return u8exception; - } - - // process answer - switch( au8Buffer[ FUNC ] ) - { - case MB_FC_READ_COILS: - case MB_FC_READ_DISCRETE_INPUT: - // call get_FC1 to transfer the incoming message to au16regs buffer - get_FC1( ); - break; - case MB_FC_READ_INPUT_REGISTER: - case MB_FC_READ_REGISTERS : - // call get_FC3 to transfer the incoming message to au16regs buffer - get_FC3( ); - break; - case MB_FC_WRITE_COIL: - case MB_FC_WRITE_REGISTER : - case MB_FC_WRITE_MULTIPLE_COILS: - case MB_FC_WRITE_MULTIPLE_REGISTERS : - // nothing to do - break; - default: - break; - } - u8state = COM_IDLE; - return u8BufferSize; -} - -/** - * @brief - * *** Only for Modbus Slave *** - * This method checks if there is any incoming query - * Afterwards, it would shoot a validation routine plus a register query - * Avoid any delay() function !!!! - * After a successful frame between the Master and the Slave, the time-out timer is reset. - * - * @param *regs register table for communication exchange - * @param u8size size of the register table - * @return 0 if no query, 1..4 if communication error, >4 if correct query processed - * @ingroup loop - */ -int8_t Modbus::poll( uint16_t *regs, uint8_t u8size ) -{ - - au16regs = regs; - u8regsize = u8size; - uint8_t u8current; - - - // check if there is any incoming frame - if(u8serno<4) - u8current = port->available(); - else - u8current = softPort->available(); - - if (u8current == 0) return 0; - - // check T35 after frame end or still no frame end - if (u8current != u8lastRec) - { - u8lastRec = u8current; - u32time = millis() + T35; - return 0; - } - if (millis() < u32time) return 0; - - u8lastRec = 0; - int8_t i8state = getRxBuffer(); - u8lastError = i8state; - if (i8state < 7) return i8state; - - // check slave id - if (au8Buffer[ ID ] != u8id) return 0; - - u32timeOut = millis() + long(u16timeOut); - u8lastError = 0; - - // validate message: CRC, FCT, address and size - uint8_t u8exception = validateRequest(); - if (u8exception > 0) - { - if (u8exception != NO_REPLY) - { - buildException( u8exception ); - sendTxBuffer(); - } - u8lastError = u8exception; - return u8exception; - } - - - - // process message - switch( au8Buffer[ FUNC ] ) - { - case MB_FC_READ_COILS: - case MB_FC_READ_DISCRETE_INPUT: - return process_FC1( regs, u8size ); - break; - case MB_FC_READ_INPUT_REGISTER: - case MB_FC_READ_REGISTERS : - return process_FC3( regs, u8size ); - break; - case MB_FC_WRITE_COIL: - return process_FC5( regs, u8size ); - break; - case MB_FC_WRITE_REGISTER : - return process_FC6( regs, u8size ); - break; - case MB_FC_WRITE_MULTIPLE_COILS: - return process_FC15( regs, u8size ); - break; - case MB_FC_WRITE_MULTIPLE_REGISTERS : - return process_FC16( regs, u8size ); - break; - default: - break; - } - - return i8state; -} - -/* _____PRIVATE FUNCTIONS_____________________________________________________ */ - -void Modbus::init(uint8_t u8id, uint8_t u8serno, uint8_t u8txenpin) -{ - this->u8id = u8id; - this->u8serno = (u8serno > 3) ? 0 : u8serno; - this->u8txenpin = u8txenpin; - this->u16timeOut = 1000; -} - -void Modbus::init(uint8_t u8id) -{ - this->u8id = u8id; - this->u8serno = 4; - this->u8txenpin = 0; - this->u16timeOut = 1000; -} - -/** - * @brief - * This method moves Serial buffer data to the Modbus au8Buffer. - * - * @return buffer size if OK, ERR_BUFF_OVERFLOW if u8BufferSize >= MAX_BUFFER - * @ingroup buffer - */ -int8_t Modbus::getRxBuffer() -{ - boolean bBuffOverflow = false; - - if (u8txenpin > 1) digitalWrite( u8txenpin, LOW ); - - u8BufferSize = 0; - if(u8serno<4) - while ( port->available() ) - { - au8Buffer[ u8BufferSize ] = port->read(); - u8BufferSize ++; - - if (u8BufferSize >= MAX_BUFFER) bBuffOverflow = true; - } - else - while ( softPort->available() ) - { - au8Buffer[ u8BufferSize ] = softPort->read(); - u8BufferSize ++; - - if (u8BufferSize >= MAX_BUFFER) bBuffOverflow = true; - } - u16InCnt++; - - if (bBuffOverflow) - { - u16errCnt++; - return ERR_BUFF_OVERFLOW; - } - return u8BufferSize; -} - -/** - * @brief - * This method transmits au8Buffer to Serial line. - * Only if u8txenpin != 0, there is a flow handling in order to keep - * the RS485 transceiver in output state as long as the message is being sent. - * This is done with UCSRxA register. - * The CRC is appended to the buffer before starting to send it. - * - * @param nothing - * @return nothing - * @ingroup buffer - */ -void Modbus::sendTxBuffer() -{ - //uint8_t i = 0; //unused - - // append CRC to message - uint16_t u16crc = calcCRC( u8BufferSize ); - au8Buffer[ u8BufferSize ] = u16crc >> 8; - u8BufferSize++; - au8Buffer[ u8BufferSize ] = u16crc & 0x00ff; - u8BufferSize++; - - // set RS485 transceiver to transmit mode - if (u8txenpin > 1) - { -#if defined(__AVR__) - switch( u8serno ) - { -#if defined(UBRR1H) - case 1: - UCSR1A=UCSR1A |(1 << TXC1); - break; -#endif - -#if defined(UBRR2H) - case 2: - UCSR2A=UCSR2A |(1 << TXC2); - break; -#endif - -#if defined(UBRR3H) - case 3: - UCSR3A=UCSR3A |(1 << TXC3); - break; -#endif - case 0: - default: - UCSR0A=UCSR0A |(1 << TXC0); - break; - } - digitalWrite( u8txenpin, HIGH ); -#endif - } - - // transfer buffer to serial line - if(u8serno<4) - port->write( au8Buffer, u8BufferSize ); - else - softPort->write( au8Buffer, u8BufferSize ); - - // keep RS485 transceiver in transmit mode as long as sending - if (u8txenpin > 1) - { -#if defined(__AVR__) - switch( u8serno ) - { -#if defined(UBRR1H) - case 1: - while (!(UCSR1A & (1 << TXC1))); - break; -#endif - -#if defined(UBRR2H) - case 2: - while (!(UCSR2A & (1 << TXC2))); - break; -#endif - -#if defined(UBRR3H) - case 3: - while (!(UCSR3A & (1 << TXC3))); - break; -#endif - case 0: - default: - while (!(UCSR0A & (1 << TXC0))); - break; - } - - // return RS485 transceiver to receive mode - digitalWrite( u8txenpin, LOW ); -#endif - } - if(u8serno<4) - while(port->read() >= 0); - else - while(softPort->read() >= 0); - - u8BufferSize = 0; - - // set time-out for master - u32timeOut = millis() + (unsigned long) u16timeOut; - - // increase message counter - u16OutCnt++; -} - -/** - * @brief - * This method calculates CRC - * - * @return uint16_t calculated CRC value for the message - * @ingroup buffer - */ -uint16_t Modbus::calcCRC(uint8_t u8length) -{ - unsigned int temp, temp2, flag; - temp = 0xFFFF; - for (unsigned char i = 0; i < u8length; i++) - { - temp = temp ^ au8Buffer[i]; - for (unsigned char j = 1; j <= 8; j++) - { - flag = temp & 0x0001; - temp >>=1; - if (flag) - temp ^= 0xA001; - } - } - // Reverse byte order. - temp2 = temp >> 8; - temp = (temp << 8) | temp2; - temp &= 0xFFFF; - // the returned value is already swapped - // crcLo byte is first & crcHi byte is last - return temp; -} - -/** - * @brief - * This method validates slave incoming messages - * - * @return 0 if OK, EXCEPTION if anything fails - * @ingroup buffer - */ -uint8_t Modbus::validateRequest() -{ - // check message crc vs calculated crc - uint16_t u16MsgCRC = - ((au8Buffer[u8BufferSize - 2] << 8) - | au8Buffer[u8BufferSize - 1]); // combine the crc Low & High bytes - if ( calcCRC( u8BufferSize-2 ) != u16MsgCRC ) - { - u16errCnt ++; - return NO_REPLY; - } - - // check fct code - boolean isSupported = false; - for (uint8_t i = 0; i< sizeof( fctsupported ); i++) - { - if (fctsupported[i] == au8Buffer[FUNC]) - { - isSupported = 1; - break; - } - } - if (!isSupported) - { - u16errCnt ++; - return EXC_FUNC_CODE; - } - - // check start address & nb range - uint16_t u16regs = 0; - uint8_t u8regs; - switch ( au8Buffer[ FUNC ] ) - { - case MB_FC_READ_COILS: - case MB_FC_READ_DISCRETE_INPUT: - case MB_FC_WRITE_MULTIPLE_COILS: - u16regs = word( au8Buffer[ ADD_HI ], au8Buffer[ ADD_LO ]) / 16; - u16regs += word( au8Buffer[ NB_HI ], au8Buffer[ NB_LO ]) /16; - u8regs = (uint8_t) u16regs; - if (u8regs > u8regsize) return EXC_ADDR_RANGE; - break; - case MB_FC_WRITE_COIL: - u16regs = word( au8Buffer[ ADD_HI ], au8Buffer[ ADD_LO ]) / 16; - u8regs = (uint8_t) u16regs; - if (u8regs > u8regsize) return EXC_ADDR_RANGE; - break; - case MB_FC_WRITE_REGISTER : - u16regs = word( au8Buffer[ ADD_HI ], au8Buffer[ ADD_LO ]); - u8regs = (uint8_t) u16regs; - if (u8regs > u8regsize) return EXC_ADDR_RANGE; - break; - case MB_FC_READ_REGISTERS : - case MB_FC_READ_INPUT_REGISTER : - case MB_FC_WRITE_MULTIPLE_REGISTERS : - u16regs = word( au8Buffer[ ADD_HI ], au8Buffer[ ADD_LO ]); - u16regs += word( au8Buffer[ NB_HI ], au8Buffer[ NB_LO ]); - u8regs = (uint8_t) u16regs; - if (u8regs > u8regsize) return EXC_ADDR_RANGE; - break; - } - return 0; // OK, no exception code thrown -} - -/** - * @brief - * This method validates master incoming messages - * - * @return 0 if OK, EXCEPTION if anything fails - * @ingroup buffer - */ -uint8_t Modbus::validateAnswer() -{ - // check message crc vs calculated crc - uint16_t u16MsgCRC = - ((au8Buffer[u8BufferSize - 2] << 8) - | au8Buffer[u8BufferSize - 1]); // combine the crc Low & High bytes - if ( calcCRC( u8BufferSize-2 ) != u16MsgCRC ) - { - u16errCnt ++; - return NO_REPLY; - } - - // check exception - if ((au8Buffer[ FUNC ] & 0x80) != 0) - { - u16errCnt ++; - return ERR_EXCEPTION; - } - - // check fct code - boolean isSupported = false; - for (uint8_t i = 0; i< sizeof( fctsupported ); i++) - { - if (fctsupported[i] == au8Buffer[FUNC]) - { - isSupported = 1; - break; - } - } - if (!isSupported) - { - u16errCnt ++; - return EXC_FUNC_CODE; - } - - return 0; // OK, no exception code thrown -} - -/** - * @brief - * This method builds an exception message - * - * @ingroup buffer - */ -void Modbus::buildException( uint8_t u8exception ) -{ - uint8_t u8func = au8Buffer[ FUNC ]; // get the original FUNC code - - au8Buffer[ ID ] = u8id; - au8Buffer[ FUNC ] = u8func + 0x80; - au8Buffer[ 2 ] = u8exception; - u8BufferSize = EXCEPTION_SIZE; -} - -/** - * This method processes functions 1 & 2 (for master) - * This method puts the slave answer into master data buffer - * - * @ingroup register - * TODO: finish its implementation - */ -void Modbus::get_FC1() -{ - //uint8_t u8byte, i; - //u8byte = 0; - - // for (i=0; i< au8Buffer[ 2 ] /2; i++) { - // au16regs[ i ] = word( - // au8Buffer[ u8byte ], - // au8Buffer[ u8byte +1 ]); - // u8byte += 2; - // } -} - -/** - * This method processes functions 3 & 4 (for master) - * This method puts the slave answer into master data buffer - * - * @ingroup register - */ -void Modbus::get_FC3() -{ - uint8_t u8byte, i; - u8byte = 3; - - for (i=0; i< au8Buffer[ 2 ] /2; i++) - { - au16regs[ i ] = word( - au8Buffer[ u8byte ], - au8Buffer[ u8byte +1 ]); - u8byte += 2; - } -} - -/** - * @brief - * This method processes functions 1 & 2 - * This method reads a bit array and transfers it to the master - * - * @return u8BufferSize Response to master length - * @ingroup discrete - */ -int8_t Modbus::process_FC1( uint16_t *regs, uint8_t u8size ) -{ - uint8_t u8currentRegister, u8currentBit, u8bytesno, u8bitsno; - uint8_t u8CopyBufferSize; - uint16_t u16currentCoil, u16coil; - - // get the first and last coil from the message - uint16_t u16StartCoil = word( au8Buffer[ ADD_HI ], au8Buffer[ ADD_LO ] ); - uint16_t u16Coilno = word( au8Buffer[ NB_HI ], au8Buffer[ NB_LO ] ); - - // put the number of bytes in the outcoming message - u8bytesno = (uint8_t) (u16Coilno / 8); - if (u16Coilno % 8 != 0) u8bytesno ++; - au8Buffer[ ADD_HI ] = u8bytesno; - u8BufferSize = ADD_LO; - - // read each coil from the register map and put its value inside the outcoming message - u8bitsno = 0; - - for (u16currentCoil = 0; u16currentCoil < u16Coilno; u16currentCoil++) - { - u16coil = u16StartCoil + u16currentCoil; - u8currentRegister = (uint8_t) (u16coil / 16); - u8currentBit = (uint8_t) (u16coil % 16); - - bitWrite( - au8Buffer[ u8BufferSize ], - u8bitsno, - bitRead( regs[ u8currentRegister ], u8currentBit ) ); - u8bitsno ++; - - if (u8bitsno > 7) - { - u8bitsno = 0; - u8BufferSize++; - } - } - - // send outcoming message - if (u16Coilno % 8 != 0) u8BufferSize ++; - u8CopyBufferSize = u8BufferSize +2; - sendTxBuffer(); - return u8CopyBufferSize; -} - -/** - * @brief - * This method processes functions 3 & 4 - * This method reads a word array and transfers it to the master - * - * @return u8BufferSize Response to master length - * @ingroup register - */ -int8_t Modbus::process_FC3( uint16_t *regs, uint8_t u8size ) -{ - - uint8_t u8StartAdd = word( au8Buffer[ ADD_HI ], au8Buffer[ ADD_LO ] ); - uint8_t u8regsno = word( au8Buffer[ NB_HI ], au8Buffer[ NB_LO ] ); - uint8_t u8CopyBufferSize; - uint8_t i; - - au8Buffer[ 2 ] = u8regsno * 2; - u8BufferSize = 3; - - for (i = u8StartAdd; i < u8StartAdd + u8regsno; i++) - { - au8Buffer[ u8BufferSize ] = highByte(regs[i]); - u8BufferSize++; - au8Buffer[ u8BufferSize ] = lowByte(regs[i]); - u8BufferSize++; - } - u8CopyBufferSize = u8BufferSize +2; - sendTxBuffer(); - - return u8CopyBufferSize; -} - -/** - * @brief - * This method processes function 5 - * This method writes a value assigned by the master to a single bit - * - * @return u8BufferSize Response to master length - * @ingroup discrete - */ -int8_t Modbus::process_FC5( uint16_t *regs, uint8_t u8size ) -{ - uint8_t u8currentRegister, u8currentBit; - uint8_t u8CopyBufferSize; - uint16_t u16coil = word( au8Buffer[ ADD_HI ], au8Buffer[ ADD_LO ] ); - - // point to the register and its bit - u8currentRegister = (uint8_t) (u16coil / 16); - u8currentBit = (uint8_t) (u16coil % 16); - - // write to coil - bitWrite( - regs[ u8currentRegister ], - u8currentBit, - au8Buffer[ NB_HI ] == 0xff ); - - - // send answer to master - u8BufferSize = 6; - u8CopyBufferSize = u8BufferSize +2; - sendTxBuffer(); - - return u8CopyBufferSize; -} - -/** - * @brief - * This method processes function 6 - * This method writes a value assigned by the master to a single word - * - * @return u8BufferSize Response to master length - * @ingroup register - */ -int8_t Modbus::process_FC6( uint16_t *regs, uint8_t u8size ) -{ - - uint8_t u8add = word( au8Buffer[ ADD_HI ], au8Buffer[ ADD_LO ] ); - uint8_t u8CopyBufferSize; - uint16_t u16val = word( au8Buffer[ NB_HI ], au8Buffer[ NB_LO ] ); - - regs[ u8add ] = u16val; - - // keep the same header - u8BufferSize = RESPONSE_SIZE; - - u8CopyBufferSize = u8BufferSize +2; - sendTxBuffer(); - - return u8CopyBufferSize; -} - -/** - * @brief - * This method processes function 15 - * This method writes a bit array assigned by the master - * - * @return u8BufferSize Response to master length - * @ingroup discrete - */ -int8_t Modbus::process_FC15( uint16_t *regs, uint8_t u8size ) -{ - uint8_t u8currentRegister, u8currentBit, u8frameByte, u8bitsno; - uint8_t u8CopyBufferSize; - uint16_t u16currentCoil, u16coil; - boolean bTemp; - - // get the first and last coil from the message - uint16_t u16StartCoil = word( au8Buffer[ ADD_HI ], au8Buffer[ ADD_LO ] ); - uint16_t u16Coilno = word( au8Buffer[ NB_HI ], au8Buffer[ NB_LO ] ); - - - // read each coil from the register map and put its value inside the outcoming message - u8bitsno = 0; - u8frameByte = 7; - for (u16currentCoil = 0; u16currentCoil < u16Coilno; u16currentCoil++) - { - - u16coil = u16StartCoil + u16currentCoil; - u8currentRegister = (uint8_t) (u16coil / 16); - u8currentBit = (uint8_t) (u16coil % 16); - - bTemp = bitRead( - au8Buffer[ u8frameByte ], - u8bitsno ); - - bitWrite( - regs[ u8currentRegister ], - u8currentBit, - bTemp ); - - u8bitsno ++; - - if (u8bitsno > 7) - { - u8bitsno = 0; - u8frameByte++; - } - } - - // send outcoming message - // it's just a copy of the incomping frame until 6th byte - u8BufferSize = 6; - u8CopyBufferSize = u8BufferSize +2; - sendTxBuffer(); - return u8CopyBufferSize; -} - -/** - * @brief - * This method processes function 16 - * This method writes a word array assigned by the master - * - * @return u8BufferSize Response to master length - * @ingroup register - */ -int8_t Modbus::process_FC16( uint16_t *regs, uint8_t u8size ) -{ - //uint8_t u8func = au8Buffer[ FUNC ]; // get the original FUNC code - uint8_t u8StartAdd = au8Buffer[ ADD_HI ] << 8 | au8Buffer[ ADD_LO ]; - uint8_t u8regsno = au8Buffer[ NB_HI ] << 8 | au8Buffer[ NB_LO ]; - uint8_t u8CopyBufferSize; - uint8_t i; - uint16_t temp; - - // build header - au8Buffer[ NB_HI ] = 0; - au8Buffer[ NB_LO ] = u8regsno; - u8BufferSize = RESPONSE_SIZE; - - // write registers - for (i = 0; i < u8regsno; i++) - { - temp = word( - au8Buffer[ (BYTE_CNT + 1) + i * 2 ], - au8Buffer[ (BYTE_CNT + 2) + i * 2 ]); - - regs[ u8StartAdd + i ] = temp; - } - u8CopyBufferSize = u8BufferSize +2; - sendTxBuffer(); - - return u8CopyBufferSize; -} - -#endif // ModbusRtu_H_ +/** + * @file ModbusRtu.h + * @version 1.21 + * @date 2016.02.21 + * @author Samuel Marco i Armengol + * @contact sammarcoarmengol@gmail.com + * @contribution Helium6072 + * + * @description + * Arduino library for communicating with Modbus devices + * over RS232/USB/485 via RTU protocol. + * + * Further information: + * http://modbus.org/ + * http://modbus.org/docs/Modbus_over_serial_line_V1_02.pdf + * + * @license + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version + * 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * @defgroup setup Modbus Object Instantiation/Initialization + * @defgroup loop Modbus Object Management + * @defgroup buffer Modbus Buffer Management + * @defgroup discrete Modbus Function Codes for Discrete Coils/Inputs + * @defgroup register Modbus Function Codes for Holding/Input Registers + * + */ + +#ifndef ModbusRtu_H_ +#define ModbusRtu_H_ + +#include +#include "Arduino.h" +#include "Print.h" +#include + +/** + * @struct modbus_t + * @brief + * Master query structure: + * This includes all the necessary fields to make the Master generate a Modbus query. + * A Master may keep several of these structures and send them cyclically or + * use them according to program needs. + */ +typedef struct +{ + uint8_t u8id; /*!< Slave address between 1 and 247. 0 means broadcast */ + uint8_t u8fct; /*!< Function code: 1, 2, 3, 4, 5, 6, 15 or 16 */ + uint16_t u16RegAdd; /*!< Address of the first register to access at slave/s */ + uint16_t u16CoilsNo; /*!< Number of coils or registers to access */ + uint16_t *au16reg; /*!< Pointer to memory image in master */ +} +modbus_t; + +enum +{ + RESPONSE_SIZE = 6, + EXCEPTION_SIZE = 3, + CHECKSUM_SIZE = 2 +}; + +/** + * @enum MESSAGE + * @brief + * Indexes to telegram frame positions + */ +enum MESSAGE +{ + ID = 0, //!< ID field + FUNC, //!< Function code position + ADD_HI, //!< Address high byte + ADD_LO, //!< Address low byte + NB_HI, //!< Number of coils or registers high byte + NB_LO, //!< Number of coils or registers low byte + BYTE_CNT //!< byte counter +}; + +/** + * @enum MB_FC + * @brief + * Modbus function codes summary. + * These are the implement function codes either for Master or for Slave. + * + * @see also fctsupported + * @see also modbus_t + */ +enum MB_FC +{ + MB_FC_NONE = 0, /*!< null operator */ + MB_FC_READ_COILS = 1, /*!< FCT=1 -> read coils or digital outputs */ + MB_FC_READ_DISCRETE_INPUT = 2, /*!< FCT=2 -> read digital inputs */ + MB_FC_READ_REGISTERS = 3, /*!< FCT=3 -> read registers or analog outputs */ + MB_FC_READ_INPUT_REGISTER = 4, /*!< FCT=4 -> read analog inputs */ + MB_FC_WRITE_COIL = 5, /*!< FCT=5 -> write single coil or output */ + MB_FC_WRITE_REGISTER = 6, /*!< FCT=6 -> write single register */ + MB_FC_WRITE_MULTIPLE_COILS = 15, /*!< FCT=15 -> write multiple coils or outputs */ + MB_FC_WRITE_MULTIPLE_REGISTERS = 16 /*!< FCT=16 -> write multiple registers */ +}; + +enum COM_STATES +{ + COM_IDLE = 0, + COM_WAITING = 1 + +}; + +enum ERR_LIST +{ + ERR_NOT_MASTER = -1, + ERR_POLLING = -2, + ERR_BUFF_OVERFLOW = -3, + ERR_BAD_CRC = -4, + ERR_EXCEPTION = -5 +}; + +enum +{ + NO_REPLY = 255, + EXC_FUNC_CODE = 1, + EXC_ADDR_RANGE = 2, + EXC_REGS_QUANT = 3, + EXC_EXECUTE = 4 +}; + +const unsigned char fctsupported[] = +{ + MB_FC_READ_COILS, + MB_FC_READ_DISCRETE_INPUT, + MB_FC_READ_REGISTERS, + MB_FC_READ_INPUT_REGISTER, + MB_FC_WRITE_COIL, + MB_FC_WRITE_REGISTER, + MB_FC_WRITE_MULTIPLE_COILS, + MB_FC_WRITE_MULTIPLE_REGISTERS +}; + +#define T35 5 +#define MAX_BUFFER 64 //!< maximum size for the communication buffer in bytes + +/** + * @class Modbus + * @brief + * Arduino class library for communicating with Modbus devices over + * USB/RS232/485 (via RTU protocol). + */ +class Modbus +{ +private: + HardwareSerial *port; //!< Pointer to Serial class object + SoftwareSerial *softPort; //!< Pointer to SoftwareSerial class object + uint8_t u8id; //!< 0=master, 1..247=slave number + uint8_t u8serno; //!< serial port: 0-Serial, 1..3-Serial1..Serial3; 4: use software serial + uint8_t u8txenpin; //!< flow control pin: 0=USB or RS-232 mode, >0=RS-485 mode + uint8_t u8state; + uint8_t u8lastError; + uint8_t au8Buffer[MAX_BUFFER]; + uint8_t u8BufferSize; + uint8_t u8lastRec; + uint16_t *au16regs; + uint16_t u16InCnt, u16OutCnt, u16errCnt; + uint16_t u16timeOut; + uint32_t u32time, u32timeOut; + uint8_t u8regsize; + + void init(uint8_t u8id, uint8_t u8serno, uint8_t u8txenpin); + void init(uint8_t u8id); + void sendTxBuffer(); + int8_t getRxBuffer(); + uint16_t calcCRC(uint8_t u8length); + uint8_t validateAnswer(); + uint8_t validateRequest(); + void get_FC1(); + void get_FC3(); + int8_t process_FC1( uint16_t *regs, uint8_t u8size ); + int8_t process_FC3( uint16_t *regs, uint8_t u8size ); + int8_t process_FC5( uint16_t *regs, uint8_t u8size ); + int8_t process_FC6( uint16_t *regs, uint8_t u8size ); + int8_t process_FC15( uint16_t *regs, uint8_t u8size ); + int8_t process_FC16( uint16_t *regs, uint8_t u8size ); + void buildException( uint8_t u8exception ); // build exception message + +public: + Modbus(); + Modbus(uint8_t u8id, uint8_t u8serno); + Modbus(uint8_t u8id, uint8_t u8serno, uint8_t u8txenpin); + Modbus(uint8_t u8id); + void begin(long u32speed); + void begin(SoftwareSerial *sPort, long u32speed); + void begin(long u32speed, uint8_t u8config); + void begin(); + void setTimeOut( uint16_t u16timeout); //!begin(u32speed); + if (u8txenpin > 1) // pin 0 & pin 1 are reserved for RX/TX + { + // return RS485 transceiver to transmit mode + pinMode(u8txenpin, OUTPUT); + digitalWrite(u8txenpin, LOW); +#if defined(TEENSYDUINO) + port->transmitterEnable(u8txenpin); +#endif + } + + while(port->read() >= 0); + u8lastRec = u8BufferSize = 0; + u16InCnt = u16OutCnt = u16errCnt = 0; +} + +/** + * @brief + * Initialize class object. + * + * Sets up the software serial port using specified baud rate and SoftwareSerial object. + * Call once class has been instantiated, typically within setup(). + * + * @param speed *softPort, pointer to SoftwareSerial class object + * @param speed baud rate, in standard increments (300..115200) + * @ingroup setup + */ +void Modbus::begin(SoftwareSerial *sPort, long u32speed) +{ + + softPort=sPort; + + softPort->begin(u32speed); + + if (u8txenpin > 1) // pin 0 & pin 1 are reserved for RX/TX + { + // return RS485 transceiver to transmit mode + pinMode(u8txenpin, OUTPUT); + digitalWrite(u8txenpin, LOW); + } + + while(softPort->read() >= 0); + u8lastRec = u8BufferSize = 0; + u16InCnt = u16OutCnt = u16errCnt = 0; +} + +/** + * @brief + * Initialize class object. + * + * Sets up the serial port using specified baud rate. + * Call once class has been instantiated, typically within setup(). + * + * @see http://arduino.cc/en/Serial/Begin#.Uy4CJ6aKlHY + * @param speed baud rate, in standard increments (300..115200) + * @param config data frame settings (data length, parity and stop bits) + * @ingroup setup + */ +void Modbus::begin(long u32speed,uint8_t u8config) +{ + + switch( u8serno ) + { + case 1: + port = &Serial1; + break; + case 2: + port = &Serial2; + break; + case 3: + port = &Serial3; + break; + case 0: + default: + break; + } + + port->begin(u32speed, u8config); + if (u8txenpin > 1) // pin 0 & pin 1 are reserved for RX/TX + { + // return RS485 transceiver to transmit mode + pinMode(u8txenpin, OUTPUT); + digitalWrite(u8txenpin, LOW); + } + + while(port->read() >= 0); + u8lastRec = u8BufferSize = 0; + u16InCnt = u16OutCnt = u16errCnt = 0; +} + +/** + * @brief + * Initialize default class object. + * + * Sets up the serial port using 19200 baud. + * Call once class has been instantiated, typically within setup(). + * + * @overload Modbus::begin(uint16_t u16BaudRate) + * @ingroup setup + */ +void Modbus::begin() +{ + begin(19200); +} + +/** + * @brief + * Method to write a new slave ID address + * + * @param u8id new slave address between 1 and 247 + * @ingroup setup + */ +void Modbus::setID( uint8_t u8id) +{ + if (( u8id != 0) && (u8id <= 247)) + { + this->u8id = u8id; + } +} + +/** + * @brief + * Method to read current slave ID address + * + * @return u8id current slave address between 1 and 247 + * @ingroup setup + */ +uint8_t Modbus::getID() +{ + return this->u8id; +} + +/** + * @brief + * Initialize time-out parameter + * + * Call once class has been instantiated, typically within setup(). + * The time-out timer is reset each time that there is a successful communication + * between Master and Slave. It works for both. + * + * @param time-out value (ms) + * @ingroup setup + */ +void Modbus::setTimeOut( uint16_t u16timeOut) +{ + this->u16timeOut = u16timeOut; +} + +/** + * @brief + * Return communication Watchdog state. + * It could be usefull to reset outputs if the watchdog is fired. + * + * @return TRUE if millis() > u32timeOut + * @ingroup loop + */ +boolean Modbus::getTimeOutState() +{ + return (millis() > u32timeOut); +} + +/** + * @brief + * Get input messages counter value + * This can be useful to diagnose communication + * + * @return input messages counter + * @ingroup buffer + */ +uint16_t Modbus::getInCnt() +{ + return u16InCnt; +} + +/** + * @brief + * Get transmitted messages counter value + * This can be useful to diagnose communication + * + * @return transmitted messages counter + * @ingroup buffer + */ +uint16_t Modbus::getOutCnt() +{ + return u16OutCnt; +} + +/** + * @brief + * Get errors counter value + * This can be useful to diagnose communication + * + * @return errors counter + * @ingroup buffer + */ +uint16_t Modbus::getErrCnt() +{ + return u16errCnt; +} + +/** + * Get modbus master state + * + * @return = 0 IDLE, = 1 WAITING FOR ANSWER + * @ingroup buffer + */ +uint8_t Modbus::getState() +{ + return u8state; +} + +/** + * Get the last error in the protocol processor + * + * @returnreturn NO_REPLY = 255 Time-out + * @return EXC_FUNC_CODE = 1 Function code not available + * @return EXC_ADDR_RANGE = 2 Address beyond available space for Modbus registers + * @return EXC_REGS_QUANT = 3 Coils or registers number beyond the available space + * @ingroup buffer + */ +uint8_t Modbus::getLastError() +{ + return u8lastError; +} + +/** + * @brief + * *** Only Modbus Master *** + * Generate a query to an slave with a modbus_t telegram structure + * The Master must be in COM_IDLE mode. After it, its state would be COM_WAITING. + * This method has to be called only in loop() section. + * + * @see modbus_t + * @param modbus_t modbus telegram structure (id, fct, ...) + * @ingroup loop + * @todo finish function 15 + */ +int8_t Modbus::query( modbus_t telegram ) +{ + uint8_t u8regsno, u8bytesno; + if (u8id!=0) return -2; + if (u8state != COM_IDLE) return -1; + + if ((telegram.u8id==0) || (telegram.u8id>247)) return -3; + + au16regs = telegram.au16reg; + + // telegram header + au8Buffer[ ID ] = telegram.u8id; + au8Buffer[ FUNC ] = telegram.u8fct; + au8Buffer[ ADD_HI ] = highByte(telegram.u16RegAdd ); + au8Buffer[ ADD_LO ] = lowByte( telegram.u16RegAdd ); + + switch( telegram.u8fct ) + { + case MB_FC_READ_COILS: + case MB_FC_READ_DISCRETE_INPUT: + case MB_FC_READ_REGISTERS: + case MB_FC_READ_INPUT_REGISTER: + au8Buffer[ NB_HI ] = highByte(telegram.u16CoilsNo ); + au8Buffer[ NB_LO ] = lowByte( telegram.u16CoilsNo ); + u8BufferSize = 6; + break; + case MB_FC_WRITE_COIL: + au8Buffer[ NB_HI ] = ((au16regs[0] > 0) ? 0xff : 0); + au8Buffer[ NB_LO ] = 0; + u8BufferSize = 6; + break; + case MB_FC_WRITE_REGISTER: + au8Buffer[ NB_HI ] = highByte(au16regs[0]); + au8Buffer[ NB_LO ] = lowByte(au16regs[0]); + u8BufferSize = 6; + break; + case MB_FC_WRITE_MULTIPLE_COILS: // TODO: implement "sending coils" + u8regsno = telegram.u16CoilsNo / 16; + u8bytesno = u8regsno * 2; + if ((telegram.u16CoilsNo % 16) != 0) + { + u8bytesno++; + u8regsno++; + } + + au8Buffer[ NB_HI ] = highByte(telegram.u16CoilsNo ); + au8Buffer[ NB_LO ] = lowByte( telegram.u16CoilsNo ); + au8Buffer[ NB_LO+1 ] = u8bytesno; + u8BufferSize = 7; + + u8regsno = u8bytesno = 0; // now auxiliary registers + for (uint16_t i = 0; i < telegram.u16CoilsNo; i++) + { + + + } + break; + + case MB_FC_WRITE_MULTIPLE_REGISTERS: + au8Buffer[ NB_HI ] = highByte(telegram.u16CoilsNo ); + au8Buffer[ NB_LO ] = lowByte( telegram.u16CoilsNo ); + au8Buffer[ NB_LO+1 ] = (uint8_t) ( telegram.u16CoilsNo * 2 ); + u8BufferSize = 7; + + for (uint16_t i=0; i< telegram.u16CoilsNo; i++) + { + au8Buffer[ u8BufferSize ] = highByte( au16regs[ i ] ); + u8BufferSize++; + au8Buffer[ u8BufferSize ] = lowByte( au16regs[ i ] ); + u8BufferSize++; + } + break; + } + + sendTxBuffer(); + u8state = COM_WAITING; + return 0; +} + +/** + * @brief *** Only for Modbus Master *** + * This method checks if there is any incoming answer if pending. + * If there is no answer, it would change Master state to COM_IDLE. + * This method must be called only at loop section. + * Avoid any delay() function. + * + * Any incoming data would be redirected to au16regs pointer, + * as defined in its modbus_t query telegram. + * + * @params nothing + * @return errors counter + * @ingroup loop + */ +int8_t Modbus::poll() +{ + // check if there is any incoming frame + uint8_t u8current; + if(u8serno<4) + u8current = port->available(); + else + u8current = softPort->available(); + + if (millis() > u32timeOut) + { + u8state = COM_IDLE; + u8lastError = NO_REPLY; + u16errCnt++; + return 0; + } + + if (u8current == 0) return 0; + + // check T35 after frame end or still no frame end + if (u8current != u8lastRec) + { + u8lastRec = u8current; + u32time = millis() + T35; + return 0; + } + if (millis() < u32time) return 0; + + // transfer Serial buffer frame to auBuffer + u8lastRec = 0; + int8_t i8state = getRxBuffer(); + if (i8state < 7) + { + u8state = COM_IDLE; + u16errCnt++; + return i8state; + } + + // validate message: id, CRC, FCT, exception + uint8_t u8exception = validateAnswer(); + if (u8exception != 0) + { + u8state = COM_IDLE; + return u8exception; + } + + // process answer + switch( au8Buffer[ FUNC ] ) + { + case MB_FC_READ_COILS: + case MB_FC_READ_DISCRETE_INPUT: + // call get_FC1 to transfer the incoming message to au16regs buffer + get_FC1( ); + break; + case MB_FC_READ_INPUT_REGISTER: + case MB_FC_READ_REGISTERS : + // call get_FC3 to transfer the incoming message to au16regs buffer + get_FC3( ); + break; + case MB_FC_WRITE_COIL: + case MB_FC_WRITE_REGISTER : + case MB_FC_WRITE_MULTIPLE_COILS: + case MB_FC_WRITE_MULTIPLE_REGISTERS : + // nothing to do + break; + default: + break; + } + u8state = COM_IDLE; + return u8BufferSize; +} + +/** + * @brief + * *** Only for Modbus Slave *** + * This method checks if there is any incoming query + * Afterwards, it would shoot a validation routine plus a register query + * Avoid any delay() function !!!! + * After a successful frame between the Master and the Slave, the time-out timer is reset. + * + * @param *regs register table for communication exchange + * @param u8size size of the register table + * @return 0 if no query, 1..4 if communication error, >4 if correct query processed + * @ingroup loop + */ +int8_t Modbus::poll( uint16_t *regs, uint8_t u8size ) +{ + + au16regs = regs; + u8regsize = u8size; + uint8_t u8current; + + + // check if there is any incoming frame + if(u8serno<4) + u8current = port->available(); + else + u8current = softPort->available(); + + if (u8current == 0) return 0; + + // check T35 after frame end or still no frame end + if (u8current != u8lastRec) + { + u8lastRec = u8current; + u32time = millis() + T35; + return 0; + } + if (millis() < u32time) return 0; + + u8lastRec = 0; + int8_t i8state = getRxBuffer(); + u8lastError = i8state; + if (i8state < 7) return i8state; + + // check slave id + if (au8Buffer[ ID ] != u8id) return 0; + + u32timeOut = millis() + long(u16timeOut); + u8lastError = 0; + + // validate message: CRC, FCT, address and size + uint8_t u8exception = validateRequest(); + if (u8exception > 0) + { + if (u8exception != NO_REPLY) + { + buildException( u8exception ); + sendTxBuffer(); + } + u8lastError = u8exception; + return u8exception; + } + + + + // process message + switch( au8Buffer[ FUNC ] ) + { + case MB_FC_READ_COILS: + case MB_FC_READ_DISCRETE_INPUT: + return process_FC1( regs, u8size ); + break; + case MB_FC_READ_INPUT_REGISTER: + case MB_FC_READ_REGISTERS : + return process_FC3( regs, u8size ); + break; + case MB_FC_WRITE_COIL: + return process_FC5( regs, u8size ); + break; + case MB_FC_WRITE_REGISTER : + return process_FC6( regs, u8size ); + break; + case MB_FC_WRITE_MULTIPLE_COILS: + return process_FC15( regs, u8size ); + break; + case MB_FC_WRITE_MULTIPLE_REGISTERS : + return process_FC16( regs, u8size ); + break; + default: + break; + } + + return i8state; +} + +/* _____PRIVATE FUNCTIONS_____________________________________________________ */ + +void Modbus::init(uint8_t u8id, uint8_t u8serno, uint8_t u8txenpin) +{ + this->u8id = u8id; + this->u8serno = (u8serno > 3) ? 0 : u8serno; + this->u8txenpin = u8txenpin; + this->u16timeOut = 1000; +} + +void Modbus::init(uint8_t u8id) +{ + this->u8id = u8id; + this->u8serno = 4; + this->u8txenpin = 0; + this->u16timeOut = 1000; +} + +/** + * @brief + * This method moves Serial buffer data to the Modbus au8Buffer. + * + * @return buffer size if OK, ERR_BUFF_OVERFLOW if u8BufferSize >= MAX_BUFFER + * @ingroup buffer + */ +int8_t Modbus::getRxBuffer() +{ + boolean bBuffOverflow = false; + + if (u8txenpin > 1) digitalWrite( u8txenpin, LOW ); + + u8BufferSize = 0; + if(u8serno<4) + while ( port->available() ) + { + au8Buffer[ u8BufferSize ] = port->read(); + u8BufferSize ++; + + if (u8BufferSize >= MAX_BUFFER) bBuffOverflow = true; + } + else + while ( softPort->available() ) + { + au8Buffer[ u8BufferSize ] = softPort->read(); + u8BufferSize ++; + + if (u8BufferSize >= MAX_BUFFER) bBuffOverflow = true; + } + u16InCnt++; + + if (bBuffOverflow) + { + u16errCnt++; + return ERR_BUFF_OVERFLOW; + } + return u8BufferSize; +} + +/** + * @brief + * This method transmits au8Buffer to Serial line. + * Only if u8txenpin != 0, there is a flow handling in order to keep + * the RS485 transceiver in output state as long as the message is being sent. + * This is done with UCSRxA register. + * The CRC is appended to the buffer before starting to send it. + * + * @param nothing + * @return nothing + * @ingroup buffer + */ +void Modbus::sendTxBuffer() +{ + //uint8_t i = 0; //unused + + // append CRC to message + uint16_t u16crc = calcCRC( u8BufferSize ); + au8Buffer[ u8BufferSize ] = u16crc >> 8; + u8BufferSize++; + au8Buffer[ u8BufferSize ] = u16crc & 0x00ff; + u8BufferSize++; + + // set RS485 transceiver to transmit mode + if (u8txenpin > 1) + { +#if defined(__AVR__) + switch( u8serno ) + { +#if defined(UBRR1H) + case 1: + UCSR1A=UCSR1A |(1 << TXC1); + break; +#endif + +#if defined(UBRR2H) + case 2: + UCSR2A=UCSR2A |(1 << TXC2); + break; +#endif + +#if defined(UBRR3H) + case 3: + UCSR3A=UCSR3A |(1 << TXC3); + break; +#endif + case 0: + default: + UCSR0A=UCSR0A |(1 << TXC0); + break; + } + digitalWrite( u8txenpin, HIGH ); +#endif + } + + // transfer buffer to serial line + if(u8serno<4) + port->write( au8Buffer, u8BufferSize ); + else + softPort->write( au8Buffer, u8BufferSize ); + + // keep RS485 transceiver in transmit mode as long as sending + if (u8txenpin > 1) + { +#if defined(__AVR__) + switch( u8serno ) + { +#if defined(UBRR1H) + case 1: + while (!(UCSR1A & (1 << TXC1))); + break; +#endif + +#if defined(UBRR2H) + case 2: + while (!(UCSR2A & (1 << TXC2))); + break; +#endif + +#if defined(UBRR3H) + case 3: + while (!(UCSR3A & (1 << TXC3))); + break; +#endif + case 0: + default: + while (!(UCSR0A & (1 << TXC0))); + break; + } + + // return RS485 transceiver to receive mode + digitalWrite( u8txenpin, LOW ); +#endif + } + if(u8serno<4) + while(port->read() >= 0); + else + while(softPort->read() >= 0); + + u8BufferSize = 0; + + // set time-out for master + u32timeOut = millis() + (unsigned long) u16timeOut; + + // increase message counter + u16OutCnt++; +} + +/** + * @brief + * This method calculates CRC + * + * @return uint16_t calculated CRC value for the message + * @ingroup buffer + */ +uint16_t Modbus::calcCRC(uint8_t u8length) +{ + unsigned int temp, temp2, flag; + temp = 0xFFFF; + for (unsigned char i = 0; i < u8length; i++) + { + temp = temp ^ au8Buffer[i]; + for (unsigned char j = 1; j <= 8; j++) + { + flag = temp & 0x0001; + temp >>=1; + if (flag) + temp ^= 0xA001; + } + } + // Reverse byte order. + temp2 = temp >> 8; + temp = (temp << 8) | temp2; + temp &= 0xFFFF; + // the returned value is already swapped + // crcLo byte is first & crcHi byte is last + return temp; +} + +/** + * @brief + * This method validates slave incoming messages + * + * @return 0 if OK, EXCEPTION if anything fails + * @ingroup buffer + */ +uint8_t Modbus::validateRequest() +{ + // check message crc vs calculated crc + uint16_t u16MsgCRC = + ((au8Buffer[u8BufferSize - 2] << 8) + | au8Buffer[u8BufferSize - 1]); // combine the crc Low & High bytes + if ( calcCRC( u8BufferSize-2 ) != u16MsgCRC ) + { + u16errCnt ++; + return NO_REPLY; + } + + // check fct code + boolean isSupported = false; + for (uint8_t i = 0; i< sizeof( fctsupported ); i++) + { + if (fctsupported[i] == au8Buffer[FUNC]) + { + isSupported = 1; + break; + } + } + if (!isSupported) + { + u16errCnt ++; + return EXC_FUNC_CODE; + } + + // check start address & nb range + uint16_t u16regs = 0; + uint8_t u8regs; + switch ( au8Buffer[ FUNC ] ) + { + case MB_FC_READ_COILS: + case MB_FC_READ_DISCRETE_INPUT: + case MB_FC_WRITE_MULTIPLE_COILS: + u16regs = word( au8Buffer[ ADD_HI ], au8Buffer[ ADD_LO ]) / 16; + u16regs += word( au8Buffer[ NB_HI ], au8Buffer[ NB_LO ]) /16; + u8regs = (uint8_t) u16regs; + if (u8regs > u8regsize) return EXC_ADDR_RANGE; + break; + case MB_FC_WRITE_COIL: + u16regs = word( au8Buffer[ ADD_HI ], au8Buffer[ ADD_LO ]) / 16; + u8regs = (uint8_t) u16regs; + if (u8regs > u8regsize) return EXC_ADDR_RANGE; + break; + case MB_FC_WRITE_REGISTER : + u16regs = word( au8Buffer[ ADD_HI ], au8Buffer[ ADD_LO ]); + u8regs = (uint8_t) u16regs; + if (u8regs > u8regsize) return EXC_ADDR_RANGE; + break; + case MB_FC_READ_REGISTERS : + case MB_FC_READ_INPUT_REGISTER : + case MB_FC_WRITE_MULTIPLE_REGISTERS : + u16regs = word( au8Buffer[ ADD_HI ], au8Buffer[ ADD_LO ]); + u16regs += word( au8Buffer[ NB_HI ], au8Buffer[ NB_LO ]); + u8regs = (uint8_t) u16regs; + if (u8regs > u8regsize) return EXC_ADDR_RANGE; + break; + } + return 0; // OK, no exception code thrown +} + +/** + * @brief + * This method validates master incoming messages + * + * @return 0 if OK, EXCEPTION if anything fails + * @ingroup buffer + */ +uint8_t Modbus::validateAnswer() +{ + // check message crc vs calculated crc + uint16_t u16MsgCRC = + ((au8Buffer[u8BufferSize - 2] << 8) + | au8Buffer[u8BufferSize - 1]); // combine the crc Low & High bytes + if ( calcCRC( u8BufferSize-2 ) != u16MsgCRC ) + { + u16errCnt ++; + return NO_REPLY; + } + + // check exception + if ((au8Buffer[ FUNC ] & 0x80) != 0) + { + u16errCnt ++; + return ERR_EXCEPTION; + } + + // check fct code + boolean isSupported = false; + for (uint8_t i = 0; i< sizeof( fctsupported ); i++) + { + if (fctsupported[i] == au8Buffer[FUNC]) + { + isSupported = 1; + break; + } + } + if (!isSupported) + { + u16errCnt ++; + return EXC_FUNC_CODE; + } + + return 0; // OK, no exception code thrown +} + +/** + * @brief + * This method builds an exception message + * + * @ingroup buffer + */ +void Modbus::buildException( uint8_t u8exception ) +{ + uint8_t u8func = au8Buffer[ FUNC ]; // get the original FUNC code + + au8Buffer[ ID ] = u8id; + au8Buffer[ FUNC ] = u8func + 0x80; + au8Buffer[ 2 ] = u8exception; + u8BufferSize = EXCEPTION_SIZE; +} + +/** + * This method processes functions 1 & 2 (for master) + * This method puts the slave answer into master data buffer + * + * @ingroup register + * TODO: finish its implementation + */ +void Modbus::get_FC1() +{ + //uint8_t u8byte, i; + //u8byte = 0; + + // for (i=0; i< au8Buffer[ 2 ] /2; i++) { + // au16regs[ i ] = word( + // au8Buffer[ u8byte ], + // au8Buffer[ u8byte +1 ]); + // u8byte += 2; + // } +} + +/** + * This method processes functions 3 & 4 (for master) + * This method puts the slave answer into master data buffer + * + * @ingroup register + */ +void Modbus::get_FC3() +{ + uint8_t u8byte, i; + u8byte = 3; + + for (i=0; i< au8Buffer[ 2 ] /2; i++) + { + au16regs[ i ] = word( + au8Buffer[ u8byte ], + au8Buffer[ u8byte +1 ]); + u8byte += 2; + } +} + +/** + * @brief + * This method processes functions 1 & 2 + * This method reads a bit array and transfers it to the master + * + * @return u8BufferSize Response to master length + * @ingroup discrete + */ +int8_t Modbus::process_FC1( uint16_t *regs, uint8_t u8size ) +{ + uint8_t u8currentRegister, u8currentBit, u8bytesno, u8bitsno; + uint8_t u8CopyBufferSize; + uint16_t u16currentCoil, u16coil; + + // get the first and last coil from the message + uint16_t u16StartCoil = word( au8Buffer[ ADD_HI ], au8Buffer[ ADD_LO ] ); + uint16_t u16Coilno = word( au8Buffer[ NB_HI ], au8Buffer[ NB_LO ] ); + + // put the number of bytes in the outcoming message + u8bytesno = (uint8_t) (u16Coilno / 8); + if (u16Coilno % 8 != 0) u8bytesno ++; + au8Buffer[ ADD_HI ] = u8bytesno; + u8BufferSize = ADD_LO; + + // read each coil from the register map and put its value inside the outcoming message + u8bitsno = 0; + + for (u16currentCoil = 0; u16currentCoil < u16Coilno; u16currentCoil++) + { + u16coil = u16StartCoil + u16currentCoil; + u8currentRegister = (uint8_t) (u16coil / 16); + u8currentBit = (uint8_t) (u16coil % 16); + + bitWrite( + au8Buffer[ u8BufferSize ], + u8bitsno, + bitRead( regs[ u8currentRegister ], u8currentBit ) ); + u8bitsno ++; + + if (u8bitsno > 7) + { + u8bitsno = 0; + u8BufferSize++; + } + } + + // send outcoming message + if (u16Coilno % 8 != 0) u8BufferSize ++; + u8CopyBufferSize = u8BufferSize +2; + sendTxBuffer(); + return u8CopyBufferSize; +} + +/** + * @brief + * This method processes functions 3 & 4 + * This method reads a word array and transfers it to the master + * + * @return u8BufferSize Response to master length + * @ingroup register + */ +int8_t Modbus::process_FC3( uint16_t *regs, uint8_t u8size ) +{ + + uint8_t u8StartAdd = word( au8Buffer[ ADD_HI ], au8Buffer[ ADD_LO ] ); + uint8_t u8regsno = word( au8Buffer[ NB_HI ], au8Buffer[ NB_LO ] ); + uint8_t u8CopyBufferSize; + uint8_t i; + + au8Buffer[ 2 ] = u8regsno * 2; + u8BufferSize = 3; + + for (i = u8StartAdd; i < u8StartAdd + u8regsno; i++) + { + au8Buffer[ u8BufferSize ] = highByte(regs[i]); + u8BufferSize++; + au8Buffer[ u8BufferSize ] = lowByte(regs[i]); + u8BufferSize++; + } + u8CopyBufferSize = u8BufferSize +2; + sendTxBuffer(); + + return u8CopyBufferSize; +} + +/** + * @brief + * This method processes function 5 + * This method writes a value assigned by the master to a single bit + * + * @return u8BufferSize Response to master length + * @ingroup discrete + */ +int8_t Modbus::process_FC5( uint16_t *regs, uint8_t u8size ) +{ + uint8_t u8currentRegister, u8currentBit; + uint8_t u8CopyBufferSize; + uint16_t u16coil = word( au8Buffer[ ADD_HI ], au8Buffer[ ADD_LO ] ); + + // point to the register and its bit + u8currentRegister = (uint8_t) (u16coil / 16); + u8currentBit = (uint8_t) (u16coil % 16); + + // write to coil + bitWrite( + regs[ u8currentRegister ], + u8currentBit, + au8Buffer[ NB_HI ] == 0xff ); + + + // send answer to master + u8BufferSize = 6; + u8CopyBufferSize = u8BufferSize +2; + sendTxBuffer(); + + return u8CopyBufferSize; +} + +/** + * @brief + * This method processes function 6 + * This method writes a value assigned by the master to a single word + * + * @return u8BufferSize Response to master length + * @ingroup register + */ +int8_t Modbus::process_FC6( uint16_t *regs, uint8_t u8size ) +{ + + uint8_t u8add = word( au8Buffer[ ADD_HI ], au8Buffer[ ADD_LO ] ); + uint8_t u8CopyBufferSize; + uint16_t u16val = word( au8Buffer[ NB_HI ], au8Buffer[ NB_LO ] ); + + regs[ u8add ] = u16val; + + // keep the same header + u8BufferSize = RESPONSE_SIZE; + + u8CopyBufferSize = u8BufferSize +2; + sendTxBuffer(); + + return u8CopyBufferSize; +} + +/** + * @brief + * This method processes function 15 + * This method writes a bit array assigned by the master + * + * @return u8BufferSize Response to master length + * @ingroup discrete + */ +int8_t Modbus::process_FC15( uint16_t *regs, uint8_t u8size ) +{ + uint8_t u8currentRegister, u8currentBit, u8frameByte, u8bitsno; + uint8_t u8CopyBufferSize; + uint16_t u16currentCoil, u16coil; + boolean bTemp; + + // get the first and last coil from the message + uint16_t u16StartCoil = word( au8Buffer[ ADD_HI ], au8Buffer[ ADD_LO ] ); + uint16_t u16Coilno = word( au8Buffer[ NB_HI ], au8Buffer[ NB_LO ] ); + + + // read each coil from the register map and put its value inside the outcoming message + u8bitsno = 0; + u8frameByte = 7; + for (u16currentCoil = 0; u16currentCoil < u16Coilno; u16currentCoil++) + { + + u16coil = u16StartCoil + u16currentCoil; + u8currentRegister = (uint8_t) (u16coil / 16); + u8currentBit = (uint8_t) (u16coil % 16); + + bTemp = bitRead( + au8Buffer[ u8frameByte ], + u8bitsno ); + + bitWrite( + regs[ u8currentRegister ], + u8currentBit, + bTemp ); + + u8bitsno ++; + + if (u8bitsno > 7) + { + u8bitsno = 0; + u8frameByte++; + } + } + + // send outcoming message + // it's just a copy of the incomping frame until 6th byte + u8BufferSize = 6; + u8CopyBufferSize = u8BufferSize +2; + sendTxBuffer(); + return u8CopyBufferSize; +} + +/** + * @brief + * This method processes function 16 + * This method writes a word array assigned by the master + * + * @return u8BufferSize Response to master length + * @ingroup register + */ +int8_t Modbus::process_FC16( uint16_t *regs, uint8_t u8size ) +{ + //uint8_t u8func = au8Buffer[ FUNC ]; // get the original FUNC code + uint8_t u8StartAdd = au8Buffer[ ADD_HI ] << 8 | au8Buffer[ ADD_LO ]; + uint8_t u8regsno = au8Buffer[ NB_HI ] << 8 | au8Buffer[ NB_LO ]; + uint8_t u8CopyBufferSize; + uint8_t i; + uint16_t temp; + + // build header + au8Buffer[ NB_HI ] = 0; + au8Buffer[ NB_LO ] = u8regsno; + u8BufferSize = RESPONSE_SIZE; + + // write registers + for (i = 0; i < u8regsno; i++) + { + temp = word( + au8Buffer[ (BYTE_CNT + 1) + i * 2 ], + au8Buffer[ (BYTE_CNT + 2) + i * 2 ]); + + regs[ u8StartAdd + i ] = temp; + } + u8CopyBufferSize = u8BufferSize +2; + sendTxBuffer(); + + return u8CopyBufferSize; +} + +#endif // ModbusRtu_H_ diff --git a/software/firmware/libraries/modbus/README.md b/software/firmware/archive/libraries/modbus/README.md similarity index 100% rename from software/firmware/libraries/modbus/README.md rename to software/firmware/archive/libraries/modbus/README.md diff --git a/software/firmware/libraries/modbus/config b/software/firmware/archive/libraries/modbus/config similarity index 100% rename from software/firmware/libraries/modbus/config rename to software/firmware/archive/libraries/modbus/config diff --git a/software/firmware/libraries/modbus/documentation/html/_modbus_rtu_8h.html b/software/firmware/archive/libraries/modbus/documentation/html/_modbus_rtu_8h.html similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/_modbus_rtu_8h.html rename to software/firmware/archive/libraries/modbus/documentation/html/_modbus_rtu_8h.html diff --git a/software/firmware/libraries/modbus/documentation/html/_modbus_rtu_8h_source.html b/software/firmware/archive/libraries/modbus/documentation/html/_modbus_rtu_8h_source.html similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/_modbus_rtu_8h_source.html rename to software/firmware/archive/libraries/modbus/documentation/html/_modbus_rtu_8h_source.html diff --git a/software/firmware/libraries/modbus/documentation/html/annotated.html b/software/firmware/archive/libraries/modbus/documentation/html/annotated.html similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/annotated.html rename to software/firmware/archive/libraries/modbus/documentation/html/annotated.html diff --git a/software/firmware/libraries/modbus/documentation/html/class_modbus-members.html b/software/firmware/archive/libraries/modbus/documentation/html/class_modbus-members.html similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/class_modbus-members.html rename to software/firmware/archive/libraries/modbus/documentation/html/class_modbus-members.html diff --git a/software/firmware/libraries/modbus/documentation/html/class_modbus.html b/software/firmware/archive/libraries/modbus/documentation/html/class_modbus.html similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/class_modbus.html rename to software/firmware/archive/libraries/modbus/documentation/html/class_modbus.html diff --git a/software/firmware/libraries/modbus/documentation/html/classes.html b/software/firmware/archive/libraries/modbus/documentation/html/classes.html similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/classes.html rename to software/firmware/archive/libraries/modbus/documentation/html/classes.html diff --git a/software/firmware/libraries/modbus/documentation/html/doxygen.css b/software/firmware/archive/libraries/modbus/documentation/html/doxygen.css similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/doxygen.css rename to software/firmware/archive/libraries/modbus/documentation/html/doxygen.css diff --git a/software/firmware/libraries/modbus/documentation/html/dynsections.js b/software/firmware/archive/libraries/modbus/documentation/html/dynsections.js similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/dynsections.js rename to software/firmware/archive/libraries/modbus/documentation/html/dynsections.js diff --git a/software/firmware/libraries/modbus/documentation/html/files.html b/software/firmware/archive/libraries/modbus/documentation/html/files.html similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/files.html rename to software/firmware/archive/libraries/modbus/documentation/html/files.html diff --git a/software/firmware/libraries/modbus/documentation/html/functions.html b/software/firmware/archive/libraries/modbus/documentation/html/functions.html similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/functions.html rename to software/firmware/archive/libraries/modbus/documentation/html/functions.html diff --git a/software/firmware/libraries/modbus/documentation/html/functions_func.html b/software/firmware/archive/libraries/modbus/documentation/html/functions_func.html similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/functions_func.html rename to software/firmware/archive/libraries/modbus/documentation/html/functions_func.html diff --git a/software/firmware/libraries/modbus/documentation/html/functions_vars.html b/software/firmware/archive/libraries/modbus/documentation/html/functions_vars.html similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/functions_vars.html rename to software/firmware/archive/libraries/modbus/documentation/html/functions_vars.html diff --git a/software/firmware/libraries/modbus/documentation/html/globals.html b/software/firmware/archive/libraries/modbus/documentation/html/globals.html similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/globals.html rename to software/firmware/archive/libraries/modbus/documentation/html/globals.html diff --git a/software/firmware/libraries/modbus/documentation/html/globals_defs.html b/software/firmware/archive/libraries/modbus/documentation/html/globals_defs.html similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/globals_defs.html rename to software/firmware/archive/libraries/modbus/documentation/html/globals_defs.html diff --git a/software/firmware/libraries/modbus/documentation/html/globals_enum.html b/software/firmware/archive/libraries/modbus/documentation/html/globals_enum.html similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/globals_enum.html rename to software/firmware/archive/libraries/modbus/documentation/html/globals_enum.html diff --git a/software/firmware/libraries/modbus/documentation/html/globals_eval.html b/software/firmware/archive/libraries/modbus/documentation/html/globals_eval.html similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/globals_eval.html rename to software/firmware/archive/libraries/modbus/documentation/html/globals_eval.html diff --git a/software/firmware/libraries/modbus/documentation/html/globals_vars.html b/software/firmware/archive/libraries/modbus/documentation/html/globals_vars.html similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/globals_vars.html rename to software/firmware/archive/libraries/modbus/documentation/html/globals_vars.html diff --git a/software/firmware/libraries/modbus/documentation/html/group__buffer.html b/software/firmware/archive/libraries/modbus/documentation/html/group__buffer.html similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/group__buffer.html rename to software/firmware/archive/libraries/modbus/documentation/html/group__buffer.html diff --git a/software/firmware/libraries/modbus/documentation/html/group__discrete.html b/software/firmware/archive/libraries/modbus/documentation/html/group__discrete.html similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/group__discrete.html rename to software/firmware/archive/libraries/modbus/documentation/html/group__discrete.html diff --git a/software/firmware/libraries/modbus/documentation/html/group__loop.html b/software/firmware/archive/libraries/modbus/documentation/html/group__loop.html similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/group__loop.html rename to software/firmware/archive/libraries/modbus/documentation/html/group__loop.html diff --git a/software/firmware/libraries/modbus/documentation/html/group__register.html b/software/firmware/archive/libraries/modbus/documentation/html/group__register.html similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/group__register.html rename to software/firmware/archive/libraries/modbus/documentation/html/group__register.html diff --git a/software/firmware/libraries/modbus/documentation/html/group__setup.html b/software/firmware/archive/libraries/modbus/documentation/html/group__setup.html similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/group__setup.html rename to software/firmware/archive/libraries/modbus/documentation/html/group__setup.html diff --git a/software/firmware/libraries/modbus/documentation/html/index.hhc b/software/firmware/archive/libraries/modbus/documentation/html/index.hhc similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/index.hhc rename to software/firmware/archive/libraries/modbus/documentation/html/index.hhc diff --git a/software/firmware/libraries/modbus/documentation/html/index.hhk b/software/firmware/archive/libraries/modbus/documentation/html/index.hhk similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/index.hhk rename to software/firmware/archive/libraries/modbus/documentation/html/index.hhk diff --git a/software/firmware/libraries/modbus/documentation/html/index.hhp b/software/firmware/archive/libraries/modbus/documentation/html/index.hhp similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/index.hhp rename to software/firmware/archive/libraries/modbus/documentation/html/index.hhp diff --git a/software/firmware/libraries/modbus/documentation/html/index.html b/software/firmware/archive/libraries/modbus/documentation/html/index.html similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/index.html rename to software/firmware/archive/libraries/modbus/documentation/html/index.html diff --git a/software/firmware/libraries/modbus/documentation/html/modules.html b/software/firmware/archive/libraries/modbus/documentation/html/modules.html similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/modules.html rename to software/firmware/archive/libraries/modbus/documentation/html/modules.html diff --git a/software/firmware/libraries/modbus/documentation/html/pages.html b/software/firmware/archive/libraries/modbus/documentation/html/pages.html similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/pages.html rename to software/firmware/archive/libraries/modbus/documentation/html/pages.html diff --git a/software/firmware/libraries/modbus/documentation/html/structmodbus__t-members.html b/software/firmware/archive/libraries/modbus/documentation/html/structmodbus__t-members.html similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/structmodbus__t-members.html rename to software/firmware/archive/libraries/modbus/documentation/html/structmodbus__t-members.html diff --git a/software/firmware/libraries/modbus/documentation/html/structmodbus__t.html b/software/firmware/archive/libraries/modbus/documentation/html/structmodbus__t.html similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/structmodbus__t.html rename to software/firmware/archive/libraries/modbus/documentation/html/structmodbus__t.html diff --git a/software/firmware/libraries/modbus/documentation/html/tabs.css b/software/firmware/archive/libraries/modbus/documentation/html/tabs.css similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/tabs.css rename to software/firmware/archive/libraries/modbus/documentation/html/tabs.css diff --git a/software/firmware/libraries/modbus/documentation/html/todo.html b/software/firmware/archive/libraries/modbus/documentation/html/todo.html similarity index 100% rename from software/firmware/libraries/modbus/documentation/html/todo.html rename to software/firmware/archive/libraries/modbus/documentation/html/todo.html diff --git a/software/firmware/libraries/modbus/documentation/latex/Makefile b/software/firmware/archive/libraries/modbus/documentation/latex/Makefile similarity index 100% rename from software/firmware/libraries/modbus/documentation/latex/Makefile rename to software/firmware/archive/libraries/modbus/documentation/latex/Makefile diff --git a/software/firmware/libraries/modbus/documentation/latex/_modbus_rtu_8h.tex b/software/firmware/archive/libraries/modbus/documentation/latex/_modbus_rtu_8h.tex similarity index 100% rename from software/firmware/libraries/modbus/documentation/latex/_modbus_rtu_8h.tex rename to software/firmware/archive/libraries/modbus/documentation/latex/_modbus_rtu_8h.tex diff --git a/software/firmware/libraries/modbus/documentation/latex/annotated.tex b/software/firmware/archive/libraries/modbus/documentation/latex/annotated.tex similarity index 100% rename from software/firmware/libraries/modbus/documentation/latex/annotated.tex rename to software/firmware/archive/libraries/modbus/documentation/latex/annotated.tex diff --git a/software/firmware/libraries/modbus/documentation/latex/class_modbus.tex b/software/firmware/archive/libraries/modbus/documentation/latex/class_modbus.tex similarity index 100% rename from software/firmware/libraries/modbus/documentation/latex/class_modbus.tex rename to software/firmware/archive/libraries/modbus/documentation/latex/class_modbus.tex diff --git a/software/firmware/libraries/modbus/documentation/latex/doxygen.sty b/software/firmware/archive/libraries/modbus/documentation/latex/doxygen.sty similarity index 100% rename from software/firmware/libraries/modbus/documentation/latex/doxygen.sty rename to software/firmware/archive/libraries/modbus/documentation/latex/doxygen.sty diff --git a/software/firmware/libraries/modbus/documentation/latex/files.tex b/software/firmware/archive/libraries/modbus/documentation/latex/files.tex similarity index 100% rename from software/firmware/libraries/modbus/documentation/latex/files.tex rename to software/firmware/archive/libraries/modbus/documentation/latex/files.tex diff --git a/software/firmware/libraries/modbus/documentation/latex/group__buffer.tex b/software/firmware/archive/libraries/modbus/documentation/latex/group__buffer.tex similarity index 100% rename from software/firmware/libraries/modbus/documentation/latex/group__buffer.tex rename to software/firmware/archive/libraries/modbus/documentation/latex/group__buffer.tex diff --git a/software/firmware/libraries/modbus/documentation/latex/group__discrete.tex b/software/firmware/archive/libraries/modbus/documentation/latex/group__discrete.tex similarity index 100% rename from software/firmware/libraries/modbus/documentation/latex/group__discrete.tex rename to software/firmware/archive/libraries/modbus/documentation/latex/group__discrete.tex diff --git a/software/firmware/libraries/modbus/documentation/latex/group__loop.tex b/software/firmware/archive/libraries/modbus/documentation/latex/group__loop.tex similarity index 100% rename from software/firmware/libraries/modbus/documentation/latex/group__loop.tex rename to software/firmware/archive/libraries/modbus/documentation/latex/group__loop.tex diff --git a/software/firmware/libraries/modbus/documentation/latex/group__register.tex b/software/firmware/archive/libraries/modbus/documentation/latex/group__register.tex similarity index 100% rename from software/firmware/libraries/modbus/documentation/latex/group__register.tex rename to software/firmware/archive/libraries/modbus/documentation/latex/group__register.tex diff --git a/software/firmware/libraries/modbus/documentation/latex/group__setup.tex b/software/firmware/archive/libraries/modbus/documentation/latex/group__setup.tex similarity index 100% rename from software/firmware/libraries/modbus/documentation/latex/group__setup.tex rename to software/firmware/archive/libraries/modbus/documentation/latex/group__setup.tex diff --git a/software/firmware/libraries/modbus/documentation/latex/modules.tex b/software/firmware/archive/libraries/modbus/documentation/latex/modules.tex similarity index 100% rename from software/firmware/libraries/modbus/documentation/latex/modules.tex rename to software/firmware/archive/libraries/modbus/documentation/latex/modules.tex diff --git a/software/firmware/libraries/modbus/documentation/latex/refman.tex b/software/firmware/archive/libraries/modbus/documentation/latex/refman.tex similarity index 100% rename from software/firmware/libraries/modbus/documentation/latex/refman.tex rename to software/firmware/archive/libraries/modbus/documentation/latex/refman.tex diff --git a/software/firmware/libraries/modbus/documentation/latex/structmodbus__t.tex b/software/firmware/archive/libraries/modbus/documentation/latex/structmodbus__t.tex similarity index 100% rename from software/firmware/libraries/modbus/documentation/latex/structmodbus__t.tex rename to software/firmware/archive/libraries/modbus/documentation/latex/structmodbus__t.tex diff --git a/software/firmware/libraries/modbus/documentation/latex/todo.tex b/software/firmware/archive/libraries/modbus/documentation/latex/todo.tex similarity index 100% rename from software/firmware/libraries/modbus/documentation/latex/todo.tex rename to software/firmware/archive/libraries/modbus/documentation/latex/todo.tex diff --git a/software/firmware/libraries/modbus/documentation/rtf/refman.rtf b/software/firmware/archive/libraries/modbus/documentation/rtf/refman.rtf similarity index 100% rename from software/firmware/libraries/modbus/documentation/rtf/refman.rtf rename to software/firmware/archive/libraries/modbus/documentation/rtf/refman.rtf diff --git a/software/firmware/libraries/modbus/examples/RS485_slave/RS485_slave.ino b/software/firmware/archive/libraries/modbus/examples/RS485_slave/RS485_slave.ino similarity index 100% rename from software/firmware/libraries/modbus/examples/RS485_slave/RS485_slave.ino rename to software/firmware/archive/libraries/modbus/examples/RS485_slave/RS485_slave.ino diff --git a/software/firmware/libraries/modbus/examples/advanced_master/advanced_master.ino b/software/firmware/archive/libraries/modbus/examples/advanced_master/advanced_master.ino similarity index 100% rename from software/firmware/libraries/modbus/examples/advanced_master/advanced_master.ino rename to software/firmware/archive/libraries/modbus/examples/advanced_master/advanced_master.ino diff --git a/software/firmware/libraries/modbus/examples/advanced_slave/advanced_slave.ino b/software/firmware/archive/libraries/modbus/examples/advanced_slave/advanced_slave.ino similarity index 100% rename from software/firmware/libraries/modbus/examples/advanced_slave/advanced_slave.ino rename to software/firmware/archive/libraries/modbus/examples/advanced_slave/advanced_slave.ino diff --git a/software/firmware/libraries/modbus/examples/simple_master/simple_master.ino b/software/firmware/archive/libraries/modbus/examples/simple_master/simple_master.ino similarity index 100% rename from software/firmware/libraries/modbus/examples/simple_master/simple_master.ino rename to software/firmware/archive/libraries/modbus/examples/simple_master/simple_master.ino diff --git a/software/firmware/libraries/modbus/examples/simple_slave/simple_slave.ino b/software/firmware/archive/libraries/modbus/examples/simple_slave/simple_slave.ino similarity index 100% rename from software/firmware/libraries/modbus/examples/simple_slave/simple_slave.ino rename to software/firmware/archive/libraries/modbus/examples/simple_slave/simple_slave.ino diff --git a/software/firmware/libraries/modbus/examples/software_serial_simple_master/software_serial_simple_master.ino b/software/firmware/archive/libraries/modbus/examples/software_serial_simple_master/software_serial_simple_master.ino similarity index 100% rename from software/firmware/libraries/modbus/examples/software_serial_simple_master/software_serial_simple_master.ino rename to software/firmware/archive/libraries/modbus/examples/software_serial_simple_master/software_serial_simple_master.ino diff --git a/software/firmware/libraries/modbus/keywords.txt b/software/firmware/archive/libraries/modbus/keywords.txt similarity index 100% rename from software/firmware/libraries/modbus/keywords.txt rename to software/firmware/archive/libraries/modbus/keywords.txt diff --git a/software/firmware/mining/mining.ino b/software/firmware/archive/mining/mining.ino similarity index 96% rename from software/firmware/mining/mining.ino rename to software/firmware/archive/mining/mining.ino index 65c0b4e..879643e 100644 --- a/software/firmware/mining/mining.ino +++ b/software/firmware/archive/mining/mining.ino @@ -1,402 +1,402 @@ -////////// Includes ////////// -#include "HX711.h" -#include -#include - -////////// Hardware / Data Enumerations ////////// -enum HARDWARE { - RS485_EN = 6, - RS485_RX = 9, - RS485_TX = 10, - - MOTOR_LIFT_A = 27, - MOTOR_LIFT_B = 28, - MOTOR_LIFT_PWM = 25, - MOTOR_LIFT_CS = 31, - MOTOR_LIFT_EN = 24, - MOTOR_LIFT_FB = A10, - - MOTOR_TILT_A = 30, - MOTOR_TILT_B = 29, - MOTOR_TILT_PWM = 32, - MOTOR_TILT_CS = 26, - MOTOR_TILT_EN = 33, - MOTOR_TILT_FB = A11, - - CAMERA_CONTROL = 0, - CAMERA_VIDEO_EN = 1, - - LED_13 = 13, - - LED_RED = 20, - LED_BLUE = 21, - LED_GREEN = 22, - - SCALE_DOUT = 8, - SCALE_CLK = 7 - -}; - -enum MOTORS { - LIFT = 0, - TILT = 1, -}; - -// void shoot(); -// void slowZoomIn(); -// void slowZoomOut(); -// void fullZoomIn(); -// void fullZoomOut(); -// void focus(); - -enum MODBUS_REGISTERS { - // Inputs - SET_POSITION_LIFT_POSITIVE = 0, - SET_POSITION_LIFT_NEGATIVE = 1, - SET_POSITION_TILT_POSITIVE = 2, - SET_POSITION_TILT_NEGATIVE = 3, - SET_POSITION_LIFT_ABSOLUTE = 4, - SET_POSITION_TILT_ABSOLUTE = 5, - MEASURE = 6, - TARE = 7, - CALIBRATION_FACTOR = 8, - - CHANGE_VIEW_MODE = 9, - ZOOM_IN = 10, - ZOOM_OUT = 11, - FULL_ZOOM_IN = 12, - FULL_ZOOM_OUT = 13, - SHOOT = 14, - - // Outputs - CURRENT_POSITION_LIFT = 15, - CURRENT_POSITION_TILT = 16, - MEASURED_WEIGHT = 17 -}; - -enum CAMERA_VIEW_MODES { - NO_CHANGE = 0, - LCD = 1, - NETWORK = 2 -}; - -////////// Global Variables ////////// -int set_position_lift = 1023; -int set_position_tilt = 350; -int current_position_lift = 0; -int current_position_tilt = 0; -int tolerance = 20; //tolerance for position - -float last_calibration_factor = -120000; //for the scale - -// modbus stuff -const uint8_t node_id = 2; -const uint8_t mobus_serial_port_number = 2; -uint16_t modbus_data[] = {0, 0, 0, 0, 9999, 9999, 0, 0, 895, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -uint8_t num_modbus_registers = 0; -int8_t poll_state = 0; -bool communication_good = false; -uint8_t message_count = 0; - -// nice human words for motor states -#define BRAKEVCC 0 -#define CW 1 -#define CCW 2 -#define BRAKEGND 3 - -////////// Class Instantiations ////////// -HX711 scale(HARDWARE::SCALE_DOUT, HARDWARE::SCALE_CLK); -Modbus slave(node_id, mobus_serial_port_number, HARDWARE::RS485_EN); -camera science_camera(HARDWARE::CAMERA_CONTROL); - -void setup() { - Serial.begin(9600); // debug - // while(!Serial); - - setup_hardware(); - num_modbus_registers = sizeof(modbus_data) / sizeof(modbus_data[0]); - slave.begin(115200); // baud-rate at 19200 - slave.setTimeOut(200); -} - -void loop() { - poll_modbus(); - set_leds(); - set_motors(); - set_scale(); - poll_scale(); - apply_camera_commands(); -} - -void setup_hardware() { - pinMode(HARDWARE::RS485_EN, OUTPUT); - - pinMode(HARDWARE::MOTOR_LIFT_A, OUTPUT); - pinMode(HARDWARE::MOTOR_LIFT_B, OUTPUT); - pinMode(HARDWARE::MOTOR_LIFT_PWM, OUTPUT); - pinMode(HARDWARE::MOTOR_LIFT_EN, OUTPUT); - pinMode(HARDWARE::MOTOR_LIFT_CS, INPUT); - pinMode(HARDWARE::MOTOR_LIFT_FB, INPUT); - - pinMode(HARDWARE::MOTOR_TILT_A, OUTPUT); - pinMode(HARDWARE::MOTOR_TILT_B, OUTPUT); - pinMode(HARDWARE::MOTOR_TILT_PWM, OUTPUT); - pinMode(HARDWARE::MOTOR_TILT_EN, OUTPUT); - pinMode(HARDWARE::MOTOR_TILT_CS, INPUT); - pinMode(HARDWARE::MOTOR_TILT_FB, INPUT); - - - pinMode(HARDWARE::CAMERA_CONTROL, OUTPUT); - pinMode(HARDWARE::CAMERA_VIDEO_EN, OUTPUT); - - pinMode(HARDWARE::LED_13, OUTPUT); - pinMode(HARDWARE::LED_RED, OUTPUT); - pinMode(HARDWARE::LED_BLUE, OUTPUT); - pinMode(HARDWARE::LED_GREEN, OUTPUT); - - // set defualt states - digitalWrite(HARDWARE::LED_RED, LOW); - digitalWrite(HARDWARE::LED_GREEN, HIGH); - digitalWrite(HARDWARE::LED_BLUE, HIGH); - digitalWrite(HARDWARE::LED_13, LOW); - digitalWrite(HARDWARE::MOTOR_LIFT_EN, HIGH); - digitalWrite(HARDWARE::MOTOR_TILT_EN, HIGH); - - digitalWrite(HARDWARE::CAMERA_VIDEO_EN, LOW); - - // Change motor PWM frequency so it's not in the audible range - analogWriteFrequency(HARDWARE::MOTOR_LIFT_PWM, 25000); - analogWriteFrequency(HARDWARE::MOTOR_TILT_PWM, 25000); - - // set the current desired position to the current position - // set_position_lift = analogRead(HARDWARE::MOTOR_LIFT_FB); - // set_position_tilt = analogRead(HARDWARE::MOTOR_TILT_FB); - current_position_lift = analogRead(HARDWARE::MOTOR_LIFT_FB); - current_position_tilt = analogRead(HARDWARE::MOTOR_TILT_FB); - - // setup scale - scale.set_scale(); - scale.tare(); //Reset the scale to 0 -} - -void poll_modbus(){ - poll_state = slave.poll(modbus_data, num_modbus_registers); - communication_good = !slave.getTimeOutState(); -} - -void set_leds(){ - if(poll_state > 4){ - message_count++; - if(message_count > 2){ - digitalWrite(HARDWARE::LED_13, !digitalRead(HARDWARE::LED_13)); - message_count = 0; - } - - digitalWrite(HARDWARE::LED_GREEN, LOW); - digitalWrite(HARDWARE::LED_RED, HIGH); - }else if(!communication_good){ - digitalWrite(HARDWARE::LED_13, LOW); - digitalWrite(HARDWARE::LED_GREEN, HIGH); - digitalWrite(HARDWARE::LED_RED, LOW); - } -} - -void set_motors() { - if (modbus_data[MODBUS_REGISTERS::SET_POSITION_LIFT_ABSOLUTE] < 1024 ){ - set_position_lift = modbus_data[MODBUS_REGISTERS::SET_POSITION_LIFT_ABSOLUTE]; - modbus_data[MODBUS_REGISTERS::SET_POSITION_LIFT_ABSOLUTE] = 1024; - }else{ - set_position_lift += modbus_data[MODBUS_REGISTERS::SET_POSITION_LIFT_POSITIVE] - modbus_data[MODBUS_REGISTERS::SET_POSITION_LIFT_NEGATIVE]; - set_position_lift = constrain(set_position_lift, 0, 1023); - - modbus_data[MODBUS_REGISTERS::SET_POSITION_LIFT_POSITIVE] = 0; - modbus_data[MODBUS_REGISTERS::SET_POSITION_LIFT_NEGATIVE] = 0; - } - - if(modbus_data[MODBUS_REGISTERS::SET_POSITION_TILT_ABSOLUTE] < 1024){ - set_position_tilt = modbus_data[MODBUS_REGISTERS::SET_POSITION_TILT_ABSOLUTE]; - modbus_data[MODBUS_REGISTERS::SET_POSITION_TILT_ABSOLUTE] = 1024; - }else{ - set_position_tilt += modbus_data[MODBUS_REGISTERS::SET_POSITION_TILT_POSITIVE] - modbus_data[MODBUS_REGISTERS::SET_POSITION_TILT_NEGATIVE] ; - set_position_tilt = constrain(set_position_tilt, 0, 1023); - - modbus_data[MODBUS_REGISTERS::SET_POSITION_TILT_POSITIVE] = 0; - modbus_data[MODBUS_REGISTERS::SET_POSITION_TILT_NEGATIVE] = 0; - } - - current_position_lift = analogRead(HARDWARE::MOTOR_LIFT_FB); - current_position_tilt = analogRead(HARDWARE::MOTOR_TILT_FB); - - modbus_data[MODBUS_REGISTERS::CURRENT_POSITION_LIFT] = current_position_lift; - modbus_data[MODBUS_REGISTERS::CURRENT_POSITION_TILT] = current_position_tilt; - - if (abs(current_position_lift - set_position_lift) > tolerance) { - if (current_position_lift < set_position_lift) { - set_motor_output(MOTORS::LIFT, CCW, 255); - } - else { - set_motor_output(MOTORS::LIFT, CW, 255); - } - } - else { - motor_off(MOTORS::LIFT); - } - - if (abs(current_position_tilt - set_position_tilt) > tolerance) { - if (current_position_tilt < set_position_tilt) { - set_motor_output(MOTORS::TILT, CCW, 255); - } - else { - set_motor_output(MOTORS::TILT, CW, 255); - } - } - else { - motor_off(MOTORS::TILT); - } -} - -void set_scale(){ - float cal_factor = modbus_data[MODBUS_REGISTERS::CALIBRATION_FACTOR] * 100; - if(cal_factor != last_calibration_factor){ - scale.set_scale(cal_factor); - last_calibration_factor = cal_factor; - } - - if (modbus_data[MODBUS_REGISTERS::TARE] == 1){ - scale.tare(); - modbus_data[MODBUS_REGISTERS::TARE] = 0; - } -} - -void poll_scale(){ - if(modbus_data[MODBUS_REGISTERS::MEASURE] == 1){ - Serial.println(scale.get_units()*-1000); - modbus_data[MODBUS_REGISTERS::MEASURED_WEIGHT] = scale.get_units()*-1000; - modbus_data[MODBUS_REGISTERS::MEASURE] = 0; - } -} - -void apply_camera_commands(){ - ///// Camea video output control ///// - switch (modbus_data[MODBUS_REGISTERS::CHANGE_VIEW_MODE]) { - case CAMERA_VIEW_MODES::LCD: - digitalWrite(HARDWARE::CAMERA_VIDEO_EN, HIGH); - break; - case CAMERA_VIEW_MODES::NETWORK: - digitalWrite(HARDWARE::CAMERA_VIDEO_EN, LOW); - break; - default: - break; - } - modbus_data[MODBUS_REGISTERS::CHANGE_VIEW_MODE] = CAMERA_VIEW_MODES::NO_CHANGE; - - ////// Zoom controls, process all, even if conflicting /////// - if(modbus_data[MODBUS_REGISTERS::ZOOM_IN]){ - science_camera.slowZoomIn(); - modbus_data[MODBUS_REGISTERS::ZOOM_IN] = 0; - }else if(modbus_data[MODBUS_REGISTERS::ZOOM_OUT]){ - science_camera.slowZoomOut(); - modbus_data[MODBUS_REGISTERS::ZOOM_OUT] = 0; - }else if(modbus_data[MODBUS_REGISTERS::FULL_ZOOM_IN]){ - science_camera.fullZoomIn(); - modbus_data[MODBUS_REGISTERS::FULL_ZOOM_IN] = 0; - }else if(modbus_data[MODBUS_REGISTERS::FULL_ZOOM_OUT]){ - science_camera.fullZoomOut(); - modbus_data[MODBUS_REGISTERS::FULL_ZOOM_OUT] = 0; - } else if(modbus_data[MODBUS_REGISTERS::SHOOT]){ - science_camera.shoot(); - modbus_data[MODBUS_REGISTERS::SHOOT] = 0; - } - ///// camera process here - science_camera.update(); -} - -//---Set Motor Output---// -/* - Inputs: motor number, direction, pwm value - Returns: nothing - - Will set a motor going in a specific direction the motor will continue - going in that direction, at that speed until told to do otherwise. - - direct: Should be between 0 and 3, with the following result - 0: Brake to VCC - 1: Clockwise - 2: CounterClockwise - 3: Brake to GND - - pwm: should be a value between 0 and 255, higher the number, the faster - it'll go - ---------------- - Control Logic: - ---------------- - A | B - Brake VCC: 1 1 - CW: 1 0 - CCW: 0 1 - Brake GND: 0 0 - ---------------- -*/ -void set_motor_output(int motor, int direction, int pwm_input) { - - int a; - int b; - int pwm; - - if (motor == MOTORS::LIFT) { - a = HARDWARE::MOTOR_LIFT_A; - b = HARDWARE::MOTOR_LIFT_B; - pwm = HARDWARE::MOTOR_LIFT_PWM; - } - else if (motor == MOTORS::TILT) { - a = HARDWARE::MOTOR_TILT_A; - b = HARDWARE::MOTOR_TILT_B; - pwm = HARDWARE::MOTOR_TILT_PWM; - } - else { - return; - } - - if (direction <= 4) { - // Set A - if (direction <= 1) { - digitalWrite(a, HIGH); - } - else { - digitalWrite(a, LOW); - } - - // Set B - if ((direction == 0) || (direction == 2)) { - digitalWrite(b, HIGH); - } - else { - digitalWrite(b, LOW); - } - analogWrite(pwm, pwm_input); - } -} - -void motor_off(int motor) { - int a; - int b; - int pwm; - - if (motor == MOTORS::LIFT) { - a = HARDWARE::MOTOR_LIFT_A; - b = HARDWARE::MOTOR_LIFT_B; - pwm = HARDWARE::MOTOR_LIFT_PWM; - } - else if (motor == MOTORS::TILT) { - a = HARDWARE::MOTOR_TILT_A; - b = HARDWARE::MOTOR_TILT_B; - pwm = HARDWARE::MOTOR_TILT_PWM; - } - else { - return; - } - - digitalWrite(a, LOW); - digitalWrite(b, LOW); - analogWrite(pwm, 0); -} +////////// Includes ////////// +#include "HX711.h" +#include +#include + +////////// Hardware / Data Enumerations ////////// +enum HARDWARE { + RS485_EN = 6, + RS485_RX = 9, + RS485_TX = 10, + + MOTOR_LIFT_A = 27, + MOTOR_LIFT_B = 28, + MOTOR_LIFT_PWM = 25, + MOTOR_LIFT_CS = 31, + MOTOR_LIFT_EN = 24, + MOTOR_LIFT_FB = A10, + + MOTOR_TILT_A = 30, + MOTOR_TILT_B = 29, + MOTOR_TILT_PWM = 32, + MOTOR_TILT_CS = 26, + MOTOR_TILT_EN = 33, + MOTOR_TILT_FB = A11, + + CAMERA_CONTROL = 0, + CAMERA_VIDEO_EN = 1, + + LED_13 = 13, + + LED_RED = 20, + LED_BLUE = 21, + LED_GREEN = 22, + + SCALE_DOUT = 8, + SCALE_CLK = 7 + +}; + +enum MOTORS { + LIFT = 0, + TILT = 1, +}; + +// void shoot(); +// void slowZoomIn(); +// void slowZoomOut(); +// void fullZoomIn(); +// void fullZoomOut(); +// void focus(); + +enum MODBUS_REGISTERS { + // Inputs + SET_POSITION_LIFT_POSITIVE = 0, + SET_POSITION_LIFT_NEGATIVE = 1, + SET_POSITION_TILT_POSITIVE = 2, + SET_POSITION_TILT_NEGATIVE = 3, + SET_POSITION_LIFT_ABSOLUTE = 4, + SET_POSITION_TILT_ABSOLUTE = 5, + MEASURE = 6, + TARE = 7, + CALIBRATION_FACTOR = 8, + + CHANGE_VIEW_MODE = 9, + ZOOM_IN = 10, + ZOOM_OUT = 11, + FULL_ZOOM_IN = 12, + FULL_ZOOM_OUT = 13, + SHOOT = 14, + + // Outputs + CURRENT_POSITION_LIFT = 15, + CURRENT_POSITION_TILT = 16, + MEASURED_WEIGHT = 17 +}; + +enum CAMERA_VIEW_MODES { + NO_CHANGE = 0, + LCD = 1, + NETWORK = 2 +}; + +////////// Global Variables ////////// +int set_position_lift = 1023; +int set_position_tilt = 350; +int current_position_lift = 0; +int current_position_tilt = 0; +int tolerance = 20; //tolerance for position + +float last_calibration_factor = -120000; //for the scale + +// modbus stuff +const uint8_t node_id = 2; +const uint8_t mobus_serial_port_number = 2; +uint16_t modbus_data[] = {0, 0, 0, 0, 9999, 9999, 0, 0, 895, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +uint8_t num_modbus_registers = 0; +int8_t poll_state = 0; +bool communication_good = false; +uint8_t message_count = 0; + +// nice human words for motor states +#define BRAKEVCC 0 +#define CW 1 +#define CCW 2 +#define BRAKEGND 3 + +////////// Class Instantiations ////////// +HX711 scale(HARDWARE::SCALE_DOUT, HARDWARE::SCALE_CLK); +Modbus slave(node_id, mobus_serial_port_number, HARDWARE::RS485_EN); +camera science_camera(HARDWARE::CAMERA_CONTROL); + +void setup() { + Serial.begin(9600); // debug + // while(!Serial); + + setup_hardware(); + num_modbus_registers = sizeof(modbus_data) / sizeof(modbus_data[0]); + slave.begin(115200); // baud-rate at 19200 + slave.setTimeOut(200); +} + +void loop() { + poll_modbus(); + set_leds(); + set_motors(); + set_scale(); + poll_scale(); + apply_camera_commands(); +} + +void setup_hardware() { + pinMode(HARDWARE::RS485_EN, OUTPUT); + + pinMode(HARDWARE::MOTOR_LIFT_A, OUTPUT); + pinMode(HARDWARE::MOTOR_LIFT_B, OUTPUT); + pinMode(HARDWARE::MOTOR_LIFT_PWM, OUTPUT); + pinMode(HARDWARE::MOTOR_LIFT_EN, OUTPUT); + pinMode(HARDWARE::MOTOR_LIFT_CS, INPUT); + pinMode(HARDWARE::MOTOR_LIFT_FB, INPUT); + + pinMode(HARDWARE::MOTOR_TILT_A, OUTPUT); + pinMode(HARDWARE::MOTOR_TILT_B, OUTPUT); + pinMode(HARDWARE::MOTOR_TILT_PWM, OUTPUT); + pinMode(HARDWARE::MOTOR_TILT_EN, OUTPUT); + pinMode(HARDWARE::MOTOR_TILT_CS, INPUT); + pinMode(HARDWARE::MOTOR_TILT_FB, INPUT); + + + pinMode(HARDWARE::CAMERA_CONTROL, OUTPUT); + pinMode(HARDWARE::CAMERA_VIDEO_EN, OUTPUT); + + pinMode(HARDWARE::LED_13, OUTPUT); + pinMode(HARDWARE::LED_RED, OUTPUT); + pinMode(HARDWARE::LED_BLUE, OUTPUT); + pinMode(HARDWARE::LED_GREEN, OUTPUT); + + // set defualt states + digitalWrite(HARDWARE::LED_RED, LOW); + digitalWrite(HARDWARE::LED_GREEN, HIGH); + digitalWrite(HARDWARE::LED_BLUE, HIGH); + digitalWrite(HARDWARE::LED_13, LOW); + digitalWrite(HARDWARE::MOTOR_LIFT_EN, HIGH); + digitalWrite(HARDWARE::MOTOR_TILT_EN, HIGH); + + digitalWrite(HARDWARE::CAMERA_VIDEO_EN, LOW); + + // Change motor PWM frequency so it's not in the audible range + analogWriteFrequency(HARDWARE::MOTOR_LIFT_PWM, 25000); + analogWriteFrequency(HARDWARE::MOTOR_TILT_PWM, 25000); + + // set the current desired position to the current position + // set_position_lift = analogRead(HARDWARE::MOTOR_LIFT_FB); + // set_position_tilt = analogRead(HARDWARE::MOTOR_TILT_FB); + current_position_lift = analogRead(HARDWARE::MOTOR_LIFT_FB); + current_position_tilt = analogRead(HARDWARE::MOTOR_TILT_FB); + + // setup scale + scale.set_scale(); + scale.tare(); //Reset the scale to 0 +} + +void poll_modbus(){ + poll_state = slave.poll(modbus_data, num_modbus_registers); + communication_good = !slave.getTimeOutState(); +} + +void set_leds(){ + if(poll_state > 4){ + message_count++; + if(message_count > 2){ + digitalWrite(HARDWARE::LED_13, !digitalRead(HARDWARE::LED_13)); + message_count = 0; + } + + digitalWrite(HARDWARE::LED_GREEN, LOW); + digitalWrite(HARDWARE::LED_RED, HIGH); + }else if(!communication_good){ + digitalWrite(HARDWARE::LED_13, LOW); + digitalWrite(HARDWARE::LED_GREEN, HIGH); + digitalWrite(HARDWARE::LED_RED, LOW); + } +} + +void set_motors() { + if (modbus_data[MODBUS_REGISTERS::SET_POSITION_LIFT_ABSOLUTE] < 1024 ){ + set_position_lift = modbus_data[MODBUS_REGISTERS::SET_POSITION_LIFT_ABSOLUTE]; + modbus_data[MODBUS_REGISTERS::SET_POSITION_LIFT_ABSOLUTE] = 1024; + }else{ + set_position_lift += modbus_data[MODBUS_REGISTERS::SET_POSITION_LIFT_POSITIVE] - modbus_data[MODBUS_REGISTERS::SET_POSITION_LIFT_NEGATIVE]; + set_position_lift = constrain(set_position_lift, 0, 1023); + + modbus_data[MODBUS_REGISTERS::SET_POSITION_LIFT_POSITIVE] = 0; + modbus_data[MODBUS_REGISTERS::SET_POSITION_LIFT_NEGATIVE] = 0; + } + + if(modbus_data[MODBUS_REGISTERS::SET_POSITION_TILT_ABSOLUTE] < 1024){ + set_position_tilt = modbus_data[MODBUS_REGISTERS::SET_POSITION_TILT_ABSOLUTE]; + modbus_data[MODBUS_REGISTERS::SET_POSITION_TILT_ABSOLUTE] = 1024; + }else{ + set_position_tilt += modbus_data[MODBUS_REGISTERS::SET_POSITION_TILT_POSITIVE] - modbus_data[MODBUS_REGISTERS::SET_POSITION_TILT_NEGATIVE] ; + set_position_tilt = constrain(set_position_tilt, 0, 1023); + + modbus_data[MODBUS_REGISTERS::SET_POSITION_TILT_POSITIVE] = 0; + modbus_data[MODBUS_REGISTERS::SET_POSITION_TILT_NEGATIVE] = 0; + } + + current_position_lift = analogRead(HARDWARE::MOTOR_LIFT_FB); + current_position_tilt = analogRead(HARDWARE::MOTOR_TILT_FB); + + modbus_data[MODBUS_REGISTERS::CURRENT_POSITION_LIFT] = current_position_lift; + modbus_data[MODBUS_REGISTERS::CURRENT_POSITION_TILT] = current_position_tilt; + + if (abs(current_position_lift - set_position_lift) > tolerance) { + if (current_position_lift < set_position_lift) { + set_motor_output(MOTORS::LIFT, CCW, 255); + } + else { + set_motor_output(MOTORS::LIFT, CW, 255); + } + } + else { + motor_off(MOTORS::LIFT); + } + + if (abs(current_position_tilt - set_position_tilt) > tolerance) { + if (current_position_tilt < set_position_tilt) { + set_motor_output(MOTORS::TILT, CCW, 255); + } + else { + set_motor_output(MOTORS::TILT, CW, 255); + } + } + else { + motor_off(MOTORS::TILT); + } +} + +void set_scale(){ + float cal_factor = modbus_data[MODBUS_REGISTERS::CALIBRATION_FACTOR] * 100; + if(cal_factor != last_calibration_factor){ + scale.set_scale(cal_factor); + last_calibration_factor = cal_factor; + } + + if (modbus_data[MODBUS_REGISTERS::TARE] == 1){ + scale.tare(); + modbus_data[MODBUS_REGISTERS::TARE] = 0; + } +} + +void poll_scale(){ + if(modbus_data[MODBUS_REGISTERS::MEASURE] == 1){ + Serial.println(scale.get_units()*-1000); + modbus_data[MODBUS_REGISTERS::MEASURED_WEIGHT] = scale.get_units()*-1000; + modbus_data[MODBUS_REGISTERS::MEASURE] = 0; + } +} + +void apply_camera_commands(){ + ///// Camea video output control ///// + switch (modbus_data[MODBUS_REGISTERS::CHANGE_VIEW_MODE]) { + case CAMERA_VIEW_MODES::LCD: + digitalWrite(HARDWARE::CAMERA_VIDEO_EN, HIGH); + break; + case CAMERA_VIEW_MODES::NETWORK: + digitalWrite(HARDWARE::CAMERA_VIDEO_EN, LOW); + break; + default: + break; + } + modbus_data[MODBUS_REGISTERS::CHANGE_VIEW_MODE] = CAMERA_VIEW_MODES::NO_CHANGE; + + ////// Zoom controls, process all, even if conflicting /////// + if(modbus_data[MODBUS_REGISTERS::ZOOM_IN]){ + science_camera.slowZoomIn(); + modbus_data[MODBUS_REGISTERS::ZOOM_IN] = 0; + }else if(modbus_data[MODBUS_REGISTERS::ZOOM_OUT]){ + science_camera.slowZoomOut(); + modbus_data[MODBUS_REGISTERS::ZOOM_OUT] = 0; + }else if(modbus_data[MODBUS_REGISTERS::FULL_ZOOM_IN]){ + science_camera.fullZoomIn(); + modbus_data[MODBUS_REGISTERS::FULL_ZOOM_IN] = 0; + }else if(modbus_data[MODBUS_REGISTERS::FULL_ZOOM_OUT]){ + science_camera.fullZoomOut(); + modbus_data[MODBUS_REGISTERS::FULL_ZOOM_OUT] = 0; + } else if(modbus_data[MODBUS_REGISTERS::SHOOT]){ + science_camera.shoot(); + modbus_data[MODBUS_REGISTERS::SHOOT] = 0; + } + ///// camera process here + science_camera.update(); +} + +//---Set Motor Output---// +/* + Inputs: motor number, direction, pwm value + Returns: nothing + + Will set a motor going in a specific direction the motor will continue + going in that direction, at that speed until told to do otherwise. + + direct: Should be between 0 and 3, with the following result + 0: Brake to VCC + 1: Clockwise + 2: CounterClockwise + 3: Brake to GND + + pwm: should be a value between 0 and 255, higher the number, the faster + it'll go + ---------------- + Control Logic: + ---------------- + A | B + Brake VCC: 1 1 + CW: 1 0 + CCW: 0 1 + Brake GND: 0 0 + ---------------- +*/ +void set_motor_output(int motor, int direction, int pwm_input) { + + int a; + int b; + int pwm; + + if (motor == MOTORS::LIFT) { + a = HARDWARE::MOTOR_LIFT_A; + b = HARDWARE::MOTOR_LIFT_B; + pwm = HARDWARE::MOTOR_LIFT_PWM; + } + else if (motor == MOTORS::TILT) { + a = HARDWARE::MOTOR_TILT_A; + b = HARDWARE::MOTOR_TILT_B; + pwm = HARDWARE::MOTOR_TILT_PWM; + } + else { + return; + } + + if (direction <= 4) { + // Set A + if (direction <= 1) { + digitalWrite(a, HIGH); + } + else { + digitalWrite(a, LOW); + } + + // Set B + if ((direction == 0) || (direction == 2)) { + digitalWrite(b, HIGH); + } + else { + digitalWrite(b, LOW); + } + analogWrite(pwm, pwm_input); + } +} + +void motor_off(int motor) { + int a; + int b; + int pwm; + + if (motor == MOTORS::LIFT) { + a = HARDWARE::MOTOR_LIFT_A; + b = HARDWARE::MOTOR_LIFT_B; + pwm = HARDWARE::MOTOR_LIFT_PWM; + } + else if (motor == MOTORS::TILT) { + a = HARDWARE::MOTOR_TILT_A; + b = HARDWARE::MOTOR_TILT_B; + pwm = HARDWARE::MOTOR_TILT_PWM; + } + else { + return; + } + + digitalWrite(a, LOW); + digitalWrite(b, LOW); + analogWrite(pwm, 0); +} diff --git a/software/firmware/modbus_test/modbus_test.ino b/software/firmware/archive/modbus_test/modbus_test.ino similarity index 100% rename from software/firmware/modbus_test/modbus_test.ino rename to software/firmware/archive/modbus_test/modbus_test.ino diff --git a/software/firmware/motor_driver/New_Rover_Motor_Code.ino b/software/firmware/archive/motor_driver/New_Rover_Motor_Code.ino similarity index 100% rename from software/firmware/motor_driver/New_Rover_Motor_Code.ino rename to software/firmware/archive/motor_driver/New_Rover_Motor_Code.ino diff --git a/software/firmware/rdf/rdf.ino b/software/firmware/archive/rdf/rdf.ino similarity index 100% rename from software/firmware/rdf/rdf.ino rename to software/firmware/archive/rdf/rdf.ino diff --git a/software/firmware/scale_tester/scale_tester.ino b/software/firmware/archive/scale_tester/scale_tester.ino similarity index 100% rename from software/firmware/scale_tester/scale_tester.ino rename to software/firmware/archive/scale_tester/scale_tester.ino diff --git a/software/firmware/science_end_effector/science_end_effector.ino b/software/firmware/archive/science_end_effector/science_end_effector.ino similarity index 100% rename from software/firmware/science_end_effector/science_end_effector.ino rename to software/firmware/archive/science_end_effector/science_end_effector.ino diff --git a/software/firmware/temp/new_rdf.ino b/software/firmware/archive/temp/new_rdf.ino similarity index 100% rename from software/firmware/temp/new_rdf.ino rename to software/firmware/archive/temp/new_rdf.ino diff --git a/software/firmware/temp/original_rdf.ino b/software/firmware/archive/temp/original_rdf.ino similarity index 100% rename from software/firmware/temp/original_rdf.ino rename to software/firmware/archive/temp/original_rdf.ino diff --git a/software/firmware/tower/MR1819_tower.ino b/software/firmware/archive/tower/MR1819_tower.ino similarity index 95% rename from software/firmware/tower/MR1819_tower.ino rename to software/firmware/archive/tower/MR1819_tower.ino index 57bc80a..e6feca8 100644 --- a/software/firmware/tower/MR1819_tower.ino +++ b/software/firmware/archive/tower/MR1819_tower.ino @@ -1,340 +1,340 @@ -////////// Includes ////////// -#include -//#include -#include -//#include -#include -//#include -#include -FASTLED_USING_NAMESPACE - -//#define debug - -////////// Hardware / Data Enumerations ////////// -enum HARDWARE { - GPS_IMU_RS485_EN = 22, - GPS_IMU_RS485_RX = 0, - GPS_IMU_RS485_TX = 1, - - COMMS_RS485_EN = 2, - COMMS_RS485_RX = 7, - COMMS_RS485_TX = 8, - - GPS_UART_RX = 9, - GPS_UART_TX = 10, - - IMU_SDA = 18, - IMU_SCL = 19, - - NEO_PIXEL = 6, - - LED_BLUE_EXTRA = 13 -}; - -enum MODBUS_REGISTERS { - LED_CONTROL = 0, // Input -}; - -#define GPS_SERIAL_PORT Serial2 -#define GPS_IMU_STREAMING_PORT Serial1 -#define Num_Pixels 60 -#define Num_rainbow_pixles 57 - -////////// Global Variables ////////// -///// Modbus -const uint8_t node_id = 1; -const uint8_t mobus_serial_port_number = 3; - -uint16_t modbus_data[] = {0}; -uint8_t num_modbus_registers = 0; - -int8_t poll_state = 0; -bool communication_good = false; -uint8_t message_count = 0; - -///// GPS -char current_byte = '$'; -String nmea_sentence = ""; -char gps_buffer[255]; -unsigned char buffer_count = 0; - -///// LEDS -CRGB red = CRGB(255,0,0); -CRGB green = CRGB(0,255,0); -CRGB blue = CRGB(0,0,255); -CRGB orange = CRGB(255,20,0); -CRGB yellow = CRGB(255,130,0); -CRGB pink = CRGB(255,20,20); -CRGB purple = CRGB(60,0,50); -CRGB white = CRGB(255,255,255); -CRGB turquoise = CRGB(0,130,60); -CRGB leds[Num_Pixels]; -uint8_t gHue = 0; -unsigned long pixel_clock = 0 ; -int pixel_timer = 15; - - -////////// Class Instantiations ////////// -Modbus slave(node_id, mobus_serial_port_number, HARDWARE::COMMS_RS485_EN); - - -//Adafruit_NeoPixel strip(Num_Pixels, HARDWARE::NEO_PIXEL, NEO_GRB + NEO_KHZ800); - -const char baud115200[] = "PUBX,41,1,3,3,115200,0"; - -void setup() { - // Debugging - Serial.begin(9600); - // while (!Serial); - - // Raw pin setup - setup_hardware(); - - // Setup modbus serial communication - num_modbus_registers = sizeof(modbus_data) / sizeof(modbus_data[0]); - slave.begin(115200); // baud-rate at 115200 - slave.setTimeOut(1750); - - // GPS & IMU serial streaming setup - GPS_IMU_STREAMING_PORT.begin(115200); - GPS_IMU_STREAMING_PORT.transmitterEnable(HARDWARE::GPS_IMU_RS485_EN); - - - // GPS Setup - GPS_SERIAL_PORT.begin(9600); - - - -} - -void loop() { - // Reset JSON for next loop - StaticJsonBuffer<1000> jsonBuffer; - JsonObject& root = jsonBuffer.createObject(); - - // Do normal polling - poll_modbus(); - - set_leds(); - process_gps_and_send_if_ready(root); - - // Print JSON and newline - root.printTo(GPS_IMU_STREAMING_PORT); - GPS_IMU_STREAMING_PORT.println(); -} - -void setup_hardware() { - // Setup pins as inputs / outputs - pinMode(HARDWARE::LED_BLUE_EXTRA, OUTPUT); - - // Set default pin states - digitalWrite(HARDWARE::LED_BLUE_EXTRA, LOW); - - // Initialize Fast LED Object - FastLED.addLeds(leds, Num_Pixels).setCorrection(TypicalLEDStrip); - FastLED.setBrightness(120); -} - -void process_gps_and_send_if_ready(JsonObject &root) { - root["gps"] = ""; - - char num_in_bytes = GPS_SERIAL_PORT.available(); - - if (num_in_bytes > 0) { - for (char i = 0 ; i < num_in_bytes ; i++) { - char in_byte = GPS_SERIAL_PORT.read(); - - if (in_byte != '\n' && in_byte != '\r') { - gps_buffer[buffer_count] = in_byte; - buffer_count++; - } - - if (in_byte == '\r') { - gps_buffer[buffer_count] = '\0'; - root["gps"] = gps_buffer; - buffer_count = 0; - } - - } - } - -} - -void poll_modbus() { - poll_state = slave.poll(modbus_data, num_modbus_registers); - communication_good = !slave.getTimeOutState(); -} - -void rainbow() -{ - // FastLED's built-in rainbow generator - fill_rainbow( leds, Num_rainbow_pixles , gHue, 7); -} - -void rainbowWithGlitter() -{ - // built-in FastLED rainbow, plus some random sparkly glitter - rainbow(); - addGlitter(80); -} - -void addGlitter( fract8 chanceOfGlitter) -{ - if( random8() < chanceOfGlitter) { - leds[ random16(Num_rainbow_pixles) ] += CRGB::White; - } -} - -void confetti() -{ - // random colored speckles that blink in and fade smoothly - fadeToBlackBy( leds,Num_rainbow_pixles, 10); - int pos = random16(Num_rainbow_pixles); - leds[pos] += CHSV( gHue + random8(Num_rainbow_pixles), 200, 255); -} - -void sinelon() -{ - // a colored dot sweeping back and forth, with fadingtrails - fadeToBlackBy( leds, Num_rainbow_pixles, 20); - int pos = beatsin16( 13, 0, Num_rainbow_pixles-1 ); - leds[pos] += CHSV( gHue, 255, 192); -} - -void bpm() -{ - // colored stripes pulsing at a defined Beats-Per-Minute (BPM) - uint8_t BeatsPerMinute = 120; - CRGBPalette16 palette = PartyColors_p; - uint8_t beat = beatsin8( BeatsPerMinute, 64, 255); - for( int i = 0; i < Num_rainbow_pixles; i++) { //9948 - leds[i] = ColorFromPalette(palette, gHue+(i*2), beat-gHue+(i*10)); - } -} - -void juggle() { - // eight colored dots, weaving in and out of sync with each other - fadeToBlackBy( leds, Num_rainbow_pixles, 20); - byte dothue = 0; - for( int i = 0; i < 8; i++) { - leds[beatsin16( i+7, 0, Num_rainbow_pixles-1 )] |= CHSV(dothue, 200, 255); - dothue += 32; - } -} - - -void run_leds() { - if (millis() - pixel_clock > pixel_timer) { - - static uint8_t led = 0; - static uint8_t dir = 1; - leds[led] = CHSV(gHue, 240, 170); - for (int i = 0; i < Num_rainbow_pixles; i++) { - leds[i].nscale8(237 ); - } - if (led == Num_rainbow_pixles - 1) { - dir = -1; - } else if (led == 0) { - dir = 1; - } - led += dir; - gHue++; - pixel_clock = millis(); - } -} - -CRGB status_scale(int scale, int val){ - if(val < scale/2) - return CRGB(254,70*val*2/scale,0); - else if(val > scale/2) - return CRGB(255 - 255*(2*val-scale)/scale, 70+165*(2*val-scale)/scale, 0); - else - return yellow; -} - -void set_leds(){ - - EVERY_N_MILLISECONDS( 20 ) { gHue++; } - - // registers to store data - bool IMU_cals[] = {0,0,0}; - bool comms_status = communication_good; - uint8_t drive_state = 0; - uint8_t waypoint_state = 0; - uint8_t comms = 0; - uint8_t lights = 0; - - //int * color = blue; - - //collect data from modbus registers - for(int i=0;i<16;i++){ - if(i < 3) - IMU_cals[i] = bitRead(modbus_data[MODBUS_REGISTERS::LED_CONTROL], i); - else if(i>2 && i<5) - bitWrite(drive_state, i-3, bitRead(modbus_data[MODBUS_REGISTERS::LED_CONTROL], i)); - else if(i>4 && i<7) - bitWrite(waypoint_state, i-5, bitRead(modbus_data[MODBUS_REGISTERS::LED_CONTROL], i)); - else if(i>6 && i<11) - bitWrite(lights, i-7, bitRead(modbus_data[MODBUS_REGISTERS::LED_CONTROL], i)); - else if(i>10 && i<16) - bitWrite(comms, i-11, bitRead(modbus_data[MODBUS_REGISTERS::LED_CONTROL], i)); - } - - switch(lights){ - case 1: - rainbow(); - break; - case 2: - rainbowWithGlitter(); - break; - case 3: - confetti(); - break; - case 4: - sinelon(); - break; - case 5: - bpm(); - break; - case 6: - juggle(); - break; - case 0: - run_leds(); - break; - } - - if(!comms_status) - for(int i=57;i<60;i++) - leds[i] = purple; - else{ - switch(waypoint_state){ - case 0: - leds[57] = red; - break; - case 1: - leds[57] = yellow; - break; - case 2: - leds[57] = green; - break; - case 3: - leds[57] = blue; - break; - } - leds[58] = status_scale(32,comms); - switch(drive_state){ - case 0: - leds[59] = blue; - break; - case 1: - leds[59] = pink; - break; - case 2: - leds[59] = green; - break; - } - } - - FastLED.show(); -} +////////// Includes ////////// +#include +//#include +#include +//#include +#include +//#include +#include +FASTLED_USING_NAMESPACE + +//#define debug + +////////// Hardware / Data Enumerations ////////// +enum HARDWARE { + GPS_IMU_RS485_EN = 22, + GPS_IMU_RS485_RX = 0, + GPS_IMU_RS485_TX = 1, + + COMMS_RS485_EN = 2, + COMMS_RS485_RX = 7, + COMMS_RS485_TX = 8, + + GPS_UART_RX = 9, + GPS_UART_TX = 10, + + IMU_SDA = 18, + IMU_SCL = 19, + + NEO_PIXEL = 6, + + LED_BLUE_EXTRA = 13 +}; + +enum MODBUS_REGISTERS { + LED_CONTROL = 0, // Input +}; + +#define GPS_SERIAL_PORT Serial2 +#define GPS_IMU_STREAMING_PORT Serial1 +#define Num_Pixels 60 +#define Num_rainbow_pixles 57 + +////////// Global Variables ////////// +///// Modbus +const uint8_t node_id = 1; +const uint8_t mobus_serial_port_number = 3; + +uint16_t modbus_data[] = {0}; +uint8_t num_modbus_registers = 0; + +int8_t poll_state = 0; +bool communication_good = false; +uint8_t message_count = 0; + +///// GPS +char current_byte = '$'; +String nmea_sentence = ""; +char gps_buffer[255]; +unsigned char buffer_count = 0; + +///// LEDS +CRGB red = CRGB(255,0,0); +CRGB green = CRGB(0,255,0); +CRGB blue = CRGB(0,0,255); +CRGB orange = CRGB(255,20,0); +CRGB yellow = CRGB(255,130,0); +CRGB pink = CRGB(255,20,20); +CRGB purple = CRGB(60,0,50); +CRGB white = CRGB(255,255,255); +CRGB turquoise = CRGB(0,130,60); +CRGB leds[Num_Pixels]; +uint8_t gHue = 0; +unsigned long pixel_clock = 0 ; +int pixel_timer = 15; + + +////////// Class Instantiations ////////// +Modbus slave(node_id, mobus_serial_port_number, HARDWARE::COMMS_RS485_EN); + + +//Adafruit_NeoPixel strip(Num_Pixels, HARDWARE::NEO_PIXEL, NEO_GRB + NEO_KHZ800); + +const char baud115200[] = "PUBX,41,1,3,3,115200,0"; + +void setup() { + // Debugging + Serial.begin(9600); + // while (!Serial); + + // Raw pin setup + setup_hardware(); + + // Setup modbus serial communication + num_modbus_registers = sizeof(modbus_data) / sizeof(modbus_data[0]); + slave.begin(115200); // baud-rate at 115200 + slave.setTimeOut(1750); + + // GPS & IMU serial streaming setup + GPS_IMU_STREAMING_PORT.begin(115200); + GPS_IMU_STREAMING_PORT.transmitterEnable(HARDWARE::GPS_IMU_RS485_EN); + + + // GPS Setup + GPS_SERIAL_PORT.begin(9600); + + + +} + +void loop() { + // Reset JSON for next loop + StaticJsonBuffer<1000> jsonBuffer; + JsonObject& root = jsonBuffer.createObject(); + + // Do normal polling + poll_modbus(); + + set_leds(); + process_gps_and_send_if_ready(root); + + // Print JSON and newline + root.printTo(GPS_IMU_STREAMING_PORT); + GPS_IMU_STREAMING_PORT.println(); +} + +void setup_hardware() { + // Setup pins as inputs / outputs + pinMode(HARDWARE::LED_BLUE_EXTRA, OUTPUT); + + // Set default pin states + digitalWrite(HARDWARE::LED_BLUE_EXTRA, LOW); + + // Initialize Fast LED Object + FastLED.addLeds(leds, Num_Pixels).setCorrection(TypicalLEDStrip); + FastLED.setBrightness(120); +} + +void process_gps_and_send_if_ready(JsonObject &root) { + root["gps"] = ""; + + char num_in_bytes = GPS_SERIAL_PORT.available(); + + if (num_in_bytes > 0) { + for (char i = 0 ; i < num_in_bytes ; i++) { + char in_byte = GPS_SERIAL_PORT.read(); + + if (in_byte != '\n' && in_byte != '\r') { + gps_buffer[buffer_count] = in_byte; + buffer_count++; + } + + if (in_byte == '\r') { + gps_buffer[buffer_count] = '\0'; + root["gps"] = gps_buffer; + buffer_count = 0; + } + + } + } + +} + +void poll_modbus() { + poll_state = slave.poll(modbus_data, num_modbus_registers); + communication_good = !slave.getTimeOutState(); +} + +void rainbow() +{ + // FastLED's built-in rainbow generator + fill_rainbow( leds, Num_rainbow_pixles , gHue, 7); +} + +void rainbowWithGlitter() +{ + // built-in FastLED rainbow, plus some random sparkly glitter + rainbow(); + addGlitter(80); +} + +void addGlitter( fract8 chanceOfGlitter) +{ + if( random8() < chanceOfGlitter) { + leds[ random16(Num_rainbow_pixles) ] += CRGB::White; + } +} + +void confetti() +{ + // random colored speckles that blink in and fade smoothly + fadeToBlackBy( leds,Num_rainbow_pixles, 10); + int pos = random16(Num_rainbow_pixles); + leds[pos] += CHSV( gHue + random8(Num_rainbow_pixles), 200, 255); +} + +void sinelon() +{ + // a colored dot sweeping back and forth, with fadingtrails + fadeToBlackBy( leds, Num_rainbow_pixles, 20); + int pos = beatsin16( 13, 0, Num_rainbow_pixles-1 ); + leds[pos] += CHSV( gHue, 255, 192); +} + +void bpm() +{ + // colored stripes pulsing at a defined Beats-Per-Minute (BPM) + uint8_t BeatsPerMinute = 120; + CRGBPalette16 palette = PartyColors_p; + uint8_t beat = beatsin8( BeatsPerMinute, 64, 255); + for( int i = 0; i < Num_rainbow_pixles; i++) { //9948 + leds[i] = ColorFromPalette(palette, gHue+(i*2), beat-gHue+(i*10)); + } +} + +void juggle() { + // eight colored dots, weaving in and out of sync with each other + fadeToBlackBy( leds, Num_rainbow_pixles, 20); + byte dothue = 0; + for( int i = 0; i < 8; i++) { + leds[beatsin16( i+7, 0, Num_rainbow_pixles-1 )] |= CHSV(dothue, 200, 255); + dothue += 32; + } +} + + +void run_leds() { + if (millis() - pixel_clock > pixel_timer) { + + static uint8_t led = 0; + static uint8_t dir = 1; + leds[led] = CHSV(gHue, 240, 170); + for (int i = 0; i < Num_rainbow_pixles; i++) { + leds[i].nscale8(237 ); + } + if (led == Num_rainbow_pixles - 1) { + dir = -1; + } else if (led == 0) { + dir = 1; + } + led += dir; + gHue++; + pixel_clock = millis(); + } +} + +CRGB status_scale(int scale, int val){ + if(val < scale/2) + return CRGB(254,70*val*2/scale,0); + else if(val > scale/2) + return CRGB(255 - 255*(2*val-scale)/scale, 70+165*(2*val-scale)/scale, 0); + else + return yellow; +} + +void set_leds(){ + + EVERY_N_MILLISECONDS( 20 ) { gHue++; } + + // registers to store data + bool IMU_cals[] = {0,0,0}; + bool comms_status = communication_good; + uint8_t drive_state = 0; + uint8_t waypoint_state = 0; + uint8_t comms = 0; + uint8_t lights = 0; + + //int * color = blue; + + //collect data from modbus registers + for(int i=0;i<16;i++){ + if(i < 3) + IMU_cals[i] = bitRead(modbus_data[MODBUS_REGISTERS::LED_CONTROL], i); + else if(i>2 && i<5) + bitWrite(drive_state, i-3, bitRead(modbus_data[MODBUS_REGISTERS::LED_CONTROL], i)); + else if(i>4 && i<7) + bitWrite(waypoint_state, i-5, bitRead(modbus_data[MODBUS_REGISTERS::LED_CONTROL], i)); + else if(i>6 && i<11) + bitWrite(lights, i-7, bitRead(modbus_data[MODBUS_REGISTERS::LED_CONTROL], i)); + else if(i>10 && i<16) + bitWrite(comms, i-11, bitRead(modbus_data[MODBUS_REGISTERS::LED_CONTROL], i)); + } + + switch(lights){ + case 1: + rainbow(); + break; + case 2: + rainbowWithGlitter(); + break; + case 3: + confetti(); + break; + case 4: + sinelon(); + break; + case 5: + bpm(); + break; + case 6: + juggle(); + break; + case 0: + run_leds(); + break; + } + + if(!comms_status) + for(int i=57;i<60;i++) + leds[i] = purple; + else{ + switch(waypoint_state){ + case 0: + leds[57] = red; + break; + case 1: + leds[57] = yellow; + break; + case 2: + leds[57] = green; + break; + case 3: + leds[57] = blue; + break; + } + leds[58] = status_scale(32,comms); + switch(drive_state){ + case 0: + leds[59] = blue; + break; + case 1: + leds[59] = pink; + break; + case 2: + leds[59] = green; + break; + } + } + + FastLED.show(); +} diff --git a/software/firmware/tower_pan_tilt/MR1819_tower_pan_tilt.ino b/software/firmware/archive/tower_pan_tilt/MR1819_tower_pan_tilt.ino similarity index 100% rename from software/firmware/tower_pan_tilt/MR1819_tower_pan_tilt.ino rename to software/firmware/archive/tower_pan_tilt/MR1819_tower_pan_tilt.ino diff --git a/software/firmware/irisV2/irisV2.ino b/software/firmware/irisV2/irisV2.ino new file mode 100644 index 0000000..4264228 --- /dev/null +++ b/software/firmware/irisV2/irisV2.ino @@ -0,0 +1,152 @@ +////////// Includes ////////// +#include "SBUS.h" +#include +#include +#define RS485 Serial1 +//#define POTHOS_DEBUG + +////////// Hardware / Data Enumerations ////////// + +enum REGISTER{ + CH1 = 0, + CH2 = 1, + CH3 = 2, + CH4 = 3, + CH5 = 4, + CH6 = 5, + CH7 = 6, + CH8 = 7, + CH9 = 8, + CH10 = 9, + CH11 = 10, + CH12 = 11, + CH13 = 12, + CH14 = 13, + CH15 = 14, + CH16 = 15, + ENC1 = 16, + ENC2 = 17 +}; + +enum HARDWARE{ + BLUE_LED = 13, + EN485 = 2, + ENC1A = 11, + ENC1B = 12, + ENC2A = 14, + ENC2B = 15, + SEGEN = 24, + SEG01 = 25, + SEG11 = 26, + SEG21 = 27, + SEG31 = 28, + SEG02 = 29, + SEG12 = 30, + SEG22 = 31, + SEG32 = 32 +}; + +////////// Global Variables ////////// +uint8_t node_id = 0; +uint8_t pothosTimeout = 50; + +//Sbus Channels +uint16_t channels[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +//Sbus Variables +uint8_t failSafe; +uint16_t lostFrames = 0; +#define SBUS_HARDWARE_PORT Serial3 + +long Enc1_pos; +long ENC2_pos; + +////////// Class Instantiations ////////// +SBUS x8r(SBUS_HARDWARE_PORT); +pothos comms(node_id, HARDWARE::EN485, pothosTimeout); //init the pothos library +Encoder Enc1(HARDWARE::ENC1A, HARDWARE::ENC1B); +Encoder Enc2(HARDWARE::ENC2A, HARDWARE::ENC2B); + +void setup() { + setup_hardware(); + x8r.begin(); + + comms.setup(500000); + + #ifdef POTHOS_DEBUG + Serial.begin(115200); + #endif + + setDataTypes(); +} + +void loop() { + comms.update(); + poll_sbus(); + poll_encoders(); + set_leds(); + register_data(); +} + +void setup_hardware(){ + pinMode(HARDWARE::ENC1A, INPUT); + pinMode(HARDWARE::ENC1B, INPUT); + pinMode(HARDWARE::ENC2A, INPUT); + pinMode(HARDWARE::ENC2B, INPUT); + + pinMode(HARDWARE::SEGEN, OUTPUT); + pinMode(HARDWARE::SEG01, OUTPUT); + pinMode(HARDWARE::SEG11, OUTPUT); + pinMode(HARDWARE::SEG21, OUTPUT); + pinMode(HARDWARE::SEG31, OUTPUT); + pinMode(HARDWARE::SEG02, OUTPUT); + pinMode(HARDWARE::SEG12, OUTPUT); + pinMode(HARDWARE::SEG22, OUTPUT); + pinMode(HARDWARE::SEG32, OUTPUT); + pinMode(HARDWARE::BLUE_LED, OUTPUT); + // Set default pin states + + digitalWrite(HARDWARE::BLUE_LED, LOW); +} + +void poll_sbus(){ + x8r.read(&channels[0], &failSafe, &lostFrames); +} + +void set_leds(){ + int i = 0; +} + +void poll_encoders(){ + Enc1_pos = Enc1.read(); + Enc2_pos = Enc2.read(); +} + +void register_data(){ + comms.data.set_data(REGISTER::ENC1, Enc1_Pos); + comms.data.set_data(REGISTER::ENC2, Enc2_Pos); + for(int i=REGISTER::CH1;i<=REGISTER::CH16;i++){ + comms.data.set_data(i, channels[i]); + } +} + +void setDataTypes(){ //This function is for setting the data type of each register + comms.data.set_type(REGISTER::CH1, "int"); + comms.data.set_type(REGISTER::CH2, "int"); + comms.data.set_type(REGISTER::CH3, "int"); + comms.data.set_type(REGISTER::CH4, "int"); + comms.data.set_type(REGISTER::CH5, "int"); + comms.data.set_type(REGISTER::CH6, "int"); + comms.data.set_type(REGISTER::CH7, "int"); + comms.data.set_type(REGISTER::CH8, "int"); + comms.data.set_type(REGISTER::CH9, "int"); + comms.data.set_type(REGISTER::CH10, "int"); + comms.data.set_type(REGISTER::CH11, "int"); + comms.data.set_type(REGISTER::CH12, "int"); + comms.data.set_type(REGISTER::CH13, "int"); + comms.data.set_type(REGISTER::CH14, "int"); + comms.data.set_type(REGISTER::CH15, "int"); + comms.data.set_type(REGISTER::CH16, "int"); + comms.data.set_type(REGISTER::ENC1, "long"); + comms.data.set_type(REGISTER::ENC2, "long"); +} diff --git a/software/firmware/libraries/ArduinoJson.zip b/software/firmware/libraries/ArduinoJson.zip new file mode 100644 index 0000000..2cc1c2e Binary files /dev/null and b/software/firmware/libraries/ArduinoJson.zip differ diff --git a/software/firmware/libraries/Encoder-master.zip b/software/firmware/libraries/Encoder-master.zip new file mode 100644 index 0000000..65e2179 Binary files /dev/null and b/software/firmware/libraries/Encoder-master.zip differ diff --git a/software/firmware/libraries/Encoder-master/Encoder.cpp b/software/firmware/libraries/Encoder-master/Encoder.cpp new file mode 100644 index 0000000..6911b4f --- /dev/null +++ b/software/firmware/libraries/Encoder-master/Encoder.cpp @@ -0,0 +1,10 @@ + +#include "Encoder.h" + +// Yes, all the code is in the header file, to provide the user +// configure options with #define (before they include it), and +// to facilitate some crafty optimizations! + +Encoder_internal_state_t * Encoder::interruptArgs[]; + + diff --git a/software/firmware/libraries/Encoder-master/Encoder.h b/software/firmware/libraries/Encoder-master/Encoder.h new file mode 100644 index 0000000..80f476d --- /dev/null +++ b/software/firmware/libraries/Encoder-master/Encoder.h @@ -0,0 +1,976 @@ +/* Encoder Library, for measuring quadrature encoded signals + * http://www.pjrc.com/teensy/td_libs_Encoder.html + * Copyright (c) 2011,2013 PJRC.COM, LLC - Paul Stoffregen + * + * Version 1.2 - fix -2 bug in C-only code + * Version 1.1 - expand to support boards with up to 60 interrupts + * Version 1.0 - initial release + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#ifndef Encoder_h_ +#define Encoder_h_ + +#if defined(ARDUINO) && ARDUINO >= 100 +#include "Arduino.h" +#elif defined(WIRING) +#include "Wiring.h" +#else +#include "WProgram.h" +#include "pins_arduino.h" +#endif + +#include "utility/direct_pin_read.h" + +#if defined(ENCODER_USE_INTERRUPTS) || !defined(ENCODER_DO_NOT_USE_INTERRUPTS) +#define ENCODER_USE_INTERRUPTS +#define ENCODER_ARGLIST_SIZE CORE_NUM_INTERRUPT +#include "utility/interrupt_pins.h" +#ifdef ENCODER_OPTIMIZE_INTERRUPTS +#include "utility/interrupt_config.h" +#endif +#else +#define ENCODER_ARGLIST_SIZE 0 +#endif + +// Use ICACHE_RAM_ATTR for ISRs to prevent ESP8266 resets +#if defined(ESP8266) || defined(ESP32) +#define ENCODER_ISR_ATTR ICACHE_RAM_ATTR +#else +#define ENCODER_ISR_ATTR +#endif + + + +// All the data needed by interrupts is consolidated into this ugly struct +// to facilitate assembly language optimizing of the speed critical update. +// The assembly code uses auto-incrementing addressing modes, so the struct +// must remain in exactly this order. +typedef struct { + volatile IO_REG_TYPE * pin1_register; + volatile IO_REG_TYPE * pin2_register; + IO_REG_TYPE pin1_bitmask; + IO_REG_TYPE pin2_bitmask; + uint8_t state; + int32_t position; +} Encoder_internal_state_t; + +class Encoder +{ +public: + Encoder(uint8_t pin1, uint8_t pin2) { + #ifdef INPUT_PULLUP + pinMode(pin1, INPUT_PULLUP); + pinMode(pin2, INPUT_PULLUP); + #else + pinMode(pin1, INPUT); + digitalWrite(pin1, HIGH); + pinMode(pin2, INPUT); + digitalWrite(pin2, HIGH); + #endif + encoder.pin1_register = PIN_TO_BASEREG(pin1); + encoder.pin1_bitmask = PIN_TO_BITMASK(pin1); + encoder.pin2_register = PIN_TO_BASEREG(pin2); + encoder.pin2_bitmask = PIN_TO_BITMASK(pin2); + encoder.position = 0; + // allow time for a passive R-C filter to charge + // through the pullup resistors, before reading + // the initial state + delayMicroseconds(2000); + uint8_t s = 0; + if (DIRECT_PIN_READ(encoder.pin1_register, encoder.pin1_bitmask)) s |= 1; + if (DIRECT_PIN_READ(encoder.pin2_register, encoder.pin2_bitmask)) s |= 2; + encoder.state = s; +#ifdef ENCODER_USE_INTERRUPTS + interrupts_in_use = attach_interrupt(pin1, &encoder); + interrupts_in_use += attach_interrupt(pin2, &encoder); +#endif + //update_finishup(); // to force linker to include the code (does not work) + } + + +#ifdef ENCODER_USE_INTERRUPTS + inline int32_t read() { + if (interrupts_in_use < 2) { + noInterrupts(); + update(&encoder); + } else { + noInterrupts(); + } + int32_t ret = encoder.position; + interrupts(); + return ret; + } + inline int32_t readAndReset() { + if (interrupts_in_use < 2) { + noInterrupts(); + update(&encoder); + } else { + noInterrupts(); + } + int32_t ret = encoder.position; + encoder.position = 0; + interrupts(); + return ret; + } + inline void write(int32_t p) { + noInterrupts(); + encoder.position = p; + interrupts(); + } +#else + inline int32_t read() { + update(&encoder); + return encoder.position; + } + inline int32_t readAndReset() { + update(&encoder); + int32_t ret = encoder.position; + encoder.position = 0; + return ret; + } + inline void write(int32_t p) { + encoder.position = p; + } +#endif +private: + Encoder_internal_state_t encoder; +#ifdef ENCODER_USE_INTERRUPTS + uint8_t interrupts_in_use; +#endif +public: + static Encoder_internal_state_t * interruptArgs[ENCODER_ARGLIST_SIZE]; + +// _______ _______ +// Pin1 ______| |_______| |______ Pin1 +// negative <--- _______ _______ __ --> positive +// Pin2 __| |_______| |_______| Pin2 + + // new new old old + // pin2 pin1 pin2 pin1 Result + // ---- ---- ---- ---- ------ + // 0 0 0 0 no movement + // 0 0 0 1 +1 + // 0 0 1 0 -1 + // 0 0 1 1 +2 (assume pin1 edges only) + // 0 1 0 0 -1 + // 0 1 0 1 no movement + // 0 1 1 0 -2 (assume pin1 edges only) + // 0 1 1 1 +1 + // 1 0 0 0 +1 + // 1 0 0 1 -2 (assume pin1 edges only) + // 1 0 1 0 no movement + // 1 0 1 1 -1 + // 1 1 0 0 +2 (assume pin1 edges only) + // 1 1 0 1 -1 + // 1 1 1 0 +1 + // 1 1 1 1 no movement +/* + // Simple, easy-to-read "documentation" version :-) + // + void update(void) { + uint8_t s = state & 3; + if (digitalRead(pin1)) s |= 4; + if (digitalRead(pin2)) s |= 8; + switch (s) { + case 0: case 5: case 10: case 15: + break; + case 1: case 7: case 8: case 14: + position++; break; + case 2: case 4: case 11: case 13: + position--; break; + case 3: case 12: + position += 2; break; + default: + position -= 2; break; + } + state = (s >> 2); + } +*/ + +public: + // update() is not meant to be called from outside Encoder, + // but it is public to allow static interrupt routines. + // DO NOT call update() directly from sketches. + static void update(Encoder_internal_state_t *arg) { +#if defined(__AVR__) + // The compiler believes this is just 1 line of code, so + // it will inline this function into each interrupt + // handler. That's a tiny bit faster, but grows the code. + // Especially when used with ENCODER_OPTIMIZE_INTERRUPTS, + // the inline nature allows the ISR prologue and epilogue + // to only save/restore necessary registers, for very nice + // speed increase. + asm volatile ( + "ld r30, X+" "\n\t" + "ld r31, X+" "\n\t" + "ld r24, Z" "\n\t" // r24 = pin1 input + "ld r30, X+" "\n\t" + "ld r31, X+" "\n\t" + "ld r25, Z" "\n\t" // r25 = pin2 input + "ld r30, X+" "\n\t" // r30 = pin1 mask + "ld r31, X+" "\n\t" // r31 = pin2 mask + "ld r22, X" "\n\t" // r22 = state + "andi r22, 3" "\n\t" + "and r24, r30" "\n\t" + "breq L%=1" "\n\t" // if (pin1) + "ori r22, 4" "\n\t" // state |= 4 + "L%=1:" "and r25, r31" "\n\t" + "breq L%=2" "\n\t" // if (pin2) + "ori r22, 8" "\n\t" // state |= 8 + "L%=2:" "ldi r30, lo8(pm(L%=table))" "\n\t" + "ldi r31, hi8(pm(L%=table))" "\n\t" + "add r30, r22" "\n\t" + "adc r31, __zero_reg__" "\n\t" + "asr r22" "\n\t" + "asr r22" "\n\t" + "st X+, r22" "\n\t" // store new state + "ld r22, X+" "\n\t" + "ld r23, X+" "\n\t" + "ld r24, X+" "\n\t" + "ld r25, X+" "\n\t" + "ijmp" "\n\t" // jumps to update_finishup() + // TODO move this table to another static function, + // so it doesn't get needlessly duplicated. Easier + // said than done, due to linker issues and inlining + "L%=table:" "\n\t" + "rjmp L%=end" "\n\t" // 0 + "rjmp L%=plus1" "\n\t" // 1 + "rjmp L%=minus1" "\n\t" // 2 + "rjmp L%=plus2" "\n\t" // 3 + "rjmp L%=minus1" "\n\t" // 4 + "rjmp L%=end" "\n\t" // 5 + "rjmp L%=minus2" "\n\t" // 6 + "rjmp L%=plus1" "\n\t" // 7 + "rjmp L%=plus1" "\n\t" // 8 + "rjmp L%=minus2" "\n\t" // 9 + "rjmp L%=end" "\n\t" // 10 + "rjmp L%=minus1" "\n\t" // 11 + "rjmp L%=plus2" "\n\t" // 12 + "rjmp L%=minus1" "\n\t" // 13 + "rjmp L%=plus1" "\n\t" // 14 + "rjmp L%=end" "\n\t" // 15 + "L%=minus2:" "\n\t" + "subi r22, 2" "\n\t" + "sbci r23, 0" "\n\t" + "sbci r24, 0" "\n\t" + "sbci r25, 0" "\n\t" + "rjmp L%=store" "\n\t" + "L%=minus1:" "\n\t" + "subi r22, 1" "\n\t" + "sbci r23, 0" "\n\t" + "sbci r24, 0" "\n\t" + "sbci r25, 0" "\n\t" + "rjmp L%=store" "\n\t" + "L%=plus2:" "\n\t" + "subi r22, 254" "\n\t" + "rjmp L%=z" "\n\t" + "L%=plus1:" "\n\t" + "subi r22, 255" "\n\t" + "L%=z:" "sbci r23, 255" "\n\t" + "sbci r24, 255" "\n\t" + "sbci r25, 255" "\n\t" + "L%=store:" "\n\t" + "st -X, r25" "\n\t" + "st -X, r24" "\n\t" + "st -X, r23" "\n\t" + "st -X, r22" "\n\t" + "L%=end:" "\n" + : : "x" (arg) : "r22", "r23", "r24", "r25", "r30", "r31"); +#else + uint8_t p1val = DIRECT_PIN_READ(arg->pin1_register, arg->pin1_bitmask); + uint8_t p2val = DIRECT_PIN_READ(arg->pin2_register, arg->pin2_bitmask); + uint8_t state = arg->state & 3; + if (p1val) state |= 4; + if (p2val) state |= 8; + arg->state = (state >> 2); + switch (state) { + case 1: case 7: case 8: case 14: + arg->position++; + return; + case 2: case 4: case 11: case 13: + arg->position--; + return; + case 3: case 12: + arg->position += 2; + return; + case 6: case 9: + arg->position -= 2; + return; + } +#endif + } +private: +/* +#if defined(__AVR__) + // TODO: this must be a no inline function + // even noinline does not seem to solve difficult + // problems with this. Oh well, it was only meant + // to shrink code size - there's no performance + // improvement in this, only code size reduction. + __attribute__((noinline)) void update_finishup(void) { + asm volatile ( + "ldi r30, lo8(pm(Ltable))" "\n\t" + "ldi r31, hi8(pm(Ltable))" "\n\t" + "Ltable:" "\n\t" + "rjmp L%=end" "\n\t" // 0 + "rjmp L%=plus1" "\n\t" // 1 + "rjmp L%=minus1" "\n\t" // 2 + "rjmp L%=plus2" "\n\t" // 3 + "rjmp L%=minus1" "\n\t" // 4 + "rjmp L%=end" "\n\t" // 5 + "rjmp L%=minus2" "\n\t" // 6 + "rjmp L%=plus1" "\n\t" // 7 + "rjmp L%=plus1" "\n\t" // 8 + "rjmp L%=minus2" "\n\t" // 9 + "rjmp L%=end" "\n\t" // 10 + "rjmp L%=minus1" "\n\t" // 11 + "rjmp L%=plus2" "\n\t" // 12 + "rjmp L%=minus1" "\n\t" // 13 + "rjmp L%=plus1" "\n\t" // 14 + "rjmp L%=end" "\n\t" // 15 + "L%=minus2:" "\n\t" + "subi r22, 2" "\n\t" + "sbci r23, 0" "\n\t" + "sbci r24, 0" "\n\t" + "sbci r25, 0" "\n\t" + "rjmp L%=store" "\n\t" + "L%=minus1:" "\n\t" + "subi r22, 1" "\n\t" + "sbci r23, 0" "\n\t" + "sbci r24, 0" "\n\t" + "sbci r25, 0" "\n\t" + "rjmp L%=store" "\n\t" + "L%=plus2:" "\n\t" + "subi r22, 254" "\n\t" + "rjmp L%=z" "\n\t" + "L%=plus1:" "\n\t" + "subi r22, 255" "\n\t" + "L%=z:" "sbci r23, 255" "\n\t" + "sbci r24, 255" "\n\t" + "sbci r25, 255" "\n\t" + "L%=store:" "\n\t" + "st -X, r25" "\n\t" + "st -X, r24" "\n\t" + "st -X, r23" "\n\t" + "st -X, r22" "\n\t" + "L%=end:" "\n" + : : : "r22", "r23", "r24", "r25", "r30", "r31"); + } +#endif +*/ + + +#ifdef ENCODER_USE_INTERRUPTS + // this giant function is an unfortunate consequence of Arduino's + // attachInterrupt function not supporting any way to pass a pointer + // or other context to the attached function. + static uint8_t attach_interrupt(uint8_t pin, Encoder_internal_state_t *state) { + switch (pin) { + #ifdef CORE_INT0_PIN + case CORE_INT0_PIN: + interruptArgs[0] = state; + attachInterrupt(0, isr0, CHANGE); + break; + #endif + #ifdef CORE_INT1_PIN + case CORE_INT1_PIN: + interruptArgs[1] = state; + attachInterrupt(1, isr1, CHANGE); + break; + #endif + #ifdef CORE_INT2_PIN + case CORE_INT2_PIN: + interruptArgs[2] = state; + attachInterrupt(2, isr2, CHANGE); + break; + #endif + #ifdef CORE_INT3_PIN + case CORE_INT3_PIN: + interruptArgs[3] = state; + attachInterrupt(3, isr3, CHANGE); + break; + #endif + #ifdef CORE_INT4_PIN + case CORE_INT4_PIN: + interruptArgs[4] = state; + attachInterrupt(4, isr4, CHANGE); + break; + #endif + #ifdef CORE_INT5_PIN + case CORE_INT5_PIN: + interruptArgs[5] = state; + attachInterrupt(5, isr5, CHANGE); + break; + #endif + #ifdef CORE_INT6_PIN + case CORE_INT6_PIN: + interruptArgs[6] = state; + attachInterrupt(6, isr6, CHANGE); + break; + #endif + #ifdef CORE_INT7_PIN + case CORE_INT7_PIN: + interruptArgs[7] = state; + attachInterrupt(7, isr7, CHANGE); + break; + #endif + #ifdef CORE_INT8_PIN + case CORE_INT8_PIN: + interruptArgs[8] = state; + attachInterrupt(8, isr8, CHANGE); + break; + #endif + #ifdef CORE_INT9_PIN + case CORE_INT9_PIN: + interruptArgs[9] = state; + attachInterrupt(9, isr9, CHANGE); + break; + #endif + #ifdef CORE_INT10_PIN + case CORE_INT10_PIN: + interruptArgs[10] = state; + attachInterrupt(10, isr10, CHANGE); + break; + #endif + #ifdef CORE_INT11_PIN + case CORE_INT11_PIN: + interruptArgs[11] = state; + attachInterrupt(11, isr11, CHANGE); + break; + #endif + #ifdef CORE_INT12_PIN + case CORE_INT12_PIN: + interruptArgs[12] = state; + attachInterrupt(12, isr12, CHANGE); + break; + #endif + #ifdef CORE_INT13_PIN + case CORE_INT13_PIN: + interruptArgs[13] = state; + attachInterrupt(13, isr13, CHANGE); + break; + #endif + #ifdef CORE_INT14_PIN + case CORE_INT14_PIN: + interruptArgs[14] = state; + attachInterrupt(14, isr14, CHANGE); + break; + #endif + #ifdef CORE_INT15_PIN + case CORE_INT15_PIN: + interruptArgs[15] = state; + attachInterrupt(15, isr15, CHANGE); + break; + #endif + #ifdef CORE_INT16_PIN + case CORE_INT16_PIN: + interruptArgs[16] = state; + attachInterrupt(16, isr16, CHANGE); + break; + #endif + #ifdef CORE_INT17_PIN + case CORE_INT17_PIN: + interruptArgs[17] = state; + attachInterrupt(17, isr17, CHANGE); + break; + #endif + #ifdef CORE_INT18_PIN + case CORE_INT18_PIN: + interruptArgs[18] = state; + attachInterrupt(18, isr18, CHANGE); + break; + #endif + #ifdef CORE_INT19_PIN + case CORE_INT19_PIN: + interruptArgs[19] = state; + attachInterrupt(19, isr19, CHANGE); + break; + #endif + #ifdef CORE_INT20_PIN + case CORE_INT20_PIN: + interruptArgs[20] = state; + attachInterrupt(20, isr20, CHANGE); + break; + #endif + #ifdef CORE_INT21_PIN + case CORE_INT21_PIN: + interruptArgs[21] = state; + attachInterrupt(21, isr21, CHANGE); + break; + #endif + #ifdef CORE_INT22_PIN + case CORE_INT22_PIN: + interruptArgs[22] = state; + attachInterrupt(22, isr22, CHANGE); + break; + #endif + #ifdef CORE_INT23_PIN + case CORE_INT23_PIN: + interruptArgs[23] = state; + attachInterrupt(23, isr23, CHANGE); + break; + #endif + #ifdef CORE_INT24_PIN + case CORE_INT24_PIN: + interruptArgs[24] = state; + attachInterrupt(24, isr24, CHANGE); + break; + #endif + #ifdef CORE_INT25_PIN + case CORE_INT25_PIN: + interruptArgs[25] = state; + attachInterrupt(25, isr25, CHANGE); + break; + #endif + #ifdef CORE_INT26_PIN + case CORE_INT26_PIN: + interruptArgs[26] = state; + attachInterrupt(26, isr26, CHANGE); + break; + #endif + #ifdef CORE_INT27_PIN + case CORE_INT27_PIN: + interruptArgs[27] = state; + attachInterrupt(27, isr27, CHANGE); + break; + #endif + #ifdef CORE_INT28_PIN + case CORE_INT28_PIN: + interruptArgs[28] = state; + attachInterrupt(28, isr28, CHANGE); + break; + #endif + #ifdef CORE_INT29_PIN + case CORE_INT29_PIN: + interruptArgs[29] = state; + attachInterrupt(29, isr29, CHANGE); + break; + #endif + + #ifdef CORE_INT30_PIN + case CORE_INT30_PIN: + interruptArgs[30] = state; + attachInterrupt(30, isr30, CHANGE); + break; + #endif + #ifdef CORE_INT31_PIN + case CORE_INT31_PIN: + interruptArgs[31] = state; + attachInterrupt(31, isr31, CHANGE); + break; + #endif + #ifdef CORE_INT32_PIN + case CORE_INT32_PIN: + interruptArgs[32] = state; + attachInterrupt(32, isr32, CHANGE); + break; + #endif + #ifdef CORE_INT33_PIN + case CORE_INT33_PIN: + interruptArgs[33] = state; + attachInterrupt(33, isr33, CHANGE); + break; + #endif + #ifdef CORE_INT34_PIN + case CORE_INT34_PIN: + interruptArgs[34] = state; + attachInterrupt(34, isr34, CHANGE); + break; + #endif + #ifdef CORE_INT35_PIN + case CORE_INT35_PIN: + interruptArgs[35] = state; + attachInterrupt(35, isr35, CHANGE); + break; + #endif + #ifdef CORE_INT36_PIN + case CORE_INT36_PIN: + interruptArgs[36] = state; + attachInterrupt(36, isr36, CHANGE); + break; + #endif + #ifdef CORE_INT37_PIN + case CORE_INT37_PIN: + interruptArgs[37] = state; + attachInterrupt(37, isr37, CHANGE); + break; + #endif + #ifdef CORE_INT38_PIN + case CORE_INT38_PIN: + interruptArgs[38] = state; + attachInterrupt(38, isr38, CHANGE); + break; + #endif + #ifdef CORE_INT39_PIN + case CORE_INT39_PIN: + interruptArgs[39] = state; + attachInterrupt(39, isr39, CHANGE); + break; + #endif + #ifdef CORE_INT40_PIN + case CORE_INT40_PIN: + interruptArgs[40] = state; + attachInterrupt(40, isr40, CHANGE); + break; + #endif + #ifdef CORE_INT41_PIN + case CORE_INT41_PIN: + interruptArgs[41] = state; + attachInterrupt(41, isr41, CHANGE); + break; + #endif + #ifdef CORE_INT42_PIN + case CORE_INT42_PIN: + interruptArgs[42] = state; + attachInterrupt(42, isr42, CHANGE); + break; + #endif + #ifdef CORE_INT43_PIN + case CORE_INT43_PIN: + interruptArgs[43] = state; + attachInterrupt(43, isr43, CHANGE); + break; + #endif + #ifdef CORE_INT44_PIN + case CORE_INT44_PIN: + interruptArgs[44] = state; + attachInterrupt(44, isr44, CHANGE); + break; + #endif + #ifdef CORE_INT45_PIN + case CORE_INT45_PIN: + interruptArgs[45] = state; + attachInterrupt(45, isr45, CHANGE); + break; + #endif + #ifdef CORE_INT46_PIN + case CORE_INT46_PIN: + interruptArgs[46] = state; + attachInterrupt(46, isr46, CHANGE); + break; + #endif + #ifdef CORE_INT47_PIN + case CORE_INT47_PIN: + interruptArgs[47] = state; + attachInterrupt(47, isr47, CHANGE); + break; + #endif + #ifdef CORE_INT48_PIN + case CORE_INT48_PIN: + interruptArgs[48] = state; + attachInterrupt(48, isr48, CHANGE); + break; + #endif + #ifdef CORE_INT49_PIN + case CORE_INT49_PIN: + interruptArgs[49] = state; + attachInterrupt(49, isr49, CHANGE); + break; + #endif + #ifdef CORE_INT50_PIN + case CORE_INT50_PIN: + interruptArgs[50] = state; + attachInterrupt(50, isr50, CHANGE); + break; + #endif + #ifdef CORE_INT51_PIN + case CORE_INT51_PIN: + interruptArgs[51] = state; + attachInterrupt(51, isr51, CHANGE); + break; + #endif + #ifdef CORE_INT52_PIN + case CORE_INT52_PIN: + interruptArgs[52] = state; + attachInterrupt(52, isr52, CHANGE); + break; + #endif + #ifdef CORE_INT53_PIN + case CORE_INT53_PIN: + interruptArgs[53] = state; + attachInterrupt(53, isr53, CHANGE); + break; + #endif + #ifdef CORE_INT54_PIN + case CORE_INT54_PIN: + interruptArgs[54] = state; + attachInterrupt(54, isr54, CHANGE); + break; + #endif + #ifdef CORE_INT55_PIN + case CORE_INT55_PIN: + interruptArgs[55] = state; + attachInterrupt(55, isr55, CHANGE); + break; + #endif + #ifdef CORE_INT56_PIN + case CORE_INT56_PIN: + interruptArgs[56] = state; + attachInterrupt(56, isr56, CHANGE); + break; + #endif + #ifdef CORE_INT57_PIN + case CORE_INT57_PIN: + interruptArgs[57] = state; + attachInterrupt(57, isr57, CHANGE); + break; + #endif + #ifdef CORE_INT58_PIN + case CORE_INT58_PIN: + interruptArgs[58] = state; + attachInterrupt(58, isr58, CHANGE); + break; + #endif + #ifdef CORE_INT59_PIN + case CORE_INT59_PIN: + interruptArgs[59] = state; + attachInterrupt(59, isr59, CHANGE); + break; + #endif + default: + return 0; + } + return 1; + } +#endif // ENCODER_USE_INTERRUPTS + + +#if defined(ENCODER_USE_INTERRUPTS) && !defined(ENCODER_OPTIMIZE_INTERRUPTS) + #ifdef CORE_INT0_PIN + static ENCODER_ISR_ATTR void isr0(void) { update(interruptArgs[0]); } + #endif + #ifdef CORE_INT1_PIN + static ENCODER_ISR_ATTR void isr1(void) { update(interruptArgs[1]); } + #endif + #ifdef CORE_INT2_PIN + static ENCODER_ISR_ATTR void isr2(void) { update(interruptArgs[2]); } + #endif + #ifdef CORE_INT3_PIN + static ENCODER_ISR_ATTR void isr3(void) { update(interruptArgs[3]); } + #endif + #ifdef CORE_INT4_PIN + static ENCODER_ISR_ATTR void isr4(void) { update(interruptArgs[4]); } + #endif + #ifdef CORE_INT5_PIN + static ENCODER_ISR_ATTR void isr5(void) { update(interruptArgs[5]); } + #endif + #ifdef CORE_INT6_PIN + static ENCODER_ISR_ATTR void isr6(void) { update(interruptArgs[6]); } + #endif + #ifdef CORE_INT7_PIN + static ENCODER_ISR_ATTR void isr7(void) { update(interruptArgs[7]); } + #endif + #ifdef CORE_INT8_PIN + static ENCODER_ISR_ATTR void isr8(void) { update(interruptArgs[8]); } + #endif + #ifdef CORE_INT9_PIN + static ENCODER_ISR_ATTR void isr9(void) { update(interruptArgs[9]); } + #endif + #ifdef CORE_INT10_PIN + static ENCODER_ISR_ATTR void isr10(void) { update(interruptArgs[10]); } + #endif + #ifdef CORE_INT11_PIN + static ENCODER_ISR_ATTR void isr11(void) { update(interruptArgs[11]); } + #endif + #ifdef CORE_INT12_PIN + static ENCODER_ISR_ATTR void isr12(void) { update(interruptArgs[12]); } + #endif + #ifdef CORE_INT13_PIN + static ENCODER_ISR_ATTR void isr13(void) { update(interruptArgs[13]); } + #endif + #ifdef CORE_INT14_PIN + static ENCODER_ISR_ATTR void isr14(void) { update(interruptArgs[14]); } + #endif + #ifdef CORE_INT15_PIN + static ENCODER_ISR_ATTR void isr15(void) { update(interruptArgs[15]); } + #endif + #ifdef CORE_INT16_PIN + static ENCODER_ISR_ATTR void isr16(void) { update(interruptArgs[16]); } + #endif + #ifdef CORE_INT17_PIN + static ENCODER_ISR_ATTR void isr17(void) { update(interruptArgs[17]); } + #endif + #ifdef CORE_INT18_PIN + static ENCODER_ISR_ATTR void isr18(void) { update(interruptArgs[18]); } + #endif + #ifdef CORE_INT19_PIN + static ENCODER_ISR_ATTR void isr19(void) { update(interruptArgs[19]); } + #endif + #ifdef CORE_INT20_PIN + static ENCODER_ISR_ATTR void isr20(void) { update(interruptArgs[20]); } + #endif + #ifdef CORE_INT21_PIN + static ENCODER_ISR_ATTR void isr21(void) { update(interruptArgs[21]); } + #endif + #ifdef CORE_INT22_PIN + static ENCODER_ISR_ATTR void isr22(void) { update(interruptArgs[22]); } + #endif + #ifdef CORE_INT23_PIN + static ENCODER_ISR_ATTR void isr23(void) { update(interruptArgs[23]); } + #endif + #ifdef CORE_INT24_PIN + static ENCODER_ISR_ATTR void isr24(void) { update(interruptArgs[24]); } + #endif + #ifdef CORE_INT25_PIN + static ENCODER_ISR_ATTR void isr25(void) { update(interruptArgs[25]); } + #endif + #ifdef CORE_INT26_PIN + static ENCODER_ISR_ATTR void isr26(void) { update(interruptArgs[26]); } + #endif + #ifdef CORE_INT27_PIN + static ENCODER_ISR_ATTR void isr27(void) { update(interruptArgs[27]); } + #endif + #ifdef CORE_INT28_PIN + static ENCODER_ISR_ATTR void isr28(void) { update(interruptArgs[28]); } + #endif + #ifdef CORE_INT29_PIN + static ENCODER_ISR_ATTR void isr29(void) { update(interruptArgs[29]); } + #endif + #ifdef CORE_INT30_PIN + static ENCODER_ISR_ATTR void isr30(void) { update(interruptArgs[30]); } + #endif + #ifdef CORE_INT31_PIN + static ENCODER_ISR_ATTR void isr31(void) { update(interruptArgs[31]); } + #endif + #ifdef CORE_INT32_PIN + static ENCODER_ISR_ATTR void isr32(void) { update(interruptArgs[32]); } + #endif + #ifdef CORE_INT33_PIN + static ENCODER_ISR_ATTR void isr33(void) { update(interruptArgs[33]); } + #endif + #ifdef CORE_INT34_PIN + static ENCODER_ISR_ATTR void isr34(void) { update(interruptArgs[34]); } + #endif + #ifdef CORE_INT35_PIN + static ENCODER_ISR_ATTR void isr35(void) { update(interruptArgs[35]); } + #endif + #ifdef CORE_INT36_PIN + static ENCODER_ISR_ATTR void isr36(void) { update(interruptArgs[36]); } + #endif + #ifdef CORE_INT37_PIN + static ENCODER_ISR_ATTR void isr37(void) { update(interruptArgs[37]); } + #endif + #ifdef CORE_INT38_PIN + static ENCODER_ISR_ATTR void isr38(void) { update(interruptArgs[38]); } + #endif + #ifdef CORE_INT39_PIN + static ENCODER_ISR_ATTR void isr39(void) { update(interruptArgs[39]); } + #endif + #ifdef CORE_INT40_PIN + static ENCODER_ISR_ATTR void isr40(void) { update(interruptArgs[40]); } + #endif + #ifdef CORE_INT41_PIN + static ENCODER_ISR_ATTR void isr41(void) { update(interruptArgs[41]); } + #endif + #ifdef CORE_INT42_PIN + static ENCODER_ISR_ATTR void isr42(void) { update(interruptArgs[42]); } + #endif + #ifdef CORE_INT43_PIN + static ENCODER_ISR_ATTR void isr43(void) { update(interruptArgs[43]); } + #endif + #ifdef CORE_INT44_PIN + static ENCODER_ISR_ATTR void isr44(void) { update(interruptArgs[44]); } + #endif + #ifdef CORE_INT45_PIN + static ENCODER_ISR_ATTR void isr45(void) { update(interruptArgs[45]); } + #endif + #ifdef CORE_INT46_PIN + static ENCODER_ISR_ATTR void isr46(void) { update(interruptArgs[46]); } + #endif + #ifdef CORE_INT47_PIN + static ENCODER_ISR_ATTR void isr47(void) { update(interruptArgs[47]); } + #endif + #ifdef CORE_INT48_PIN + static ENCODER_ISR_ATTR void isr48(void) { update(interruptArgs[48]); } + #endif + #ifdef CORE_INT49_PIN + static ENCODER_ISR_ATTR void isr49(void) { update(interruptArgs[49]); } + #endif + #ifdef CORE_INT50_PIN + static ENCODER_ISR_ATTR void isr50(void) { update(interruptArgs[50]); } + #endif + #ifdef CORE_INT51_PIN + static ENCODER_ISR_ATTR void isr51(void) { update(interruptArgs[51]); } + #endif + #ifdef CORE_INT52_PIN + static ENCODER_ISR_ATTR void isr52(void) { update(interruptArgs[52]); } + #endif + #ifdef CORE_INT53_PIN + static ENCODER_ISR_ATTR void isr53(void) { update(interruptArgs[53]); } + #endif + #ifdef CORE_INT54_PIN + static ENCODER_ISR_ATTR void isr54(void) { update(interruptArgs[54]); } + #endif + #ifdef CORE_INT55_PIN + static ENCODER_ISR_ATTR void isr55(void) { update(interruptArgs[55]); } + #endif + #ifdef CORE_INT56_PIN + static ENCODER_ISR_ATTR void isr56(void) { update(interruptArgs[56]); } + #endif + #ifdef CORE_INT57_PIN + static ENCODER_ISR_ATTR void isr57(void) { update(interruptArgs[57]); } + #endif + #ifdef CORE_INT58_PIN + static ENCODER_ISR_ATTR void isr58(void) { update(interruptArgs[58]); } + #endif + #ifdef CORE_INT59_PIN + static ENCODER_ISR_ATTR void isr59(void) { update(interruptArgs[59]); } + #endif +#endif +}; + +#if defined(ENCODER_USE_INTERRUPTS) && defined(ENCODER_OPTIMIZE_INTERRUPTS) +#if defined(__AVR__) +#if defined(INT0_vect) && CORE_NUM_INTERRUPT > 0 +ISR(INT0_vect) { Encoder::update(Encoder::interruptArgs[SCRAMBLE_INT_ORDER(0)]); } +#endif +#if defined(INT1_vect) && CORE_NUM_INTERRUPT > 1 +ISR(INT1_vect) { Encoder::update(Encoder::interruptArgs[SCRAMBLE_INT_ORDER(1)]); } +#endif +#if defined(INT2_vect) && CORE_NUM_INTERRUPT > 2 +ISR(INT2_vect) { Encoder::update(Encoder::interruptArgs[SCRAMBLE_INT_ORDER(2)]); } +#endif +#if defined(INT3_vect) && CORE_NUM_INTERRUPT > 3 +ISR(INT3_vect) { Encoder::update(Encoder::interruptArgs[SCRAMBLE_INT_ORDER(3)]); } +#endif +#if defined(INT4_vect) && CORE_NUM_INTERRUPT > 4 +ISR(INT4_vect) { Encoder::update(Encoder::interruptArgs[SCRAMBLE_INT_ORDER(4)]); } +#endif +#if defined(INT5_vect) && CORE_NUM_INTERRUPT > 5 +ISR(INT5_vect) { Encoder::update(Encoder::interruptArgs[SCRAMBLE_INT_ORDER(5)]); } +#endif +#if defined(INT6_vect) && CORE_NUM_INTERRUPT > 6 +ISR(INT6_vect) { Encoder::update(Encoder::interruptArgs[SCRAMBLE_INT_ORDER(6)]); } +#endif +#if defined(INT7_vect) && CORE_NUM_INTERRUPT > 7 +ISR(INT7_vect) { Encoder::update(Encoder::interruptArgs[SCRAMBLE_INT_ORDER(7)]); } +#endif +#endif // AVR +#if defined(attachInterrupt) +// Don't intefere with other libraries or sketch use of attachInterrupt() +// https://github.com/PaulStoffregen/Encoder/issues/8 +#undef attachInterrupt +#endif +#endif // ENCODER_OPTIMIZE_INTERRUPTS + + +#endif diff --git a/software/firmware/libraries/Encoder-master/README.md b/software/firmware/libraries/Encoder-master/README.md new file mode 100644 index 0000000..6a4f638 --- /dev/null +++ b/software/firmware/libraries/Encoder-master/README.md @@ -0,0 +1,9 @@ +# Encoder Library + +Encoder counts pulses from quadrature encoded signals, which are commonly available from rotary knobs, motor or shaft sensors and other position sensors. + +http://www.pjrc.com/teensy/td_libs_Encoder.html + +http://www.youtube.com/watch?v=2puhIong-cs + +![Encoder Knobs Demo](http://www.pjrc.com/teensy/td_libs_Encoder_1.jpg) diff --git a/software/firmware/libraries/Encoder-master/docs/issue_template.md b/software/firmware/libraries/Encoder-master/docs/issue_template.md new file mode 100644 index 0000000..0610992 --- /dev/null +++ b/software/firmware/libraries/Encoder-master/docs/issue_template.md @@ -0,0 +1,64 @@ +Please use this form only to report code defects or bugs. + +For any question, even questions directly pertaining to this code, post your question on the forums related to the board you are using. + +Arduino: forum.arduino.cc +Teensy: forum.pjrc.com +ESP8266: www.esp8266.com +ESP32: www.esp32.com +Adafruit Feather/Metro/Trinket: forums.adafruit.com +Particle Photon: community.particle.io + +If you are experiencing trouble but not certain of the cause, or need help using this code, ask on the appropriate forum. This is not the place to ask for support or help, even directly related to this code. Only use this form you are certain you have discovered a defect in this code! + +Please verify the problem occurs when using the very latest version, using the newest version of Arduino and any other related software. + + +----------------------------- Remove above ----------------------------- + + + +### Description + +Describe your problem. + + + +### Steps To Reproduce Problem + +Please give detailed instructions needed for anyone to attempt to reproduce the problem. + + + +### Hardware & Software + +Board +Shields / modules used +Arduino IDE version +Teensyduino version (if using Teensy) +Version info & package name (from Tools > Boards > Board Manager) +Operating system & version +Any other software or hardware? + + +### Arduino Sketch + +```cpp +// Change the code below by your sketch (please try to give the smallest code which demonstrates the problem) +#include + +// libraries: give links/details so anyone can compile your code for the same result + +void setup() { +} + +void loop() { +} +``` + + +### Errors or Incorrect Output + +If you see any errors or incorrect output, please show it here. Please use copy & paste to give an exact copy of the message. Details matter, so please show (not merely describe) the actual message or error exactly as it appears. + + diff --git a/software/firmware/libraries/Encoder-master/examples/Basic/Basic.pde b/software/firmware/libraries/Encoder-master/examples/Basic/Basic.pde new file mode 100644 index 0000000..3394b58 --- /dev/null +++ b/software/firmware/libraries/Encoder-master/examples/Basic/Basic.pde @@ -0,0 +1,29 @@ +/* Encoder Library - Basic Example + * http://www.pjrc.com/teensy/td_libs_Encoder.html + * + * This example code is in the public domain. + */ + +#include + +// Change these two numbers to the pins connected to your encoder. +// Best Performance: both pins have interrupt capability +// Good Performance: only the first pin has interrupt capability +// Low Performance: neither pin has interrupt capability +Encoder myEnc(5, 6); +// avoid using pins with LEDs attached + +void setup() { + Serial.begin(9600); + Serial.println("Basic Encoder Test:"); +} + +long oldPosition = -999; + +void loop() { + long newPosition = myEnc.read(); + if (newPosition != oldPosition) { + oldPosition = newPosition; + Serial.println(newPosition); + } +} diff --git a/software/firmware/libraries/Encoder-master/examples/NoInterrupts/NoInterrupts.pde b/software/firmware/libraries/Encoder-master/examples/NoInterrupts/NoInterrupts.pde new file mode 100644 index 0000000..b890652 --- /dev/null +++ b/software/firmware/libraries/Encoder-master/examples/NoInterrupts/NoInterrupts.pde @@ -0,0 +1,46 @@ +/* Encoder Library - NoInterrupts Example + * http://www.pjrc.com/teensy/td_libs_Encoder.html + * + * This example code is in the public domain. + */ + +// If you define ENCODER_DO_NOT_USE_INTERRUPTS *before* including +// Encoder, the library will never use interrupts. This is mainly +// useful to reduce the size of the library when you are using it +// with pins that do not support interrupts. Without interrupts, +// your program must call the read() function rapidly, or risk +// missing changes in position. +#define ENCODER_DO_NOT_USE_INTERRUPTS +#include + +// Beware of Serial.print() speed. Without interrupts, if you +// transmit too much data with Serial.print() it can slow your +// reading from Encoder. Arduino 1.0 has improved transmit code. +// Using the fastest baud rate also helps. Teensy has USB packet +// buffering. But all boards can experience problems if you print +// too much and fill up buffers. + +// Change these two numbers to the pins connected to your encoder. +// With ENCODER_DO_NOT_USE_INTERRUPTS, no interrupts are ever +// used, even if the pin has interrupt capability +Encoder myEnc(5, 6); +// avoid using pins with LEDs attached + +void setup() { + Serial.begin(9600); + Serial.println("Basic NoInterrupts Test:"); +} + +long position = -999; + +void loop() { + long newPos = myEnc.read(); + if (newPos != position) { + position = newPos; + Serial.println(position); + } + // With any substantial delay added, Encoder can only track + // very slow motion. You may uncomment this line to see + // how badly a delay affects your encoder. + //delay(50); +} diff --git a/software/firmware/libraries/Encoder-master/examples/SpeedTest/SpeedTest.pde b/software/firmware/libraries/Encoder-master/examples/SpeedTest/SpeedTest.pde new file mode 100644 index 0000000..f136fbb --- /dev/null +++ b/software/firmware/libraries/Encoder-master/examples/SpeedTest/SpeedTest.pde @@ -0,0 +1,113 @@ +/* Encoder Library - SpeedTest - for measuring maximum Encoder speed + * http://www.pjrc.com/teensy/td_libs_Encoder.html + * + * This example code is in the public domain. + */ + + +// This SpeedTest example provides a simple way to verify how much +// CPU time Encoder is consuming. Connect a DC voltmeter to the +// output pin and measure the voltage while the encoder is stopped +// or running at a very slow speed. Even though the pin is rapidly +// pulsing, a DC voltmeter will show the average voltage. Due to +// software timing, it will read a number much less than a steady +// logic high, but this number will give you a baseline reading +// for output with minimal interrupt overhead. Then increase the +// encoder speed. The voltage will decrease as the processor spends +// more time in Encoder's interrupt routines counting the pulses +// and less time pulsing the output pin. When the voltage is +// close to zero and will not decrease any farther, you have reached +// the absolute speed limit. Or, if using a mechanical system where +// you reach a speed limit imposed by your motors or other hardware, +// the amount this voltage has decreased, compared to the baseline, +// should give you a good approximation of the portion of available +// CPU time Encoder is consuming at your maximum speed. + +// Encoder requires low latency interrupt response. Available CPU +// time does NOT necessarily prove or guarantee correct performance. +// If another library, like NewSoftSerial, is disabling interrupts +// for lengthy periods of time, Encoder can be prevented from +// properly counting the intput signals while interrupt are disabled. + + +// This optional setting causes Encoder to use more optimized code, +// but the downside is a conflict if any other part of your sketch +// or any other library you're using requires attachInterrupt(). +// It must be defined before Encoder.h is included. +//#define ENCODER_OPTIMIZE_INTERRUPTS + +#include +#include "pins_arduino.h" + +// Change these two numbers to the pins connected to your encoder +// or shift register circuit which emulates a quadrature encoder +// case 1: both pins are interrupts +// case 2: only first pin used as interrupt +Encoder myEnc(5, 6); + +// Connect a DC voltmeter to this pin. +const int outputPin = 12; + +/* This simple circuit, using a Dual Flip-Flop chip, can emulate + quadrature encoder signals. The clock can come from a fancy + function generator or a cheap 555 timer chip. The clock + frequency can be measured with another board running FreqCount + http://www.pjrc.com/teensy/td_libs_FreqCount.html + + +5V + | Quadrature Encoder Signal Emulator + Clock | + Input o----*-------------------------- ---------------------------o Output1 + | |14 | | + | _______|_______ | | _______________ + | | CD4013 | | | | CD4013 | + | 5 | | 1 | | 9 | | 13 + ---------| D Q |-----|----*----| D Q |------o Output2 + | | | | | | | + | | 3 | | | 11 | | + | ----|> Clk | ---------|> Clk | + | | | | | + | 6 | | 8 | | + | ----| S | ----| S | + | | | | | | | + | | 4 | _ | 2 | 10 | _ | 12 + | *----| R Q |--- *----| R Q |---- + | | | | | | | | + | | |_______________| | |_______________| | + | | | | | + | | | 7 | | + | | | | | + -------------------------------------------------------------- + | | | + | | | + ----- ----- ----- + --- --- --- + - - - +*/ + + +void setup() { + pinMode(outputPin, OUTPUT); +} + +#if defined(__AVR__) || defined(TEENSYDUINO) +#define REGTYPE unsigned char +#else +#define REGTYPE unsigned long +#endif + +void loop() { + volatile int count = 0; + volatile REGTYPE *reg = portOutputRegister(digitalPinToPort(outputPin)); + REGTYPE mask = digitalPinToBitMask(outputPin); + + while (1) { + myEnc.read(); // Read the encoder while interrupts are enabled. + noInterrupts(); + *reg |= mask; // Pulse the pin high, while interrupts are disabled. + count = count + 1; + *reg &= ~mask; + interrupts(); + } +} + diff --git a/software/firmware/libraries/Encoder-master/examples/TwoKnobs/TwoKnobs.pde b/software/firmware/libraries/Encoder-master/examples/TwoKnobs/TwoKnobs.pde new file mode 100644 index 0000000..306b33e --- /dev/null +++ b/software/firmware/libraries/Encoder-master/examples/TwoKnobs/TwoKnobs.pde @@ -0,0 +1,46 @@ +/* Encoder Library - TwoKnobs Example + * http://www.pjrc.com/teensy/td_libs_Encoder.html + * + * This example code is in the public domain. + */ + +#include + +// Change these pin numbers to the pins connected to your encoder. +// Best Performance: both pins have interrupt capability +// Good Performance: only the first pin has interrupt capability +// Low Performance: neither pin has interrupt capability +Encoder knobLeft(5, 6); +Encoder knobRight(7, 8); +// avoid using pins with LEDs attached + +void setup() { + Serial.begin(9600); + Serial.println("TwoKnobs Encoder Test:"); +} + +long positionLeft = -999; +long positionRight = -999; + +void loop() { + long newLeft, newRight; + newLeft = knobLeft.read(); + newRight = knobRight.read(); + if (newLeft != positionLeft || newRight != positionRight) { + Serial.print("Left = "); + Serial.print(newLeft); + Serial.print(", Right = "); + Serial.print(newRight); + Serial.println(); + positionLeft = newLeft; + positionRight = newRight; + } + // if a character is sent from the serial monitor, + // reset both back to zero. + if (Serial.available()) { + Serial.read(); + Serial.println("Reset both knobs to zero"); + knobLeft.write(0); + knobRight.write(0); + } +} diff --git a/software/firmware/libraries/Encoder-master/keywords.txt b/software/firmware/libraries/Encoder-master/keywords.txt new file mode 100644 index 0000000..a4baa01 --- /dev/null +++ b/software/firmware/libraries/Encoder-master/keywords.txt @@ -0,0 +1,4 @@ +ENCODER_USE_INTERRUPTS LITERAL1 +ENCODER_OPTIMIZE_INTERRUPTS LITERAL1 +ENCODER_DO_NOT_USE_INTERRUPTS LITERAL1 +Encoder KEYWORD1 diff --git a/software/firmware/libraries/Encoder-master/library.json b/software/firmware/libraries/Encoder-master/library.json new file mode 100644 index 0000000..0a0f653 --- /dev/null +++ b/software/firmware/libraries/Encoder-master/library.json @@ -0,0 +1,16 @@ +{ + "name": "Encoder", + "keywords": "encoder, signal, pulse", + "description": "Encoder counts pulses from quadrature encoded signals, which are commonly available from rotary knobs, motor or shaft sensors and other position sensors", + "repository": + { + "type": "git", + "url": "https://github.com/PaulStoffregen/Encoder.git" + }, + "frameworks": "arduino", + "platforms": + [ + "atmelavr", + "teensy" + ] +} diff --git a/software/firmware/libraries/Encoder-master/library.properties b/software/firmware/libraries/Encoder-master/library.properties new file mode 100644 index 0000000..712abd4 --- /dev/null +++ b/software/firmware/libraries/Encoder-master/library.properties @@ -0,0 +1,10 @@ +name=Encoder +version=1.4.2 +author=Paul Stoffregen +maintainer=Paul Stoffregen +sentence=Counts quadrature pulses from rotary & linear position encoders. +paragraph=Encoder counts pulses from quadrature encoded signals, which are commonly available from rotary knobs, motor or shaft sensors and other position sensors. +category=Signal Input/Output +url=http://www.pjrc.com/teensy/td_libs_Encoder.html +architectures=* + diff --git a/software/firmware/libraries/Encoder-master/utility/direct_pin_read.h b/software/firmware/libraries/Encoder-master/utility/direct_pin_read.h new file mode 100644 index 0000000..d5b26ef --- /dev/null +++ b/software/firmware/libraries/Encoder-master/utility/direct_pin_read.h @@ -0,0 +1,110 @@ +#ifndef direct_pin_read_h_ +#define direct_pin_read_h_ + +#if defined(__AVR__) + +#define IO_REG_TYPE uint8_t +#define PIN_TO_BASEREG(pin) (portInputRegister(digitalPinToPort(pin))) +#define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin)) +#define DIRECT_PIN_READ(base, mask) (((*(base)) & (mask)) ? 1 : 0) + +#elif defined(TEENSYDUINO) && (defined(KINETISK) || defined(KINETISL)) + +#define IO_REG_TYPE uint8_t +#define PIN_TO_BASEREG(pin) (portInputRegister(digitalPinToPort(pin))) +#define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin)) +#define DIRECT_PIN_READ(base, mask) (((*(base)) & (mask)) ? 1 : 0) + +#elif defined(__IMXRT1052__) || defined(__IMXRT1062__) + +#define IO_REG_TYPE uint32_t +#define PIN_TO_BASEREG(pin) (portOutputRegister(pin)) +#define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin)) +#define DIRECT_PIN_READ(base, mask) (((*(base)) & (mask)) ? 1 : 0) + +#elif defined(__SAM3X8E__) // || defined(ESP8266) + +#define IO_REG_TYPE uint32_t +#define PIN_TO_BASEREG(pin) (portInputRegister(digitalPinToPort(pin))) +#define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin)) +#define DIRECT_PIN_READ(base, mask) (((*(base)) & (mask)) ? 1 : 0) + +#elif defined(__PIC32MX__) + +#define IO_REG_TYPE uint32_t +#define PIN_TO_BASEREG(pin) (portModeRegister(digitalPinToPort(pin))) +#define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin)) +#define DIRECT_PIN_READ(base, mask) (((*(base+4)) & (mask)) ? 1 : 0) + +/* ESP8266 v2.0.0 Arduino workaround for bug https://github.com/esp8266/Arduino/issues/1110 */ +#elif defined(ESP8266) + +#define IO_REG_TYPE uint32_t +#define PIN_TO_BASEREG(pin) ((volatile uint32_t *)(0x60000000+(0x318))) +#define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin)) +#define DIRECT_PIN_READ(base, mask) (((*(base)) & (mask)) ? 1 : 0) + +/* ESP32 Arduino (https://github.com/espressif/arduino-esp32) */ +#elif defined(ESP32) + +#define IO_REG_TYPE uint32_t +#define PIN_TO_BASEREG(pin) (portInputRegister(digitalPinToPort(pin))) +#define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin)) +#define DIRECT_PIN_READ(base, mask) (((*(base)) & (mask)) ? 1 : 0) + +#elif defined(__SAMD21G18A__) || defined(__SAMD21E18A__) + +#define IO_REG_TYPE uint32_t +#define PIN_TO_BASEREG(pin) portModeRegister(digitalPinToPort(pin)) +#define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin)) +#define DIRECT_PIN_READ(base, mask) (((*((base)+8)) & (mask)) ? 1 : 0) + +#elif defined(__SAMD51__) + +#define IO_REG_TYPE uint32_t +#define PIN_TO_BASEREG(pin) portInputRegister(digitalPinToPort(pin)) +#define PIN_TO_BITMASK(pin) (digitalPinToBitMask(pin)) +#define DIRECT_PIN_READ(base, mask) (((*(base)) & (mask)) ? 1 : 0) + +#elif defined(RBL_NRF51822) + +#define IO_REG_TYPE uint32_t +#define PIN_TO_BASEREG(pin) (0) +#define PIN_TO_BITMASK(pin) (pin) +#define DIRECT_PIN_READ(base, pin) nrf_gpio_pin_read(pin) + +#elif defined(ARDUINO_ARCH_NRF52840) +#define IO_REG_TYPE uint32_t +#define PIN_TO_BASEREG(pin) (0) +#define PIN_TO_BITMASK(pin) digitalPinToPinName(pin) +#define DIRECT_PIN_READ(base, pin) nrf_gpio_pin_read(pin) + +#elif defined(__arc__) /* Arduino101/Genuino101 specifics */ + +#include "scss_registers.h" +#include "portable.h" +#include "avr/pgmspace.h" +#define GPIO_ID(pin) (g_APinDescription[pin].ulGPIOId) +#define GPIO_TYPE(pin) (g_APinDescription[pin].ulGPIOType) +#define GPIO_BASE(pin) (g_APinDescription[pin].ulGPIOBase) +#define EXT_PORT_OFFSET_SS 0x0A +#define EXT_PORT_OFFSET_SOC 0x50 +#define PIN_TO_BASEREG(pin) ((volatile uint32_t *)g_APinDescription[pin].ulGPIOBase) +#define PIN_TO_BITMASK(pin) pin +#define IO_REG_TYPE uint32_t +static inline __attribute__((always_inline)) +IO_REG_TYPE directRead(volatile IO_REG_TYPE *base, IO_REG_TYPE pin) +{ + IO_REG_TYPE ret; + if (SS_GPIO == GPIO_TYPE(pin)) { + ret = READ_ARC_REG(((IO_REG_TYPE)base + EXT_PORT_OFFSET_SS)); + } else { + ret = MMIO_REG_VAL_FROM_BASE((IO_REG_TYPE)base, EXT_PORT_OFFSET_SOC); + } + return ((ret >> GPIO_ID(pin)) & 0x01); +} +#define DIRECT_PIN_READ(base, pin) directRead(base, pin) + +#endif + +#endif diff --git a/software/firmware/libraries/Encoder-master/utility/interrupt_config.h b/software/firmware/libraries/Encoder-master/utility/interrupt_config.h new file mode 100644 index 0000000..cde6adf --- /dev/null +++ b/software/firmware/libraries/Encoder-master/utility/interrupt_config.h @@ -0,0 +1,87 @@ +#if defined(__AVR__) + +#include +#include + +#define attachInterrupt(num, func, mode) enableInterrupt(num) +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +#define SCRAMBLE_INT_ORDER(num) ((num < 4) ? num + 2 : ((num < 6) ? num - 4 : num)) +#define DESCRAMBLE_INT_ORDER(num) ((num < 2) ? num + 4 : ((num < 6) ? num - 2 : num)) +#else +#define SCRAMBLE_INT_ORDER(num) (num) +#define DESCRAMBLE_INT_ORDER(num) (num) +#endif + +static void enableInterrupt(uint8_t num) +{ + switch (DESCRAMBLE_INT_ORDER(num)) { + #if defined(EICRA) && defined(EIMSK) + case 0: + EICRA = (EICRA & 0xFC) | 0x01; + EIMSK |= 0x01; + return; + case 1: + EICRA = (EICRA & 0xF3) | 0x04; + EIMSK |= 0x02; + return; + case 2: + EICRA = (EICRA & 0xCF) | 0x10; + EIMSK |= 0x04; + return; + case 3: + EICRA = (EICRA & 0x3F) | 0x40; + EIMSK |= 0x08; + return; + #elif defined(MCUCR) && defined(GICR) + case 0: + MCUCR = (MCUCR & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00); + GICR |= (1 << INT0); + return; + case 1: + MCUCR = (MCUCR & ~((1 << ISC10) | (1 << ISC11))) | (mode << ISC10); + GICR |= (1 << INT1); + return; + #elif defined(MCUCR) && defined(GIMSK) + case 0: + MCUCR = (MCUCR & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00); + GIMSK |= (1 << INT0); + return; + case 1: + MCUCR = (MCUCR & ~((1 << ISC10) | (1 << ISC11))) | (mode << ISC10); + GIMSK |= (1 << INT1); + return; + #endif + #if defined(EICRB) && defined(EIMSK) + case 4: + EICRB = (EICRB & 0xFC) | 0x01; + EIMSK |= 0x10; + return; + case 5: + EICRB = (EICRB & 0xF3) | 0x04; + EIMSK |= 0x20; + return; + case 6: + EICRB = (EICRB & 0xCF) | 0x10; + EIMSK |= 0x40; + return; + case 7: + EICRB = (EICRB & 0x3F) | 0x40; + EIMSK |= 0x80; + return; + #endif + } +} + +#elif defined(__PIC32MX__) + +#ifdef ENCODER_OPTIMIZE_INTERRUPTS +#undef ENCODER_OPTIMIZE_INTERRUPTS +#endif + +#else + +#ifdef ENCODER_OPTIMIZE_INTERRUPTS +#undef ENCODER_OPTIMIZE_INTERRUPTS +#endif + +#endif diff --git a/software/firmware/libraries/Encoder-master/utility/interrupt_pins.h b/software/firmware/libraries/Encoder-master/utility/interrupt_pins.h new file mode 100644 index 0000000..ca82bf0 --- /dev/null +++ b/software/firmware/libraries/Encoder-master/utility/interrupt_pins.h @@ -0,0 +1,370 @@ +// interrupt pins for known boards + +// Teensy (and maybe others) define these automatically +#if !defined(CORE_NUM_INTERRUPT) + +// Wiring boards +#if defined(WIRING) + #define CORE_NUM_INTERRUPT NUM_EXTERNAL_INTERRUPTS + #if NUM_EXTERNAL_INTERRUPTS > 0 + #define CORE_INT0_PIN EI0 + #endif + #if NUM_EXTERNAL_INTERRUPTS > 1 + #define CORE_INT1_PIN EI1 + #endif + #if NUM_EXTERNAL_INTERRUPTS > 2 + #define CORE_INT2_PIN EI2 + #endif + #if NUM_EXTERNAL_INTERRUPTS > 3 + #define CORE_INT3_PIN EI3 + #endif + #if NUM_EXTERNAL_INTERRUPTS > 4 + #define CORE_INT4_PIN EI4 + #endif + #if NUM_EXTERNAL_INTERRUPTS > 5 + #define CORE_INT5_PIN EI5 + #endif + #if NUM_EXTERNAL_INTERRUPTS > 6 + #define CORE_INT6_PIN EI6 + #endif + #if NUM_EXTERNAL_INTERRUPTS > 7 + #define CORE_INT7_PIN EI7 + #endif + +// Arduino Uno, Duemilanove, Diecimila, LilyPad, Mini, Fio, etc... +#elif defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328PB__) ||defined(__AVR_ATmega168__) || defined(__AVR_ATmega8__) + #define CORE_NUM_INTERRUPT 2 + #define CORE_INT0_PIN 2 + #define CORE_INT1_PIN 3 + +// Arduino Mega +#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + #define CORE_NUM_INTERRUPT 6 + #define CORE_INT0_PIN 2 + #define CORE_INT1_PIN 3 + #define CORE_INT2_PIN 21 + #define CORE_INT3_PIN 20 + #define CORE_INT4_PIN 19 + #define CORE_INT5_PIN 18 + +// Arduino Nano Every, Uno R2 Wifi +#elif defined(__AVR_ATmega4809__) + #define CORE_NUM_INTERRUPT 22 + #define CORE_INT0_PIN 0 + #define CORE_INT1_PIN 1 + #define CORE_INT2_PIN 2 + #define CORE_INT3_PIN 3 + #define CORE_INT4_PIN 4 + #define CORE_INT5_PIN 5 + #define CORE_INT6_PIN 6 + #define CORE_INT7_PIN 7 + #define CORE_INT8_PIN 8 + #define CORE_INT9_PIN 9 + #define CORE_INT10_PIN 10 + #define CORE_INT11_PIN 11 + #define CORE_INT12_PIN 12 + #define CORE_INT13_PIN 13 + #define CORE_INT14_PIN 14 + #define CORE_INT15_PIN 15 + #define CORE_INT16_PIN 16 + #define CORE_INT17_PIN 17 + #define CORE_INT18_PIN 18 + #define CORE_INT19_PIN 19 + #define CORE_INT20_PIN 20 + #define CORE_INT21_PIN 21 + +// Arduino Leonardo (untested) +#elif defined(__AVR_ATmega32U4__) && !defined(CORE_TEENSY) + #define CORE_NUM_INTERRUPT 5 + #define CORE_INT0_PIN 3 + #define CORE_INT1_PIN 2 + #define CORE_INT2_PIN 0 + #define CORE_INT3_PIN 1 + #define CORE_INT4_PIN 7 + +// Sanguino (untested) and ATmega1284P +#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__) || defined(__AVR_ATmega1284P__) + #define CORE_NUM_INTERRUPT 3 + #define CORE_INT0_PIN 10 + #define CORE_INT1_PIN 11 + #define CORE_INT2_PIN 2 + +// ATmega32u2 and ATmega32u16 based boards with HoodLoader2 +#elif defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U2__) + #define CORE_NUM_INTERRUPT 8 + #define CORE_INT0_PIN 8 + #define CORE_INT1_PIN 17 + #define CORE_INT2_PIN 13 + #define CORE_INT3_PIN 14 + #define CORE_INT4_PIN 15 + #define CORE_INT5_PIN 16 + #define CORE_INT6_PIN 19 + #define CORE_INT7_PIN 20 + +// Chipkit Uno32 - attachInterrupt may not support CHANGE option +#elif defined(__PIC32MX__) && defined(_BOARD_UNO_) + #define CORE_NUM_INTERRUPT 5 + #define CORE_INT0_PIN 38 + #define CORE_INT1_PIN 2 + #define CORE_INT2_PIN 7 + #define CORE_INT3_PIN 8 + #define CORE_INT4_PIN 35 + +// Chipkit Uno32 - attachInterrupt may not support CHANGE option +#elif defined(__PIC32MX__) && defined(_BOARD_MEGA_) + #define CORE_NUM_INTERRUPT 5 + #define CORE_INT0_PIN 3 + #define CORE_INT1_PIN 2 + #define CORE_INT2_PIN 7 + #define CORE_INT3_PIN 21 + #define CORE_INT4_PIN 20 + +// http://hlt.media.mit.edu/?p=1229 +#elif defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) + #define CORE_NUM_INTERRUPT 1 + #define CORE_INT0_PIN 2 + + // ATtiny44 ATtiny84 +#elif defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) + #define CORE_NUM_INTERRUPT 1 + #define CORE_INT0_PIN 8 + +// ATtiny441 ATtiny841 +#elif defined(__AVR_ATtiny441__) || defined(__AVR_ATtiny841__) + #define CORE_NUM_INTERRUPT 1 + #define CORE_INT0_PIN 9 + +//https://github.com/SpenceKonde/ATTinyCore/blob/master/avr/extras/ATtiny_x313.md +#elif defined(__AVR_ATtinyX313__) + #define CORE_NUM_INTERRUPT 2 + #define CORE_INT0_PIN 4 + #define CORE_INT1_PIN 5 + +// Attiny167 same core as abobe +#elif defined(__AVR_ATtiny167__) + #define CORE_NUM_INTERRUPT 2 + #define CORE_INT0_PIN 14 + #define CORE_INT1_PIN 3 + + +// Arduino Due +#elif defined(__SAM3X8E__) + #define CORE_NUM_INTERRUPT 54 + #define CORE_INT0_PIN 0 + #define CORE_INT1_PIN 1 + #define CORE_INT2_PIN 2 + #define CORE_INT3_PIN 3 + #define CORE_INT4_PIN 4 + #define CORE_INT5_PIN 5 + #define CORE_INT6_PIN 6 + #define CORE_INT7_PIN 7 + #define CORE_INT8_PIN 8 + #define CORE_INT9_PIN 9 + #define CORE_INT10_PIN 10 + #define CORE_INT11_PIN 11 + #define CORE_INT12_PIN 12 + #define CORE_INT13_PIN 13 + #define CORE_INT14_PIN 14 + #define CORE_INT15_PIN 15 + #define CORE_INT16_PIN 16 + #define CORE_INT17_PIN 17 + #define CORE_INT18_PIN 18 + #define CORE_INT19_PIN 19 + #define CORE_INT20_PIN 20 + #define CORE_INT21_PIN 21 + #define CORE_INT22_PIN 22 + #define CORE_INT23_PIN 23 + #define CORE_INT24_PIN 24 + #define CORE_INT25_PIN 25 + #define CORE_INT26_PIN 26 + #define CORE_INT27_PIN 27 + #define CORE_INT28_PIN 28 + #define CORE_INT29_PIN 29 + #define CORE_INT30_PIN 30 + #define CORE_INT31_PIN 31 + #define CORE_INT32_PIN 32 + #define CORE_INT33_PIN 33 + #define CORE_INT34_PIN 34 + #define CORE_INT35_PIN 35 + #define CORE_INT36_PIN 36 + #define CORE_INT37_PIN 37 + #define CORE_INT38_PIN 38 + #define CORE_INT39_PIN 39 + #define CORE_INT40_PIN 40 + #define CORE_INT41_PIN 41 + #define CORE_INT42_PIN 42 + #define CORE_INT43_PIN 43 + #define CORE_INT44_PIN 44 + #define CORE_INT45_PIN 45 + #define CORE_INT46_PIN 46 + #define CORE_INT47_PIN 47 + #define CORE_INT48_PIN 48 + #define CORE_INT49_PIN 49 + #define CORE_INT50_PIN 50 + #define CORE_INT51_PIN 51 + #define CORE_INT52_PIN 52 + #define CORE_INT53_PIN 53 + +// ESP8266 (https://github.com/esp8266/Arduino/) +#elif defined(ESP8266) + #define CORE_NUM_INTERRUPT EXTERNAL_NUM_INTERRUPTS + #define CORE_INT0_PIN 0 + #define CORE_INT1_PIN 1 + #define CORE_INT2_PIN 2 + #define CORE_INT3_PIN 3 + #define CORE_INT4_PIN 4 + #define CORE_INT5_PIN 5 + // GPIO6-GPIO11 are typically used to interface with the flash memory IC on + // most esp8266 modules, so we should avoid adding interrupts to these pins. + #define CORE_INT12_PIN 12 + #define CORE_INT13_PIN 13 + #define CORE_INT14_PIN 14 + #define CORE_INT15_PIN 15 + +// ESP32 (https://github.com/espressif/arduino-esp32) +#elif defined(ESP32) + + #define CORE_NUM_INTERRUPT 40 + #define CORE_INT0_PIN 0 + #define CORE_INT1_PIN 1 + #define CORE_INT2_PIN 2 + #define CORE_INT3_PIN 3 + #define CORE_INT4_PIN 4 + #define CORE_INT5_PIN 5 + // GPIO6-GPIO11 are typically used to interface with the flash memory IC on + // esp32, so we should avoid adding interrupts to these pins. + #define CORE_INT12_PIN 12 + #define CORE_INT13_PIN 13 + #define CORE_INT14_PIN 14 + #define CORE_INT15_PIN 15 + #define CORE_INT16_PIN 16 + #define CORE_INT17_PIN 17 + #define CORE_INT18_PIN 18 + #define CORE_INT19_PIN 19 + #define CORE_INT21_PIN 21 + #define CORE_INT22_PIN 22 + #define CORE_INT23_PIN 23 + #define CORE_INT25_PIN 25 + #define CORE_INT26_PIN 26 + #define CORE_INT27_PIN 27 + #define CORE_INT32_PIN 32 + #define CORE_INT33_PIN 33 + #define CORE_INT34_PIN 34 + #define CORE_INT35_PIN 35 + #define CORE_INT36_PIN 36 + #define CORE_INT39_PIN 39 + + +// Arduino Zero - TODO: interrupts do not seem to work +// please help, contribute a fix! +#elif defined(__SAMD21G18A__) || defined(__SAMD21E18A__) + #define CORE_NUM_INTERRUPT 31 + #define CORE_INT0_PIN 0 + #define CORE_INT1_PIN 1 + #define CORE_INT2_PIN 2 + #define CORE_INT3_PIN 3 + #define CORE_INT4_PIN 4 + #define CORE_INT5_PIN 5 + #define CORE_INT6_PIN 6 + #define CORE_INT7_PIN 7 + #define CORE_INT8_PIN 8 + #define CORE_INT9_PIN 9 + #define CORE_INT10_PIN 10 + #define CORE_INT11_PIN 11 + #define CORE_INT12_PIN 12 + #define CORE_INT13_PIN 13 + #define CORE_INT14_PIN 14 + #define CORE_INT15_PIN 15 + #define CORE_INT16_PIN 16 + #define CORE_INT17_PIN 17 + #define CORE_INT18_PIN 18 + #define CORE_INT19_PIN 19 + #define CORE_INT20_PIN 20 + #define CORE_INT21_PIN 21 + #define CORE_INT22_PIN 22 + #define CORE_INT23_PIN 23 + #define CORE_INT24_PIN 24 + #define CORE_INT25_PIN 25 + #define CORE_INT26_PIN 26 + #define CORE_INT27_PIN 27 + #define CORE_INT28_PIN 28 + #define CORE_INT29_PIN 29 + #define CORE_INT30_PIN 30 + +#elif defined(__SAMD51__) + #define CORE_NUM_INTERRUPT 26 + #define CORE_INT0_PIN 0 + #define CORE_INT1_PIN 1 + #define CORE_INT2_PIN 2 + #define CORE_INT3_PIN 3 + #define CORE_INT4_PIN 4 + #define CORE_INT5_PIN 5 + #define CORE_INT6_PIN 6 + #define CORE_INT7_PIN 7 + #define CORE_INT8_PIN 8 + #define CORE_INT9_PIN 9 + #define CORE_INT10_PIN 10 + #define CORE_INT11_PIN 11 + #define CORE_INT12_PIN 12 + #define CORE_INT13_PIN 13 + #define CORE_INT14_PIN 14 + #define CORE_INT15_PIN 15 + #define CORE_INT16_PIN 16 + #define CORE_INT17_PIN 17 + #define CORE_INT18_PIN 18 + #define CORE_INT19_PIN 19 + #define CORE_INT20_PIN 20 + #define CORE_INT21_PIN 21 + #define CORE_INT22_PIN 22 + #define CORE_INT23_PIN 23 + #define CORE_INT24_PIN 24 + #define CORE_INT25_PIN 25 + +// Arduino 101 +#elif defined(__arc__) + #define CORE_NUM_INTERRUPT 14 + #define CORE_INT2_PIN 2 + #define CORE_INT5_PIN 5 + #define CORE_INT7_PIN 7 + #define CORE_INT8_PIN 8 + #define CORE_INT10_PIN 10 + #define CORE_INT11_PIN 11 + #define CORE_INT12_PIN 12 + #define CORE_INT13_PIN 13 + +// Arduino Nano 33 BLE +#elif defined(ARDUINO_ARCH_NRF52840) + #define CORE_NUM_INTERRUPT 22 + #define CORE_INT0_PIN 0 + #define CORE_INT1_PIN 1 + #define CORE_INT2_PIN 2 + #define CORE_INT3_PIN 3 + #define CORE_INT4_PIN 4 + #define CORE_INT5_PIN 5 + #define CORE_INT6_PIN 6 + #define CORE_INT7_PIN 7 + #define CORE_INT8_PIN 8 + #define CORE_INT9_PIN 9 + #define CORE_INT10_PIN 10 + #define CORE_INT11_PIN 11 + #define CORE_INT12_PIN 12 + #define CORE_INT13_PIN 13 + #define CORE_INT14_PIN A0 + #define CORE_INT15_PIN A1 + #define CORE_INT16_PIN A2 + #define CORE_INT17_PIN A3 + #define CORE_INT18_PIN A4 + #define CORE_INT19_PIN A5 + #define CORE_INT20_PIN A6 + #define CORE_INT21_PIN A7 +#endif +#endif + +#if !defined(CORE_NUM_INTERRUPT) +#error "Interrupts are unknown for this board, please add to this code" +#endif +#if CORE_NUM_INTERRUPT <= 0 +#error "Encoder requires interrupt pins, but this board does not have any :(" +#error "You could try defining ENCODER_DO_NOT_USE_INTERRUPTS as a kludge." +#endif + diff --git a/software/firmware/libraries/GxEPD b/software/firmware/libraries/GxEPD deleted file mode 160000 index b59ae55..0000000 --- a/software/firmware/libraries/GxEPD +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b59ae551a18b8e2dbeeed1bb62f8197e15554be9 diff --git a/software/firmware/libraries/SBUS.zip b/software/firmware/libraries/SBUS.zip new file mode 100644 index 0000000..1bad1fb Binary files /dev/null and b/software/firmware/libraries/SBUS.zip differ diff --git a/software/firmware/libraries/pothos.zip b/software/firmware/libraries/pothos.zip new file mode 100644 index 0000000..536c0cf Binary files /dev/null and b/software/firmware/libraries/pothos.zip differ diff --git a/software/firmware/libraries/pothos/__pycache__/rover20_comms.cpython-39.pyc b/software/firmware/libraries/pothos/__pycache__/rover20_comms.cpython-39.pyc new file mode 100644 index 0000000..63aa5c1 Binary files /dev/null and b/software/firmware/libraries/pothos/__pycache__/rover20_comms.cpython-39.pyc differ diff --git a/software/firmware/libraries/pothos/data_store.h b/software/firmware/libraries/pothos/data_store.h new file mode 100644 index 0000000..8189d04 --- /dev/null +++ b/software/firmware/libraries/pothos/data_store.h @@ -0,0 +1,122 @@ +#ifndef _DATA_STORE +#define _DATA_STORE +class data_store{ + private: + char char_data[255]; + int int_data[255]; + long long_data[255]; + float float_data[255]; + int type[255]; + public: + + data_store(){ + for(int i=0;i<255;i++){ + char_data[i] = 0x00; + int_data[i] = 0; + long_data[i] = 0; + float_data[i] = 0.0; + type[i] = 0; + } + } + + void set_type(int reg, String dType){ + if(dType == "int") + type[reg] = 2; + else if(dType == "char") + type[reg] = 1; + else if(dType == "long") + type[reg] = 3; + else if(dType == "float") + type[reg] = 4; + } + + int get_type(int reg){ + return type[reg]; + } + + void set_data(int reg, byte* data){ + switch(type[reg]){ + case(0): + break; + case(1): + char_data[reg] = data[0]; + #ifdef POTHOS_DEBUG + Serial.print("The data that was stored is: "); + Serial.println(char_data[reg]); + #endif + break; + case(2): + int_data[reg] = 0; + int_data[reg] = int_data[reg] | data[0]; + int_data[reg] = int_data[reg] << 8; + int_data[reg] = int_data[reg] | data[1]; + #ifdef POTHOS_DEBUG + Serial.print("The data that was stored is: "); + Serial.println(int_data[reg]); + #endif + break; + case(3): + long_data[reg] = 0; + long_data[reg] = long_data[reg] | data[0]; + for(int i=1;i<4;i++){ + long_data[reg] = long_data[reg] << 8; + long_data[reg] = long_data[reg] | data[i]; + } + #ifdef POTHOS_DEBUG + Serial.print("The data that was stored is: "); + Serial.println(long_data[reg]); + #endif + break; + case(4): + float_data[reg] = 0; + memcpy(&(float_data[reg]), data, sizeof(float)); + #ifdef POTHOS_DEBUG + Serial.print("The data that was stored is: "); + Serial.println(float_data[reg],7); + #endif + break; + } + } + + + void set_data(int reg, int data){ + if(type[reg] == 2){ + int_data[reg] = data; + } + } + + void set_data(int reg, float data){ + if(type[reg] == 4){ + float_data[reg] = data; + } + } + + void set_data(int reg, long data){ + if(type[reg] == 3){ + long_data[reg] = data; + } + } + + void set_data(int reg, char data){ + if(type[reg] == 1){ + char_data[reg] = data; + } + } + + int get_int_data(int reg){ + return int_data[reg]; + } + + char get_char_data(int reg){ + return char_data[reg]; + } + + long get_long_data(int reg){ + return long_data[reg]; + } + + float get_float_data(int reg){ + return float_data[reg]; + } +}; +#endif diff --git a/software/firmware/libraries/pothos/examples/Pothos V1,0 Example/Basic_Single_Slave/Basic_Single_Slave.ino b/software/firmware/libraries/pothos/examples/Pothos V1,0 Example/Basic_Single_Slave/Basic_Single_Slave.ino new file mode 100644 index 0000000..204a284 --- /dev/null +++ b/software/firmware/libraries/pothos/examples/Pothos V1,0 Example/Basic_Single_Slave/Basic_Single_Slave.ino @@ -0,0 +1,49 @@ +//#define POTHOS_DEBUG +#include + +unsigned long blink_timer = 0; +unsigned long blinkTime = 1000; +bool blinkState = false; + +int EnablePin = 2; + +enum DATA{ + CHAR_DATA = 0, + ALT_DATA = 1, + TIME_DATA = 2, + TMP_DATA = 3 +}; + +pothos comms(1, EnablePin, 50); + +void setup() { + Serial1.begin(115200); + comms.setPort(&Serial1); + + Serial.begin(115200); + pinMode(13,OUTPUT); + digitalWrite(13,HIGH); + + set_data_types(); +} + +void loop() { + comms.update(); + + comms.data.set_data(DATA::TIME_DATA, millis()); + + if(millis() - blink_timer >= blinkTime){ + blinkState = !blinkState; + digitalWrite(13,blinkState); + blink_timer = millis(); + + } +} + + +void set_data_types(){ + comms.data.set_type(DATA::CHAR_DATA, "char"); + comms.data.set_type(DATA::ALT_DATA, "int"); + comms.data.set_type(DATA::TIME_DATA, "long"); + comms.data.set_type(DATA::TMP_DATA, "float"); +} diff --git a/software/firmware/libraries/pothos/examples/Pothos V1,1 Dev & testing/Basic_Single_Slave/Basic_Single_Slave.ino b/software/firmware/libraries/pothos/examples/Pothos V1,1 Dev & testing/Basic_Single_Slave/Basic_Single_Slave.ino new file mode 100644 index 0000000..18c0552 --- /dev/null +++ b/software/firmware/libraries/pothos/examples/Pothos V1,1 Dev & testing/Basic_Single_Slave/Basic_Single_Slave.ino @@ -0,0 +1,49 @@ +#define RS485 Serial1 +#define POTHOS_DEBUG +#include + +unsigned long blink_timer = 0; +unsigned long blinkTime = 1000; +bool blinkState = false; + +int EnablePin = 2; + +enum DATA{ + CHAR_DATA = 0, + ALT_DATA = 1, + TIME_DATA = 2, + TMP_DATA = 3 +}; + +pothos comms(1, EnablePin, 50); + +void setup() { + comms.setup(115200); + + Serial.begin(115200); + pinMode(13,OUTPUT); + digitalWrite(13,HIGH); + + set_data_types(); +} + +void loop() { + comms.update(); + + comms.data.set_data(DATA::TIME_DATA, (long)(millis())); + + if(millis() - blink_timer >= blinkTime){ + blinkState = !blinkState; + digitalWrite(13,blinkState); + blink_timer = millis(); + + } +} + + +void set_data_types(){ + comms.data.set_type(DATA::CHAR_DATA, "char"); + comms.data.set_type(DATA::ALT_DATA, "int"); + comms.data.set_type(DATA::TIME_DATA, "long"); + comms.data.set_type(DATA::TMP_DATA, "float"); +} diff --git a/software/firmware/libraries/pothos/examples/Pothos V1,1 Dev & testing/Pothos11Gripper/Pothos11Gripper.ino b/software/firmware/libraries/pothos/examples/Pothos V1,1 Dev & testing/Pothos11Gripper/Pothos11Gripper.ino new file mode 100644 index 0000000..a8678a5 --- /dev/null +++ b/software/firmware/libraries/pothos/examples/Pothos V1,1 Dev & testing/Pothos11Gripper/Pothos11Gripper.ino @@ -0,0 +1,46 @@ +#define RS485 Serial3 +#define POTHOS_DEBUG +#include + +enum HARDWARE{ + ENABLE = 33, + RGB_R = 1, + RGB_G = 32, + RGB_B = 6, + BLED = 13, + TMP_PIN = A13 +}; + +enum DATA{ + LED = 0, + TMP = 1 +}; + +pothos comms(2, HARDWARE::ENABLE, 50, HARDWARE::RGB_R, HARDWARE::RGB_G, HARDWARE::RGB_B); + +void setup() { + comms.setup(115200); + + #ifndef POTHOS_DEBUG + Serial.begin(9600); + #endif + + pinMode(HARDWARE::BLED, OUTPUT); + pinMode(HARDWARE::TMP_PIN, INPUT); + + set_data_types(); +} + +void loop() { + comms.update(); + + digitalWrite(HARDWARE::BLED, comms.data.get_char_data(DATA::LED)); + + comms.data.set_data(DATA::TMP, analogRead(HARDWARE::TMP_PIN)); +} + + +void set_data_types(){ + comms.data.set_type(DATA::LED, "char"); //chars are actually unsigned 8bit integers in disquise and are the closest thing to a bool that's supported by pothos. + comms.data.set_type(DATA::TMP, "int"); +} diff --git a/software/firmware/libraries/pothos/examples/Pothos V1,1 Dev & testing/Pothos11ScienceSens/Pothos11ScienceSens.ino b/software/firmware/libraries/pothos/examples/Pothos V1,1 Dev & testing/Pothos11ScienceSens/Pothos11ScienceSens.ino new file mode 100644 index 0000000..fe8755d --- /dev/null +++ b/software/firmware/libraries/pothos/examples/Pothos V1,1 Dev & testing/Pothos11ScienceSens/Pothos11ScienceSens.ino @@ -0,0 +1,44 @@ +#define POTHOS_DEBUG +#include + +enum HARDWARE{ + ENABLE = 2, + RGB_R = 1, + RGB_G = 32, + RGB_B = 6, + BLED = 13, +}; + +enum DATA{ + LED = 0, + TIME = 1 +}; + +pothos comms(3, HARDWARE::ENABLE, 50, HARDWARE::RGB_R, HARDWARE::RGB_G, HARDWARE::RGB_B); + +void setup() { + Serial3.begin(115200); + comms.setPort(&Serial3); + + #ifndef POTHOS_DEBUG + Serial.begin(115200); + #endif + + pinMode(HARDWARE::BLED, OUTPUT); + + set_data_types(); +} + +void loop() { + comms.update(); + + digitalWrite(HARDWARE::BLED, DATA::LED); + + comms.data.set_data(DATA::TIME, (long)(millis())); +} + + +void set_data_types(){ + comms.data.set_type(DATA::LED, "char"); //chars are actually unsigned 8bit integers in disquise and are the closest thing to a bool that's supported by pothos. + comms.data.set_type(DATA::TIME, "long"); +} diff --git a/software/firmware/libraries/pothos/examples/Pothos V1,1 Dev & testing/ScienceMech11Test/ScienceMech11Test.ino b/software/firmware/libraries/pothos/examples/Pothos V1,1 Dev & testing/ScienceMech11Test/ScienceMech11Test.ino new file mode 100644 index 0000000..a9046a8 --- /dev/null +++ b/software/firmware/libraries/pothos/examples/Pothos V1,1 Dev & testing/ScienceMech11Test/ScienceMech11Test.ino @@ -0,0 +1,44 @@ +#define RS485 Serial3 +#define POTHOS_DEBUG +#include + +enum HARDWARE{ + ENABLE = 2, + RGB_R = 1, + RGB_G = 32, + RGB_B = 6, + BLED = 13, +}; + +enum DATA{ + LED = 0, + TIME= 1 +}; + +pothos comms(3, HARDWARE::ENABLE, 50, HARDWARE::RGB_R, HARDWARE::RGB_G, HARDWARE::RGB_B); + +void setup() { + comms.setup(115200); + + #ifndef POTHOS_DEBUG + Serial.begin(9600); + #endif + + pinMode(HARDWARE::BLED, OUTPUT); + + set_data_types(); +} + +void loop() { + comms.update(); + + digitalWrite(HARDWARE::BLED, comms.data.get_char_data(DATA::LED)); + + comms.data.set_data(DATA::TIME, (long)(millis())); +} + + +void set_data_types(){ + comms.data.set_type(DATA::LED, "char"); //chars are actually unsigned 8bit integers in disquise and are the closest thing to a bool that's supported by pothos. + comms.data.set_type(DATA::TIME, "long"); +} diff --git a/software/firmware/libraries/pothos/examples/Pothos V1,1 Dev & testing/Test_Comms/Test_Comms.ino b/software/firmware/libraries/pothos/examples/Pothos V1,1 Dev & testing/Test_Comms/Test_Comms.ino new file mode 100644 index 0000000..4b7142d --- /dev/null +++ b/software/firmware/libraries/pothos/examples/Pothos V1,1 Dev & testing/Test_Comms/Test_Comms.ino @@ -0,0 +1,17 @@ +void setup() { + // put your setup code here, to run once: + pinMode(33,OUTPUT); + digitalWrite(33,LOW); + Serial3.begin(115200); + Serial.begin(9600); +} + +void loop() { + // put your main code here, to run repeatedly: + if(Serial.available()) + if(Serial.read() == 'r'){ + Serial.println(Serial3.available()); + while(Serial3.available()) + Serial.println(Serial3.read()); + } +} diff --git a/software/firmware/libraries/pothos/examples/Pothos V1,1 Examples (current)/NodeTemplate/NodeTemplate.ino b/software/firmware/libraries/pothos/examples/Pothos V1,1 Examples (current)/NodeTemplate/NodeTemplate.ino new file mode 100644 index 0000000..8e6386b --- /dev/null +++ b/software/firmware/libraries/pothos/examples/Pothos V1,1 Examples (current)/NodeTemplate/NodeTemplate.ino @@ -0,0 +1,47 @@ +#define RS485 Serial1 //Select RS-485 Serial Port. //This needs to be changed based on the design +//#define POTHOS_DEBUG //Comment this out for extra efficiency. Leave as is for verbose debug statements over USB. +#include //Include pothos library + +enum PIN{ //Enum of pinouts + EN485 = 0, //RS485 Enable Pin + RGB_R = 1, //RGB LED pins (logic low) + RGB_G = 11, + RGB_B = 12, + //BLUE_LED = 13, +}; + +enum REGISTER{ //Enum of register addresses + //TEMP = 0, //example register 0 for reading temperature data + //CURRENT = 1, //example register 0 for reading current data +}; + +int pothosTimeout = 50; //The recomended pothos timeout is 50 ms +uint8_t slaveID = 1; //The slave ID for the node (1-255) + +pothos comms(slaveID, PIN::EN485, pothosTimeout, PIN::RGB_R, PIN::RGB_G, PIN::RGB_B); //init the pothos library + +void setup(){ + comms.setup(500000); //Pothos will communicate at a baudrate of 500Kbps //This is high enough to ensure that data speeds will never be the bottleneck. + + #ifdef POTHOS_DEBUG + Serial.begin(115200); + #endif + + setPinModes(); //Sets all pinmodes + setDataTypes(); //Sets all pothos data types +} + +void loop(){ + comms.update(); //maintains communication over pothos +} + +void setPinModes(){ //This function will set the pinmode of all non-pothos pins (exclude 485-enable, Rx, Tx, and RGBLED pins) + //pinMode(PIN::BLUE_LED, OUTPUT); //Sets the blue LED on pin 13 to an output +} + +void setDataTypes(){ //This function is for setting the data type of each register + //comms.data.set_type(REGISTER::LED, "char"); //chars are actually unsigned 8bit integers in disquise and are the closest thing to a bool that's supported by pothos + //comms.data.set_type(REGISTER::TMP, "int"); //the temperature data is an int + //comms.data.set_type(REGISTER::TIME_DATA, "long"); //longs are also supported. time is often a long. + //comms.data.set_type(REGISTER::TMP_DATA, "float"); //floats are also supported +} diff --git a/software/firmware/libraries/pothos/examples/Pothos V1,1 Examples (current)/Pothos_1_1_node_example/Pothos_1_1_node_example.ino b/software/firmware/libraries/pothos/examples/Pothos V1,1 Examples (current)/Pothos_1_1_node_example/Pothos_1_1_node_example.ino new file mode 100644 index 0000000..283d06a --- /dev/null +++ b/software/firmware/libraries/pothos/examples/Pothos V1,1 Examples (current)/Pothos_1_1_node_example/Pothos_1_1_node_example.ino @@ -0,0 +1,63 @@ +/************************************************************ +*Title: Pothos_1_1_Node_Example.ino +*Author: Anthony Grana +*Purpose: To give an example of simple node communicating with pothos +*Description: This Code can be run on a node to communicate over pothos. +* Through the pothos protocol, This node will relay data from a temperature sensor, and will change the state of an LED. +*************************************************************/ + + +#define RS485 Serial3 //Select RS-485 Serial Port. Reference https://www.pjrc.com/teensy/card7a_rev1.png to find serial port for your pinout. +#define POTHOS_DEBUG //Comment this out for extra efficiency. Leave as is for verbose debug statements over USB. +#include //Include pothos library + +enum HARDWARE{ //HARDWARE enum for recording where all of the pins are connected. + ENABLE = 33, //RS-485 broadcast enable + RGB_R = 1, //RGB LED pins (logic low) + RGB_G = 32, + RGB_B = 6, + BLED = 13, //msc LED pin + TMP_PIN = A13 //temperature sensor pin +}; + +enum DATA{ //Enum the registers that will store pothos data + LED = 0, //A register that will control an led + TMP = 1 //A register for storing and broadcasting temperature data +}; + +int pothos_timeout = 50; //Set timeout (ms) +int slave_id = 2; //Set slave ID + + + +// ID# enable pin timeout(ms) RGB_LED_r pin RGB_LED_g pin RGB_LED_b pin +pothos comms(slave_id, HARDWARE::ENABLE, pothos_timeout, HARDWARE::RGB_R, HARDWARE::RGB_G, HARDWARE::RGB_B); // setup Pothos class as "comms" + +void setup() { + comms.setup(115200); //start pothos comms at baudrate 115200 (pretty fast) + + #ifdef POTHOS_DEBUG //If debugging, start USB serial port at 115200 baud + Serial.begin(115200); + #endif + + pinMode(HARDWARE::BLED, OUTPUT); //msc pinmode setting + pinMode(HARDWARE::TMP_PIN, INPUT); + + set_data_types(); //Pothos needs to know what data type to expect for each register so this function is necessary +} + +void loop() { + comms.update(); //This does all of the pothos comms + + digitalWrite(HARDWARE::BLED, comms.data.get_char_data(DATA::LED)); //This is how you read data set by the master. In this case it is controlling an LED state + + comms.data.set_data(DATA::TMP, analogRead(HARDWARE::TMP_PIN)); //This is how to write to a register, in this case we're saving whatever data comes from the temp sensor +} + + +void set_data_types(){ //This fiction is for setting the data type of each register + comms.data.set_type(DATA::LED, "char"); //chars are actually unsigned 8bit integers in disquise and are the closest thing to a bool that's supported by pothos + comms.data.set_type(DATA::TMP, "int"); //the temperature data is an int + //comms.data.set_type(DATA::TIME_DATA, "long"); //longs are also supported. time is often a long. + //comms.data.set_type(DATA::TMP_DATA, "float"); //floats are also supported +} diff --git a/software/firmware/libraries/pothos/library.properties b/software/firmware/libraries/pothos/library.properties new file mode 100644 index 0000000..382b2a4 --- /dev/null +++ b/software/firmware/libraries/pothos/library.properties @@ -0,0 +1,10 @@ +name=Pothos +version=1.2 +author=Anthony P. Grana +maintainer=Anthony P. Grana +sentence=Primary comunications protocol for the OSURC 2020 Mars Rover +paragraph=* +category=* +url=* +architectures=* + diff --git a/software/firmware/libraries/pothos/motorMasterTest.py b/software/firmware/libraries/pothos/motorMasterTest.py new file mode 100644 index 0000000..3168aec --- /dev/null +++ b/software/firmware/libraries/pothos/motorMasterTest.py @@ -0,0 +1,24 @@ +import serial +from rover20_comms import rover20_comms as pothos + +class Nodes(): + MotorNode1 = 1 + TowerNode = 2 + +class MotorNodeRegisters(): + speed = 0 + direction = 1 + temperature = 2 + current = 3 + + +dataTypes = [['chr', 'chr', 'float', 'float'], ['chr', 'int', 'int', 'float']] + + +comms = pothos(len(dataTypes), dataTypes, 'COM25', 0.030, 500000) + +comms.list_types() + +print(comms.read(Nodes.MotorNode1,[MotorNodeRegisters.temperature])) +comms.write_single(Nodes.MotorNode1,MotorNodeRegisters.speed,chr(69)) +comms.write_multiple(Nodes.MotorNode1,[MotorNodeRegisters.speed, MotorNodeRegisters.direction], [chr(69),chr(1)]) diff --git a/software/firmware/libraries/pothos/pothos.h b/software/firmware/libraries/pothos/pothos.h new file mode 100644 index 0000000..ba72b3c --- /dev/null +++ b/software/firmware/libraries/pothos/pothos.h @@ -0,0 +1,307 @@ +/****************************************** +*Pothos V1.1 +*Author: Anthony Grana +*1/10/2020 +*OSURC Mars Rover 2019 - 2020 +******************************************/ + +#include + +#ifndef _POTHOS +#define _POTHOS +class pothos{ + private: + int ID; + int sync_counter; + int enPin; + bool LED; + int R,G,B; + int maxWrite; + unsigned long timeout; + unsigned long timeout_timer; + void read(); + void write(); + void write_multiple(); + void sync(); + void setColor(int,int,int); + public: + data_store data; + pothos(int, int, int); + pothos(int, int, int, int, int, int); + void setup(int); + void update(); + bool synced; + bool good_comms; +}; + +pothos::pothos(int SlaveID, int en, int time){ + ID = SlaveID; + enPin = en; + synced = true; + LED = false; + timeout = time; +} + +pothos::pothos(int SlaveID, int en, int time, int red, int green, int blue){ + ID = SlaveID; + enPin = en; + synced = true; + LED = true; + R = red; + G = green; + B = blue; + timeout = time; +} + + +void pothos::setup(int baud){ + pinMode(enPin,OUTPUT); + digitalWrite(enPin,LOW); + if(LED){ + pinMode(R,OUTPUT); + pinMode(G,OUTPUT); + pinMode(B,OUTPUT); + } + RS485.begin(baud); + maxWrite = RS485.availableForWrite(); +} + +void pothos::setColor(int red,int green,int blue){ + analogWrite(R,255-red); + analogWrite(G,255-green); + analogWrite(B,255-blue); +} + +void pothos::update(){ + if(synced){ + if(RS485.available()>4){ + if(LED) + setColor(0,100,0); //green if synced + good_comms = true; + #ifdef POTHOS_DEBUG + Serial.print("Heard Something "); + Serial.println(RS485.peek()); + #endif + if(RS485.read() == 0x00){ + #ifdef POTHOS_DEBUG + Serial.print("heard slave ID: "); + Serial.println(RS485.peek()); + #endif + if(RS485.read() == ID){ + #ifdef POTHOS_DEBUG + Serial.println("slave ID Match"); + #endif + if(LED) + setColor(0,0,255); //blue if recieved a packet + int fc = RS485.read(); + switch(fc){ + case(1): + read(); + break; + case(2): + write(); + break; + case(3): + write_multiple(); + break; + } + RS485.read(); + digitalWrite(enPin,HIGH); + RS485.write(0xff); + RS485.write(0xff); + RS485.write(0xff); + RS485.write(0xff); + while(RS485.availableForWrite() != maxWrite) + delayMicroseconds(1); + delayMicroseconds(800); + digitalWrite(enPin,LOW); + }else{ + sync_counter = 0; + sync(); + } + }else { + sync_counter = 0; + sync(); + } + timeout_timer = millis(); + } + }else{ + sync(); + } + if(millis() - timeout_timer < timeout){ + if(LED) + setColor(170,130,0); //yellow if not synced + }else{ + if(LED) + setColor(255,0,0); // if there has been a timeout, set LED to red. + good_comms = false; + } +} + +void pothos::read(){ + #ifdef POTHOS_DEBUG + Serial.println("Reading!"); + #endif + byte adrs[255]; + int length=0; + while(!RS485.available()) delayMicroseconds(1); + adrs[length] = RS485.read(); + unsigned long timer = millis(); + while(RS485.peek() != 255){ + if(RS485.available()){ + length++; + #ifdef POTHOS_DEBUG + Serial.print("getting adr "); + Serial.println(RS485.peek()); + #endif + adrs[length] = RS485.read(); + if(adrs[length] == 255){ + length = length -1; + break; + } + timer = millis(); + } + if(millis() - timer > timeout) + break; + } + digitalWrite(enPin,HIGH); + for(int i=0;i<=length;i++){ + #ifdef POTHOS_DEBUG + Serial.print("Transmitting at adr "); + Serial.print(adrs[i]); + Serial.print(" : "); + #endif + int type = data.get_type(adrs[i]); + + switch(type){ + case(1): + #ifdef POTHOS_DEBUG + Serial.println(data.get_char_data(adrs[i])); + #endif + RS485.write(data.get_char_data(adrs[i])); + break; + case(2): + #ifdef POTHOS_DEBUG + Serial.println(data.get_int_data(adrs[i])); + #endif + for(int j=1;j>=0;j = j-1) + RS485.write((byte)(0 | (data.get_int_data(adrs[i]) >> 8*(1-j)))); + break; + case(3): + #ifdef POTHOS_DEBUG + Serial.println(data.get_long_data(adrs[i])); + #endif + for(int j=3;j>=0;j = j-1) + RS485.write((byte)(0 | ((data.get_long_data(adrs[i]) >> 8*(3-j))))); + break; + case(4): + #ifdef POTHOS_DEBUG + Serial.println(data.get_float_data(adrs[i]),9); + #endif + float datf = data.get_float_data(adrs[i]); + byte* dat_raw = (byte*)(&datf); + for(int j=0;j<4;j++) + RS485.write(dat_raw[j]); + break; + } + RS485.write(byte(0x00)); + } + RS485.write(0xff); + #ifdef POTHOS_DEBUG + Serial.println("\n"); + #endif +} + +void pothos::write(){ + int reg = RS485.read(); + int len; + int type = data.get_type(reg); + #ifdef POTHOS_DEBUG + Serial.println("Writing single!"); + Serial.print("data type: "); + Serial.println(type); + #endif + if(type <= 2) len = type; //determine length of data + else len = 4; + #ifdef POTHOS_DEBUG + Serial.print("register is : "); + Serial.println(reg); + Serial.print("length in bytes: "); + Serial.println(len); + if(len == 0) Serial.println("You are trying to access a register that has an unset type!!!!!!!!!!!! ERROR!!!"); + #endif + while(RS485.available()<=len) delayMicroseconds(1); //get trapped in a loop until all of the data has arived + byte data_in[len]; + for(int i=0;i= -32768 and data <= 32767 and self.data[ID-1][adr] == 'int'): + self.port.write((data).to_bytes(2, byteorder='big')) + elif(isinstance(data,float) and self.data[ID-1][adr] == 'float'): + self.port.write(bytearray(struct.pack("f",data))) + elif(isinstance(data,str) and self.data[ID-1][adr] == 'chr'): + self.port.write(data.encode('utf-8')) + elif(isinstance(data, int) and data >= -2147483648 and data <= 2147483647 and self.data[ID-1][adr] == 'long'): + self.port.write((data).to_bytes(4, byteorder='big')) + else: + raise TypeError("Transmit Error\nThe data you're trying to send does not mach the type stored in the register\nor, the pothos protocol does not support that data type\n or the data you're trying to send is too large or too small") + self.port.write(bytes([0xff])) + while(self.port.out_waiting): + time.sleep(0.000001) + acknowledge = self.port.read(4) + if (not(acknowledge == (bytes(b'\xff\xff\xff\xff')))): + print("Bad acknowledge!!!!") + self.port.write(b'\xff\xff\xff\xff\xff') + + + def wait_until(self,byt): + timer_start = time.time() + while(self.port.in_waiting < byt): + time.sleep(0.000001) + if (time.time() - timer_start >= self.timeout): + print("A man has fellen into the river in lego city!") + return False + return True + + def read(self,ID,address): + good_comms = True + self.port.write(bytes([0x00])) + self.port.write(bytes([ID])) + self.port.write(bytes([0x01])) + for i in address: + self.port.write(bytes([i])) + self.port.write(bytes([0xff])) + while(self.port.out_waiting): + time.sleep(0.000001) + data_list = [] + for i in address: + if(self.data[ID-1][i] == 'float'): + if(self.wait_until(4)): + data_list.append(struct.unpack('f',self.port.read(4))) + elif(self.data[ID-1][i] == 'int'): + if(self.wait_until(2)): + data_list.append(struct.unpack('h',self.port.read(2))) + elif(self.data[ID-1][i] == 'long'): + if(self.wait_until(4)): + data_list.append(struct.unpack('i',self.port.read(4))) + elif(self.data[ID-1][i] == 'chr'): + if(self.wait_until(1)): + data_list.append(struct.unpack('c',self.port.read(1))) + self.wait_until(1) + if(not(self.port.read(1) == b'\x00')): + print("Type Error when reading data from a slave\nThis will also cause a \"Bad acknowledge\" Error") + time.sleep(0.002) + self.port.reset_input_buffer() + break + sync = self.port.read(5) + if(not(sync == b'\xff\xff\xff\xff\xff')): + print("Bad acknowledge!!!!") + self.port.write(b'\xff\xff\xff\xff\xff') + return(data_list) + + def write_multiple(self,ID,adr,data): + self.port.write(bytes([0x00])) + self.port.write(bytes([ID])) + self.port.write(bytes([0x03])) + for i in range(len(adr)): + self.port.write(bytes([adr[i]])) + if(isinstance(data[i], int) and data[i] >= -32768 and data[i] <= 32767 and self.data[ID-1][adr[i]] == 'int'): + self.port.write((data[i]).to_bytes(2, byteorder='big')) + elif(isinstance(data[i],float) and self.data[ID-1][adr[i]] == 'float'): + self.port.write(bytearray(struct.pack("f",data[i]))) + elif(isinstance(data[i],str) and self.data[ID-1][adr[i]] == 'chr'): + self.port.write(data[i].encode('utf-8')) + elif(isinstance(data[i], int) and data[i] >= -2147483648 and data[i] <= 2147483647 and self.data[ID-1][adr[i]] == 'long'): + self.port.write((data[i]).to_bytes(4, byteorder='big')) + else: + raise TypeError("Transmit Error\nThe data you're trying to send does not mach the type stored in the register\nor, the pothos protocol does not support that data type\n or the data you're trying to send is too large or too small") + self.port.write(bytes([0xff])) + while(self.port.out_waiting): + time.sleep(0.000001) + self.wait_until(4) + acknowledge = self.port.read(4) + if (not(acknowledge == (bytes(b'\xff\xff\xff\xff')))): + print("Bad acknowledge!!!!mult") + self.port.write(b'\xff\xff\xff\xff\xff') + + + + +""" +data_types = [['chr','int','chr','float','chr','float'], #slave + ['chr','int','chr','float','chr','float'], + ['chr','int','chr','float','chr','float'], + ['chr','int','chr','float','chr','float'], + ['chr','int','chr','float','chr','float'], + ['chr','int','chr','float','chr','float']] + + +pothos = rover20_comms(6, data_types,'/dev/ttyUSB0',0.030) #class instantiation + +pothos.list_types() #list stored data types + + +for i in range(1,7): + pothos.write_single(i,2,'1') + +while(1): + print("Driving forward at 50% speed") + for i in range(10): + for i in range(1,7): + pothos.write_multiple(i,[1,0],[127,'1']) + time.sleep(.25) + print("Driving backwords at 50% speed") + for i in range(10): + for i in range(1,7): + pothos.write_multiple(i,[1,0],[127,'\0']) + time.sleep(.25) + print("Stopping") + for i in range(1,7): + pothos.write_multiple(i,[1,0],[0,'\0']) + time.sleep(1) + print("Turning right") + for i in range(10): + for i in range(1,4): + pothos.write_multiple(i,[1,0],[40,'1']) + for i in range(4,7): + pothos.write_multiple(i,[1,0],[40,'\0']) + time.sleep(.25) + print("Turning left") + for i in range(10): + for i in range(1,4): + pothos.write_multiple(i,[1,0],[40,'\0']) + for i in range(4,7): + pothos.write_multiple(i,[1,0],[40,'1']) + time.sleep(.25) +"""