From 71299291d4251b311f26071622befe00d2aed4c6 Mon Sep 17 00:00:00 2001
From: Malaurie Bernard <mbernard@kinouby>
Date: Fri, 30 Jun 2023 13:53:24 +0200
Subject: [PATCH] Complete modification of the syringe class with basic
 functions (setters and getters) throough a Json document

---
 syringe.cpp | 416 +++-------------------------------------------------
 1 file changed, 23 insertions(+), 393 deletions(-)

diff --git a/syringe.cpp b/syringe.cpp
index 4cba6ce..177f29c 100644
--- a/syringe.cpp
+++ b/syringe.cpp
@@ -1,434 +1,64 @@
+
 #include <math.h>
 
 #include "syringe.h"
 
-void Syringe::showConfiguration (const Syringe_configuration_t& conf)
-/***
--Argument : Address of configuration to show
--Return   : /
--Action   : Displays syringe attributes
-***/
-{
-    Motor::showConfiguration();
-
-    auto step = whereStep();
 
-    Serial.printf("#     push clockwise: %s"
-                  "#     diameter: %g mm\n"
-                  "#     capacity: %g uL\n"
-                  "#     rate: %g uL/s = %g mm/s\n"
-                  "#     volume: %g uL (target)\n"
-                  "#     direction: %s\n"
-                  "#     zeroing: %d\n"
-                  "#     emergency: %d\n"
-                  "#     current position: %g mm %g ul %d steps\n",
-                  getPushClockwise()? "yes": "no",
-                  conf.diameter_mm,
-                  conf.capacity_ul,
-                  conf.rate_ul_per_s,
-                  mm3ToMm(conf.rate_ul_per_s),
-                  conf.volume_value * conf.volume_unit_ul,
-                  conf.direction > 0? "infuse": "withdraw",
-                  emergency(),
-                  stepToMm(step), mmToMm3(stepToMm(step)), step); //Current position of syringe pump in terms of displacement, volume and motor pitch
-}
 
-float Syringe::confToMm3 () const
-/***
--Argument : /
--Return   : Total syringe volume in mm3
--Action   : /
-***/
+//SET METHODES
+void Syringe :: set_total_volume_mL(float total_volume_mL)
 {
-    return current_configuration.direction * current_configuration.volume_value * current_configuration.volume_unit_ul;
+    SyringeJSON["total_volume_mL"] = total_volume_mL;
 }
 
-float Syringe::sectionMm2 () const
-/***
--Argument : /
--Return   : The cross-sectional area of the syringe plunger in mm2.
--Action   : /
-***/
+void Syringe :: set_internal_diameter_mm(float internal_diameter_mm)
 {
-    return pow(current_configuration.diameter_mm / 2, 2) * M_PI;
+    SyringeJSON["internal_diameter_mm"] = internal_diameter_mm;
 }
 
