Mid level control code

Dependencies:   ros_lib_kinetic

Revision:
32:8c59c536a2a6
Parent:
31:08cb04eb75fc
Child:
33:9877ca32e43c
--- a/main.cpp	Wed Mar 06 10:28:59 2019 +0000
+++ b/main.cpp	Fri Mar 08 12:44:29 2019 +0000
@@ -49,27 +49,34 @@
     while( true ) {
         hlcomms.newData.wait();
         input = hlcomms.get_demands();
-        
         // PROCESS INPUT
-        double maxTimesToTarget_s[3];
+        double maxTimesToTarget_s[3] = { -1.0 };
+        //[8,7,6,4,3,-1,-1,0,-1]
+        //FRONT = channels 0,1,2
+        //MID = channels 3,4(,5)
+        //REAR = channels (6,)7(,8)
+        // Lock mutex, preventing setDemandsForLL from running
+        mutPathIn.lock();
         for(short int segNum=0; segNum<3; segNum++) {
             // Limit requested speed
-            double limitedSpeed_mmps = min( max( 0.0 , input.speeds_mmps[segNum] ) , (double)MAX_SPEED_MMPS );
-            if( limitedSpeed_mmps > 0 ) {
-                // Lock mutex, preventing setDemandsForLL from running
-                mutPathIn.lock();
+            if( input.speeds_mmps[segNum] > 0 ) {
+                double limitedSpeed_mmps = min( max( 0.0 , input.speeds_mmps[segNum] ) , (double)MAX_SPEED_MMPS );
                 // For each actuator, limit the input position, calculate the position change, and select the absolute max
                 double dblDistanceToTarget_mm[3] = { -1.0 };
                 double maxDistanceToTarget_mm = 0.0;
-                for(int i=segNum*3; i<segNum*3+3; i++) {
-                    double dblCurrentPosition_mm = llcomms.positionSensor_mm[i];
-                    if(input.psi_mm[i]<0 || dblCurrentPosition_mm<0) { // If requested position is negative or the sensor feedback is erroneous
+                for(short int i=0; i<3; i++) {
+                    short int channel = segNum*3+i;
+                    if(channel==8) { // !!!!!!!!!!!!!!!! This is horrible
+                        continue;
+                    }
+                    double dblCurrentPosition_mm = llcomms.positionSensor_mm[channel];
+                    if(input.psi_mm[channel]<0 || dblCurrentPosition_mm<0) { // If requested position is negative or the sensor feedback is erroneous
                         continue;
                     }
                     // Limit actuator position
-                    input.psi_mm[i] = min( max( 0.0 , input.psi_mm[i] ) , (double)MAX_ACTUATOR_LIMIT_MM );
+                    input.psi_mm[channel] = min( max( 0.0 , input.psi_mm[channel] ) , (double)MAX_ACTUATOR_LIMIT_MM );
                     // Calculate actuator position change
-                    dblDistanceToTarget_mm[i] = fabs(input.psi_mm[i] - dblCurrentPosition_mm);
+                    dblDistanceToTarget_mm[i] = fabs(input.psi_mm[channel] - dblCurrentPosition_mm);
                     // Select the max absolute actuator position change
                     if(dblDistanceToTarget_mm[i]>maxDistanceToTarget_mm) {
                         maxDistanceToTarget_mm = dblDistanceToTarget_mm[i];
@@ -78,20 +85,21 @@
                 // For max actuator position change, calculate the time to destination at the limited speed
                 maxTimesToTarget_s[segNum] = fabs(maxDistanceToTarget_mm) / limitedSpeed_mmps;
                 // For each actuator, replan target position and velocity as required
-                for(int i=segNum*3; i<segNum*3+3; i++) {
+                for(short int i=0; i<3; i++) {
+                    short int channel = segNum*3+i;
                     // If requested actuator position change is already within tolerance, do NOT replan that actuator
                     if( dblDistanceToTarget_mm[i] <= 0.0 ) continue;
                     // Calculate velocity for each motor to synchronise movements to complete in max time
                     // Set dblDemandPosition_mm and dblDemandSpeed_mmps
-                    dblDemandPosition_mm[i] = input.psi_mm[i];
-                    dblDemandSpeed_mmps[i] = dblDistanceToTarget_mm[i] / maxTimesToTarget_s[segNum];
+                    dblDemandPosition_mm[channel] = input.psi_mm[channel];
+                    dblDemandSpeed_mmps[channel] = dblDistanceToTarget_mm[i] / maxTimesToTarget_s[segNum];
                 }
-                // Unlock mutex, allowing setDemandsForLL to run again
-                mutPathIn.unlock();
             } else {
-                maxTimesToTarget_s[segNum] = -1;
+                maxTimesToTarget_s[segNum] = -1.0;
             }
         }
+        // Unlock mutex, allowing setDemandsForLL to run again
+        mutPathIn.unlock();
         
         // SEND MESSAGE
         hlcomms.send_durations_message(maxTimesToTarget_s);