eka sinambela / Mbed 2 deprecated g3_waterplay

Dependencies:   mbed

Fork of g3_waterplay by Mario Simaremare

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Tank.cpp Source File

Tank.cpp

00001 /*
00002 * G3: WATERPLAY
00003 */
00004 
00005 #include "Printer.h"
00006 #include "Tank.h"
00007 #include "mbed.h"
00008 
00009 Tank::Tank(
00010     Printer &printer,
00011     DRV8825 &salinitySyringe,
00012     DRV8825 &waterSyringe,
00013     Ping &pinger
00014 ):
00015     _printer(printer),
00016     _salinitySyringe(salinitySyringe),
00017     _waterSyringe(waterSyringe),
00018     _pinger(pinger),
00019     _previous_direction_salt(-1),
00020     _previous_direction_pure(-1),
00021     _position_salt(14),
00022     _position_pure(27)
00023 {
00024 }
00025 
00026 bool Tank::is_proximity_ok()
00027 {
00028     int range = 0;
00029     char buffer[32];
00030 
00031     _pinger.Send();
00032     wait(0.1);
00033     range = _pinger.Read_cm();
00034 
00035     range = range/2;
00036     sprintf(
00037         buffer,
00038         "Range in cm: %d",
00039         range
00040     );
00041     _printer.toBoth(buffer);
00042 
00043     if (range >= 12) {
00044         _printer.toBoth("Proximity ok");
00045         return true;
00046     }
00047     return false;
00048 }
00049 
00050 void Tank::add(int type, int mililiters, int direction)
00051 {
00052     for (int i = 25; i < MAX_SPEED; i+=20) {
00053         if (type == TYPE_SALT)
00054             _salinitySyringe.settings(1/MICROSTEPS_PER_STEP, direction, i);
00055         else
00056             _waterSyringe.settings(1/MICROSTEPS_PER_STEP, direction, i);
00057     }
00058 
00059     //fix the changing of directions for pure
00060     if (type == TYPE_PURE) {
00061         //mililiters = mililiters * 2.0;
00062         if (_previous_direction_pure != direction)
00063             mililiters = mililiters + 1.0;
00064     }
00065 
00066     //fix the changing of directions for salt
00067     if (type == TYPE_SALT) {
00068         //mililiters = mililiters * 2.0;
00069         if (_previous_direction_salt != direction)
00070             mililiters = mililiters + 1.0;
00071         //if (_previous_direction_salt == DIRECTION_PULL)
00072         //mililiters = mililiters + 0.5;
00073     }
00074 
00075     //move with constant speed
00076     for (int i = 1; i < (MOVEMENT + (int)floor(((mililiters - 1.0)*STEP_EXTRA))); i+=1) {
00077         if (type == TYPE_SALT)
00078             _salinitySyringe.settings(1/MICROSTEPS_PER_STEP, direction, MAX_SPEED);
00079         else
00080             _waterSyringe.settings(1/MICROSTEPS_PER_STEP, direction, MAX_SPEED);
00081 
00082         //if ((i - MOVEMENT) % STEP_EXTRA == 0 && !proximity_ok())
00083         //  break;
00084     }
00085 
00086     //de-accelerate
00087     for (int i = MAX_SPEED; i > 0; i-=20) {
00088         if (type == TYPE_SALT)
00089             _salinitySyringe.settings(1/MICROSTEPS_PER_STEP, direction, i);
00090         else
00091             _waterSyringe.settings(1/MICROSTEPS_PER_STEP, direction, i);
00092     }
00093 
00094     //remember previous direction
00095     if (type == TYPE_SALT) {
00096         _previous_direction_salt = direction;
00097     } else {
00098         _previous_direction_pure = direction;
00099     }
00100 }
00101 void Tank::react(double salinity)
00102 {
00103     char buffer[32];
00104     sprintf(
00105         buffer,
00106         "salinity: %3.2F",
00107         salinity
00108     );
00109     _printer.toBothln(buffer);
00110     
00111     //this->add(TYPE_PURE, 2.0, DIRECTION_PUSH);
00112     //wait(2);
00113     //this->add(TYPE_PURE, 4.0, DIRECTION_PULL);
00114 }