ok
Fork of g3_waterplay by
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Tue Jul 12 2022 21:07:58 by
1.7.2