-float Syringe::mm3ToMm (float mm3) const
-/***
--Argument : Volume to be delivered in mm3.
--Return   : Distance to be covered (=volume divided by piston cross-section) in mm
--Action   : /
-***/
-{
-    return mm3 / sectionMm2();
+void Syringe :: set_id(int id){
+    SyringeJSON["id"] = id;
 }
 
-float Syringe::mmToMm3 (float mm) const
-{
-/***
--Argument : Distance in mm
--Return   : Syringe volume given distance covered
--Action   : /
-***/
-    return mm * sectionMm2();
-}
 
-float Syringe::confToMm () const
-/***
--Argument : /
--Return   : Total syringe length in mm
--Action   : /
-***/
-{
-    return mm3ToMm(confToMm3());
-}
 
-void Syringe::fill ()
-/***
--Argument : /
--Return   : /
--Action   : Move the syringe forward
-***/
+//GET METHODES
+float Syringe :: get_total_volume_mL()
 {
-    Serial.printf("# set speed to %g mm/s\n", mm3ToMm(current_configuration.rate_ul_per_s));
-    setSpeedMmPerSec(mm3ToMm(current_configuration.rate_ul_per_s));
-    moveToMm(confToMm());
+    return SyringeJSON["total_volume_mL"].as<float>();
 }
 
-
-bool Syringe::configureSyringe(const Syringe_configuration_t& config)
-/***
--Argument : Address to syringe configuration
--Return   : A Boolean indicating whether the syringe configuration is correct
--Action   : /
-***/
+float Syringe :: get_internal_diameter_mm()
 {
-    if (config.diameter_mm <= 0)
-        return false;
-
-    if (config.volume_value < 0)
-        return false;
-
-    if (config.volume_unit_ul <= 0)
-        return false;
-
-    if (config.rate_ul_per_s <= 0)
-        return false;
-
-    if (config.direction != 1 && config.direction != -1)
-        return false;
-
-    this->current_configuration = config;
-
-    this->piston_surface = M_PI * pow(config.diameter_mm,2) / 4.;
-    this->is_configured = true;
-
-    return true;
+    return SyringeJSON["internal_diameter_mm"].as<float>();
 }
 
-void Syringe::findZero (float mmPerSec, float maxCourseMm)
-/***
--Argument : Optional, otherwise two numbers for setting travel speed and maximum syringe pump length
--Return   : /
--Action   : Set syringe pump to position 0
-***/
+int Syringe :: get_id()
 {
-    if (emergency())
-        return;
-    if (mmPerSec > 0)
-        setSpeedMmPerSec(mmPerSec);
-    else
-        setSpeedMmPerSec(mm3ToMm(current_configuration.rate_ul_per_s));
-    resetPosition();
-    moveToMm(-maxCourseMm);
+    return SyringeJSON["id"].as<float>();
 }
 
-void Syringe::runFromEmergency (float mmPerSec, float maxCourseMm)
-/***
--Argument : Optional, otherwise two numbers for setting travel speed and maximum syringe pump length
--Return   : /
--Action   : move the pump sloowly until the limit switch is released
-***/
-{
-    if (emergency())
-    {
-        Serial.printf("EMERGENCY: running away slowly\n");
-        setSpeedMmPerSec(mmPerSec);
-        resetPosition();
-        moveToMm(maxCourseMm);
-    }
-}
 
-void Syringe::resetPosition ()
-/***
--Argument : /
--Return   : /
--Action   : Changes the zero position as the current one
-***/
-{
-  Motor::resetPosition();
-}
 
-void Syringe::manageEmergency (bool pressed, bool stepperMoving)
-/***
--Argument : two boolean to know the position of the limit switch and if the stepper is moving
--Return   : /
--Action   : Manage different emergency cases (move the pump if necessary)
-***/
+void Syringe :: setupJsonSyringe( float total_volume_mL, float internal_diameter_mm, int id)
 {
-    if (pressed)  //if the limit switch is pressed
-    {
-        setEmergency();  //we're entering a state of emergency
-        if (stepperMoving)
-        {
-          Serial.printf("EMERGENCY\n");
-          runFromEmergency();
-        }
-        else
-        {
-          Serial.printf("EMERGENCY: Pressed by someone\n");
-        }
-
-    }
-    else
-    {
-        Serial.printf("EMERGENCY: released\n");
-        setEmergency(false);
-        stayHere();
-        resetPosition();  //zero is here again
-        Serial.printf("ZERO: reset\n");
-    }
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+    
+    //ADD INITIALISATION VALUES TO THE DOC
+    SyringeJSON["total_volume_mL"] = total_volume_mL;
+    SyringeJSON["internal_diameter_mm"] = internal_diameter_mm;
+    SyringeJSON["id"] = id;
 
 
+    //GENERATE THE MINIFIED JSON AND SEND IT TO THE SERIAL PORT
+    serializeJson(SyringeJSON, Serial);
 
-
-
-
-
-
-
-
-
-
-
-#if 0
-float Syringe::volumeToDistance(float volume)
-/***
--Argument : Volume in mL
--Return   : The distance to cover associated
--Action   : /
-***/
-{
-    // Volume is in mL => convert to mm³
-    float volume_in_mm3 = 1000*volume;
-
-    // Distance to travel is in mm => use syringe piston surface in mm²
-    float distance = volume_in_mm3/this->piston_surface;
-
-    return distance;
-}
-#endif
-
-#if 0
-void Syringe::setInitialContent(float initial_volume)
-/***
--Argument : Initial volume in the syringe
--Return   : /
--Action   : Initializes the initial volume contained in the syringe to the given volume
-***/
-{
-    this->remaining_volume = initial_volume;
-}
-
-
-/**********************fonction qui rassemble les fonctions push et pull de la fin non ?*********************/
-void Syringe::moveMotor(bool direction, float duration, float speed)
-/***
--Argument : The direction, duration and speed of the desired movement
--Return   : /
--Action   : /
-***/
-{
-    float quantity = speed*this->piston_surface*duration; //Volume delivered in mm3
-    if (direction == true)  //If you deliver a quantity
-    {
-        if (quantity <= this->remaining_volume) //Check that there's enough cash left for the request
-        {
-            this->remaining_volume -= quantity;  //Update the remaining volume
-        }
-        else
-        {
-            quantity = this->remaining_volume;  // Otherwise, we deliver all the remaining liquid
-            this->remaining_volume = 0;
-        }
-    }
-    else // If we are retrieving liquid
-    {
-        if (this->remaining_volume + quantity <= this->current_configuration.capacity_ul)  // We check if there is enough space in the syringe
-        {
-            this->remaining_volume += quantity;   // We update the remaining volume (adding what we retrieved)
-        }
-        else
-        {
-            quantity = this->current_configuration.capacity_ul - this->remaining_volume;  // Otherwise, we retrieve all the liquid we can store
-            this->remaining_volume = this->current_configuration.capacity_ul;
-        }
-    }
-
-    // TODO: recompute duration to match quantity before sending the command to the motor
-    motor.turn(direction, duration, speed);
-    }
-
-
-void Syringe::reset()
-/***
--Argument : /
--Return   : /
--Action   : Resets syringe pump to initial position (not zero, but the position before starting to deliver/retrieve liquid)
-***/
-{
-    float speed = 100; // Default to 10 cm/min
-    this->pull(this->current_configuration.capacity_ul, speed);
 }
 
 
 
-/***PUSH***/
-void Syringe::push(float volume, float throughput)
-/***
--Argument : Volume in mL, throughput in µL/min
--Return   : /
--Action   : Push the volume requested with the throughput imposed (duration is deduced)
-***/
-{
-    // Ensure syringe is configured before using it
-    if (this->is_configured == false)
-        return;
-    this->pushFor(volume/throughput, throughput);
-}
-
-void Syringe::pushAll(float throughput)
-/***
--Argument : Throughput in µL/min
--Return   : /
--Action   : Push all the liquid the syringe contains with the throughput imposed
-***/
-{
-    // Ensure syringe is configured before using it
-    if (this->is_configured == false)
-        return;
-
-    this->push(this->current_configuration.capacity_ul, throughput);
-}
-
-void Syringe::pushFor(float duration, float throughput)
-/***
--Argument : Duration in min, throughput in µL/min
--Return   : /
--Action   : Push for the duration requested with the throughput imposed (volume is deduced)
-***/
-{
-    // Ensure syringe is configured before using it
-    if (this->is_configured == false)
-        return;
-
-    float volume = throughput*duration;
-    float distance = this->volumeToDistance(volume);
-    float speed = distance/duration;
-
-    this->moveMotor(true, duration, speed);
-}
-
-void Syringe::pushVol(float volume, float duration)
-/***
--Argument : Volume in mL, duration in min
--Return   : /
--Action   : Push the volume requested in the duration imposed (throughput is deduced)
-***/
-{
-    // Ensure syringe is configured before using it
-    if (this->is_configured == false)
-        return;
-
-    float throughput = volume/duration;
-    this->push(volume, throughput);
-}
-
-
-
-/***PULL***/
-void Syringe::pull(float volume, float throughput)
-/***
--Argument : Volume in mL, throughput in µL/min
--Return   : /
--Action   : Pull the amount of volume with the thoughput requested (duration is deduced)
-***/
-{
-    // Ensure syringe is configured before using it
-    if (this->is_configured == false)
-        return;
 
-    // Volume in mL, throughput in µL/min, duration in min
-    this->pullFor(volume/throughput, throughput);
-}
 
-void Syringe::pullAll(float throughput)
-/***
--Argument : Throughput in µL/min
--Return   : /
--Action   : Pull all the liquid it can contains in
-***/
-{
-    // Ensure syringe is configured before using it
-    if (this->is_configured == false)
-        return;
 
-    float volume = throughput*duration;   //***********************************************************************************Where is duration specified ?
-    float distance = this->volumeToDistance(volume);
-    float speed = distance/duration;
 
-    this->moveMotor(false, duration, speed);
-}
 
-void Syringe::pullVol(float volume, float duration)
-/***
--Argument : Volume in mL, duration in min
--Return  : /
--Action   : Pull the volume requested in the duration imposed  (throughput is deduced)
-***/
-{
-    // Ensure syringe is configured before using it
-    if (this->is_configured == false)
-        return;
 
-    float throughput = volume/duration;
-    this->pull(volume, throughput);
-}
-#endif
-- 
GitLab