Example #1
0
/**
 * Sets the sensor to the desired control mode. No checks are
 * done to see if setting to the desired mode will conflict with
 * the current mode - the caller must guarantee this itself.
 * @param s The sensor whose mode is to be changed
 * @param mode The mode to be changed to
 * @param arg An argument specific to the mode to be set. 
 *            e.g for CONTROL_START it represents the experiment name.
 */
void Sensor_SetMode(Sensor * s, ControlModes mode, void * arg)
{
	switch(mode)
	{
		case CONTROL_START:
			{
				// Set filename
				char filename[BUFSIZ];
				const char *experiment_path = (const char*) arg;
				int ret;

				ret = snprintf(filename, BUFSIZ, "%s/sensor_%d", experiment_path, s->id);

				if (ret >= BUFSIZ) 
				{
					Fatal("Experiment path \"%s\" too long (%d, limit %d)",
							experiment_path, ret, BUFSIZ);
				}

				Log(LOGDEBUG, "Sensor %d with DataFile \"%s\"", s->id, filename);
				// Open DataFile
				Data_Open(&(s->data_file), filename);
			}
		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));
				if (ret != 0)
				{
					Fatal("Failed to create Sensor_Loop for Sensor %d", s->id);
				}

				Log(LOGDEBUG, "Resuming sensor %d", s->id);
			}
		break;

		case CONTROL_EMERGENCY:
		case CONTROL_PAUSE:
			s->activated = 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
			Log(LOGDEBUG, "Stopped sensor %d", s->id);
		break;
		default:
			Fatal("Unknown control mode: %d", mode);
	}
}
Example #2
0
/**
 * Sets the actuator to the desired mode. No checks are
 * done to see if setting to the desired mode will conflict with
 * the current mode - the caller must guarantee this itself.
 * @param a The actuator whose mode is to be changed
 * @param mode The mode to be changed to
 * @param arg An argument specific to the mode to be set. 
 *            e.g for CONTROL_START it represents the experiment name.
 */
void Actuator_SetMode(Actuator * a, ControlModes mode, void *arg)
{
	switch (mode)
	{
		case CONTROL_START:
			{
				// Set filename
				char filename[BUFSIZ];
				const char *experiment_path = (const char*) arg;
				int ret;

				ret = snprintf(filename, BUFSIZ, "%s/actuator_%d", experiment_path, a->id);

				if (ret >= BUFSIZ) 
				{
					Fatal("Experiment path \"%s\" too long (%d, limit %d)",
							experiment_path, ret, 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->control_changed = false;

				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->activated = false;
			Actuator_SetControl(a, NULL);
			pthread_join(a->thread, NULL); // Wait for thread to exit

			Log(LOGDEBUG, "Paused actuator %d", a->id);
		break;

		break;
		case CONTROL_STOP:
			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);
	}
}