Merge branch 'master' of github:/szmoore/MCTX3420
authorSam Moore <[email protected]>
Sun, 22 Sep 2013 04:04:49 +0000 (12:04 +0800)
committerSam Moore <[email protected]>
Sun, 22 Sep 2013 04:04:49 +0000 (12:04 +0800)
1  2 
server/actuator.c
server/sensor.c

diff --combined server/actuator.c
@@@ -32,7 -32,6 +32,7 @@@ void Actuator_Init(
        // Initialise pins used
        GPIO_Export(GPIO1_16);
        PWM_Export(EHRPWM0A);
 +      PWM_Export(EHRPWM0B);
        
  }
  
@@@ -53,7 -52,6 +53,6 @@@ void Actuator_SetMode(Actuator * a, Con
                        {
                                char filename[BUFSIZ];
                                const char *experiment_name = (const char*) arg;
-                               int ret;
  
                                if (snprintf(filename, BUFSIZ, "%s_a%d", experiment_name, a->id) >= BUFSIZ)
                                {
                                Log(LOGDEBUG, "Actuator %d with DataFile \"%s\"", a->id, filename);
                                // Open DataFile
                                Data_Open(&(a->data_file), filename);
+                       } 
+               case CONTROL_RESUME:  //Case fallthrough; no break before
+                       {
+                               int ret;
                                a->activated = true; // Don't forget this
-                               a->allow_actuation = true;
                                a->control_changed = false;
  
-                               // Create the thread
                                ret = pthread_create(&(a->thread), NULL, Actuator_Loop, (void*)(a));
                                if (ret != 0)
                                {
                                        Fatal("Failed to create Actuator_Loop for Actuator %d", a->id);
                                }
+                               Log(LOGDEBUG, "Resuming actuator %d", a->id);
                        }
                break;
  
                case CONTROL_EMERGENCY: //TODO add proper case for emergency
                case CONTROL_PAUSE:
-                       a->allow_actuation = false;
+                       a->activated = false;
+                       Actuator_SetControl(a, NULL);
+                       pthread_join(a->thread, NULL); // Wait for thread to exit
+                       Log(LOGDEBUG, "Paused actuator %d", a->id);
                break;
-               case CONTROL_RESUME:
-                       a->allow_actuation = true;
                break;
                case CONTROL_STOP:
-                       a->allow_actuation = false;
-                       a->activated = false;
-                       Actuator_SetControl(a, NULL);
-                       pthread_join(a->thread, NULL); // Wait for thread to exit       
+                       if (a->activated) //May have been paused before
+                       {
+                               a->activated = false;
+                               Actuator_SetControl(a, NULL);
+                               pthread_join(a->thread, NULL); // Wait for thread to exit       
+                       }
                        Data_Close(&(a->data_file)); // Close DataFile
+                       
+                       Log(LOGDEBUG, "Stopped actuator %d", a->id);
                break;
                default:
                        Fatal("Unknown control mode: %d", mode);
@@@ -130,8 -137,6 +138,6 @@@ void * Actuator_Loop(void * arg
                pthread_mutex_unlock(&(a->mutex));
                if (!a->activated)
                        break;
-               else if (!a->allow_actuation)
-                       continue;
  
                Actuator_SetValue(a, a->control.value);
        }
@@@ -257,8 -262,6 +263,6 @@@ void Actuator_EndResponse(FCGIContext 
  }
  
  
  /**
   * Handle a request for an Actuator
   * @param context - FCGI context
diff --combined server/sensor.c
@@@ -43,7 -43,6 +43,6 @@@ void Sensor_Init(
        {
                g_sensors[i].id = i;
                Data_Init(&(g_sensors[i].data_file));
-               g_sensors[i].record_data = false;       
        }
  
        // Get the ADCs
@@@ -73,7 -72,6 +72,6 @@@ void Sensor_SetMode(Sensor * s, Control
                                // Set filename
                                char filename[BUFSIZ];
                                const char *experiment_name = (const char*) arg;
-                               int ret;
  
                                if (snprintf(filename, BUFSIZ, "%s_s%d", experiment_name, s->id) >= BUFSIZ)
                                {
                                Log(LOGDEBUG, "Sensor %d with DataFile \"%s\"", s->id, filename);
                                // Open DataFile
                                Data_Open(&(s->data_file), filename);
-                               s->activated = true;
-                               s->record_data = true; // Don't forget this!
+                       }
+               case CONTROL_RESUME: //Case fallthrough, no break before
+                       {
+                               int ret;
+                               s->activated = true; // Don't forget this!
  
                                // Create the thread
                                ret = pthread_create(&(s->thread), NULL, Sensor_Loop, (void*)(s));
                                {
                                        Fatal("Failed to create Sensor_Loop for Sensor %d", s->id);
                                }
+                               Log(LOGDEBUG, "Resuming sensor %d", s->id);
                        }
-                       break;
+               break;
                case CONTROL_EMERGENCY:
                case CONTROL_PAUSE:
-                       s->record_data = false;
-               break;
-               case CONTROL_RESUME:
-                       s->record_data = true;
-               break;
-               case CONTROL_STOP:
                        s->activated = false;
-                       s->record_data = false;
                        pthread_join(s->thread, NULL);
+                       Log(LOGDEBUG, "Paused sensor %d", s->id);
+               break;
+               
+               case CONTROL_STOP:
+                       if (s->activated) //May have been paused before
+                       {
+                               s->activated = false;
+                               pthread_join(s->thread, NULL);
+                       }
  
                        Data_Close(&(s->data_file)); // Close DataFile
                        s->newest_data.time_stamp = 0;
                        s->newest_data.value = 0;
+                       Log(LOGDEBUG, "Stopped sensor %d", s->id);
                break;
                default:
                        Fatal("Unknown control mode: %d", mode);
@@@ -138,12 -144,13 +144,13 @@@ void Sensor_CheckData(SensorId id, doub
  {
        if( value > thresholds[id].max_error || value < thresholds[id].min_error)
        {
 -              Log(LOGERR, "Sensor %s is above or below its safety value of %f or %f\n", g_sensor_names[id],thresholds[id].max_error, thresholds[id].min_error);
 +              Log(LOGERR, "Sensor %s at %f is above or below its safety value of %f or %f\n", value, g_sensor_names[id],thresholds[id].max_error, thresholds[id].min_error);
                //new function that stops actuators?
+               //Control_SetMode(CONTROL_EMERGENCY, NULL)
        }
        else if( value > thresholds[id].max_warn || value < thresholds[id].min_warn)
        {
 -              Log(LOGWARN, "Sensor %s is above or below its warning value of %f or %f\n", g_sensor_names[id],thresholds[id].max_warn, thresholds[id].min_warn);       
 +              Log(LOGWARN, "Sensor %s at %f is above or below its warning value of %f or %f\n", value, g_sensor_names[id],thresholds[id].max_warn, thresholds[id].min_warn);  
        }
  }
  
@@@ -173,7 -180,7 +180,7 @@@ bool Sensor_Read(Sensor * s, DataPoint 
                        static bool set = false;
                        
                        GPIO_Set(GPIO0_30, true);
 -                      d->value = (double)ADC_Read(ADC0);      //ADC #0 on the Beaglebone
 +                      d->value = 0;//(double)ADC_Read(ADC0);  //ADC #0 on the Beaglebone
                        //Log(LOGDEBUG, "Got value %f from ADC0", d->value);
                        GPIO_Set(GPIO0_30, false);
                        set = !set;
@@@ -258,20 -265,12 +265,12 @@@ void * Sensor_Loop(void * arg
        // Until the sensor is stopped, record data points
        while (s->activated)
        {
-               if (s->record_data)
-               {
-                       DataPoint d;
-                       //Log(LOGDEBUG, "Sensor %d reads data [%f,%f]", s->id, d.time_stamp, d.value);
-                       if (Sensor_Read(s, &d)) // If new DataPoint is read:
-                       {
-                               //Log(LOGDEBUG, "Sensor %d saves data [%f,%f]", s->id, d.time_stamp, d.value);
-                               Data_Save(&(s->data_file), &d, 1); // Record it
-                       }
-               }
-               else
+               DataPoint d;
+               //Log(LOGDEBUG, "Sensor %d reads data [%f,%f]", s->id, d.time_stamp, d.value);
+               if (Sensor_Read(s, &d)) // If new DataPoint is read:
                {
-                       //Do something? wait?
-                       usleep(100000);
+                       //Log(LOGDEBUG, "Sensor %d saves data [%f,%f]", s->id, d.time_stamp, d.value);
+                       Data_Save(&(s->data_file), &d, 1); // Record it
                }
        }
        

UCC git Repository :: git.ucc.asn.au