diff --git a/firmware/Components.cpp b/firmware/Components.cpp index 0931017..8fcd8cd 100644 --- a/firmware/Components.cpp +++ b/firmware/Components.cpp @@ -350,9 +350,68 @@ char * AtlasPH::name(){ } bool AtlasPH::set(const char* param, const char* value){ - if (strncmp(param, "temp", 4) == 0){ - this->setTemp(atof(value)); - return true; + if (strncmp(param, "t", 1) == 0){ + if ( value != NULL ) + { + this->setTemp(atof(value)); + return true; + } + //Send temperature compensation value + else + { + char output_str[DEFAULT_BUFFER_SIZE + 3]; + snprintf(output_str, DEFAULT_BUFFER_SIZE, + "{" + "\"s%u\":{" + "\"type\":\"%s\"," + "\"data\":\t,%f\"" + "}" + "}", + channel_, + this->name(), + temperature + ); + send(output_str); + + } + } else if (strncmp(param, "c", 1) == 0){ + //Get calibration status + if (value == NULL) + { + char output_str[DEFAULT_BUFFER_SIZE + 3]; + snprintf(output_str, DEFAULT_BUFFER_SIZE, + "{" + "\"s%u\":{" + "\"type\":\"%s\"," + "\"data\":\"c,%f\"" + "}" + "}", + channel_, + this->name(), + calibrationStatus + ); + send(output_str); + + } + //Calibrate PH lowpoint + else if(strncmp(value, "low", 3) == 0) + { + this->calibrate(-1); + return true; + } + //Calibrate PH midpoint + else if(strncmp(value, "mid", 3) == 0) + { + this->calibrate(0); + return true; + } + //Calibrate PH highpoint + else if(strncmp(value, "high", 4) == 0) + { + this->calibrate(1); + return true; + } + //Serial.println("trigger calibrate method"); } return false; } @@ -571,21 +630,93 @@ char * AtlasDO::name(){ } bool AtlasDO::set(const char* param, const char* value){ - if (strncmp(param, "ec", 2) == 0){ - this->setEC(atof(value)); - return true; - } else if (strncmp(param, "temp", 4) == 0){ - this->setTemp(atof(value)); - return true; - } else if (strncmp(param, "cal", 3) == 0){ - //Serial.println("trigger calibrate method"); + if (strncmp(param, "e", 1) == 0){ + if ( value != NULL ) + { + this->setEC(atof(value)); + return true; + } + else + { + char output_str[DEFAULT_BUFFER_SIZE + 3]; + snprintf(output_str, DEFAULT_BUFFER_SIZE, + "{" + "\"s%u\":{" + "\"type\":\"%s\"," + "\"data\":\e,%f\"" + "}" + "}", + channel_, + this->name(), + ec + ); + send(output_str); + } + } else if (strncmp(param, "t", 1) == 0){ + if ( value != NULL ) + { + this->setTemp(atof(value)); + return true; + } + //Send temperature compensation value + else + { + char output_str[DEFAULT_BUFFER_SIZE + 3]; + snprintf(output_str, DEFAULT_BUFFER_SIZE, + "{" + "\"s%u\":{" + "\"type\":\"%s\"," + "\"data\":\t,%f\"" + "}" + "}", + channel_, + this->name(), + temperature + ); + send(output_str); + + } + } else if (strncmp(param, "c", 1) == 0){ + //Get calibration status + if (value == NULL) + { + char output_str[DEFAULT_BUFFER_SIZE + 3]; + snprintf(output_str, DEFAULT_BUFFER_SIZE, + "{" + "\"s%u\":{" + "\"type\":\"%s\"," + "\"data\":\"c,%f\"" + "}" + "}", + channel_, + this->name(), + calibrationStatus + ); + send(output_str); + + } + //Zero DO sensor + else if(strncmp(value, "zero", 4) == 0) + { + this->calibrate(0); + return true; + } + //Calibrate DO sensor to atmospheric pressure + else if(strncmp(value, "atm", 3) == 0) + { + this->calibrate(1); + return true; + } + + //Serial.println("trigger calibrate method"); } return false; } +//Clamp temperature to range 0,100.0 void AtlasDO::setTemp(double temp) { if (temp > 0.0){ - this->temperature = temp; + this->temperature = min(temp, 100.0); lastCommand = SET_TEMP; this->sendCommand(); } @@ -908,3 +1039,97 @@ uint32_t Winch::encoder(bool *valid) return enc1; } + +GrabSampler::GrabSampler(int channel):Sensor(channel), PoweredSensor(channel, true), channel_(channel) +{ +// init_time = millis(); + +pinMode(board::SENSOR[channel_].GPIO[board::RX_POS], OUTPUT); +pinMode(board::SENSOR[channel_].GPIO[board::TX_POS], OUTPUT); +pinMode(board::SENSOR[channel_].GPIO[board::RX_NEG], OUTPUT); +pinMode(board::SENSOR[channel_].GPIO[board::TX_NEG], OUTPUT); +disable(0); +disable(2); + +} + +/*void GrabSampler::loop() +{ + if( millis() - init_time > wait_time && !isActive) + { + //start_time = millis(); + //isActive = true; + powerOn(); + pinMode(board::SENSOR[channel_].GPIO[board::RX_POS], HIGH); + pinMode(board::SENSOR[channel_].GPIO[board::RX_NEG], HIGH); + pinMode(board::SENSOR[channel_].GPIO[board::TX_POS], HIGH); + pinMode(board::SENSOR[channel_].GPIO[board::TX_NEG], HIGH); + } + else if( isActive && millis() - start_time > pump_time ) + { + powerOff(); + pinMode(board::SENSOR[channel_].GPIO[board::RX_POS], LOW); + pinMode(board::SENSOR[channel_].GPIO[board::RX_NEG], LOW); + pinMode(board::SENSOR[channel_].GPIO[board::TX_POS], LOW); + pinMode(board::SENSOR[channel_].GPIO[board::TX_NEG], LOW); + start_time = millis()*100; + } + + +}*/ +char * GrabSampler::name() +{ + return "GrabSampler"; + +} + +void GrabSampler::enable(int pump_num) +{ + + switch(pump_num) + { + case 0: case 1: digitalWrite(board::SENSOR[channel_].GPIO[board::RX_POS], HIGH); analogWrite(board::SENSOR[channel_].GPIO[board::RX_NEG], pump_num == 0 ? 255 : 0); break; + case 2: case 3: digitalWrite(board::SENSOR[channel_].GPIO[board::TX_POS], HIGH); analogWrite(board::SENSOR[channel_].GPIO[board::TX_NEG], pump_num == 2 ? 255 : 0); break; + default: break; + }; +} + + +void GrabSampler::disable(int pump_num) +{ + digitalWrite(board::SENSOR[channel_].GPIO[pump_num < 2 ? board::RX_POS: board::TX_POS], LOW); +} + +bool GrabSampler::set(const char* param, const char* value) +{ + // Turn pumps on or off depending on command + if (!strncmp("e", param, 2)) + { + int pump_num = atol(value); + active[pump_num] = true; + enable(pump_num); + powerOn(); + return true; + } + else if (!strncmp("d", param, 2)) + { + int pump_num = atol(value); + active[pump_num] = false; + disable(pump_num); + + //Check if any pump is still enabled + for(int i = 0; i < 4; i++) if (active[i]) return true; + + powerOff(); + return true; + } + // Return false for unknown command. + else + { + return false; + } +} + + + + diff --git a/firmware/Components.h b/firmware/Components.h index 1a0ed97..f62fd49 100644 --- a/firmware/Components.h +++ b/firmware/Components.h @@ -244,6 +244,21 @@ namespace platypus int32_t desired_velocity_; uint32_t desired_acceleration_; }; + + class GrabSampler : public PoweredSensor + { + public: + GrabSampler(int channel); + virtual char * name(); + void enable(int pump_num); + void disable(int pump_num); + bool set(const char* param, const char* value); + + private: + int channel_; + bool active[4] = {0,0,0,0}; + Servo pwm[2]; + }; } #endif //COMPONENTS_H diff --git a/firmware/firmware.ino b/firmware/firmware.ino index 6826b90..82db267 100644 --- a/firmware/firmware.ino +++ b/firmware/firmware.ino @@ -194,9 +194,9 @@ void setup() // TODO: replace this with smart hooks. // Initialize sensors platypus::sensors[0] = new platypus::ServoSensor(0); - platypus::sensors[1] = new platypus::GY26Compass(1); - platypus::sensors[2] = new platypus::GY26Compass(2); - platypus::sensors[3] = new platypus::GY26Compass(3); + platypus::sensors[1] = new platypus::AtlasDO(1); + platypus::sensors[2] = new platypus::AtlasPH(2); + platypus::sensors[3] = new platypus::GrabSampler(3); // Initialize motors platypus::motors[0] = new platypus::Dynamite(0);