int binaryLogLuminosity(const unsigned char sensorId, luminosity_t & data)
{
  init_data_struct(luminosity_bin_t, ARDUSAT_SENSOR_TYPE_LUMINOSITY)
  bin_data.luminosity = data.lux;

  return logBytes((unsigned char *) &bin_data, sizeof(luminosity_bin_t));
}
int binaryLogPressure(const unsigned char sensorId, pressure_t & data)
{
  init_data_struct(pressure_bin_t, ARDUSAT_SENSOR_TYPE_PRESSURE)
  bin_data.pressure = data.pressure;

  return logBytes((unsigned char *) &bin_data, sizeof(pressure_bin_t));
}
int binaryLogUVLight(const unsigned char sensorId, uvlight_t & data)
{
  init_data_struct(uv_light_bin_t, ARDUSAT_SENSOR_TYPE_UV)
  bin_data.uv = data.uvindex;

  return logBytes((unsigned char *) &bin_data, sizeof(uv_light_bin_t));
}
int binaryLogTemperature(const unsigned char sensorId, temperature_t & data)
{
  init_data_struct(temperature_bin_t, ARDUSAT_SENSOR_TYPE_TEMPERATURE)
  bin_data.temp = data.t;

  return logBytes((unsigned char *) &bin_data, sizeof(temperature_bin_t));
}
int binaryLogOrientation(const unsigned char sensorId, orientation_t & data)
{
  init_data_struct(orientation_bin_t, ARDUSAT_SENSOR_TYPE_ORIENTATION)
  bin_data.roll = data.roll;
  bin_data.pitch = data.pitch;
  bin_data.heading = data.heading;

  return logBytes((unsigned char *) &bin_data, sizeof(orientation_bin_t));
}
int binaryLogGyro(const unsigned char sensorId, gyro_t & data)
{
  init_data_struct(gyro_bin_t, ARDUSAT_SENSOR_TYPE_GYRO)
  bin_data.x = data.x;
  bin_data.y = data.y;
  bin_data.z = data.z;

  return logBytes((unsigned char *) &bin_data, sizeof(gyro_bin_t));
}
int binaryLogMagnetic(const unsigned char sensorId, magnetic_t & data)
{
  init_data_struct(magnetic_bin_t, ARDUSAT_SENSOR_TYPE_MAGNETIC)
  bin_data.x = data.x;
  bin_data.y = data.y;
  bin_data.z = data.z;

  return logBytes((unsigned char *) &bin_data, sizeof(magnetic_bin_t));
}
int binaryLogAcceleration(const unsigned char sensorId, acceleration_t & data)
{
  init_data_struct(acceleration_bin_t, ARDUSAT_SENSOR_TYPE_ACCELERATION)
  bin_data.x = data.x;
  bin_data.y = data.y;
  bin_data.z = data.z;

  return logBytes((unsigned char *) &bin_data, sizeof(acceleration_bin_t));
}
int main()
{
	/* Thread and corresponding parameter declaration */
	pthread_t regul_thread;
	pthread_t gui_thread;
	struct sched_param regul_sp = { 99 };
	struct sched_param gui_sp = { 1 };
	int policy = SCHED_RR;

	/* Creating thread arguments struct and its contents */
	thread_args_t *thread_args = (thread_args_t*) malloc(
			sizeof(thread_args_t));
	thread_args->regul = init_regul();
	thread_args->data = init_data_struct();
	thread_args->run = 1;

	/* Creating Threads*/
	if (pthread_create(&regul_thread, NULL, run_regul,
			(void*) thread_args)) {
		printf("Failed to create regulator thread.\n");
		exit(1);
	}

	if (pthread_create(&gui_thread, NULL, run_gui, (void*) thread_args)) {
		printf("Failed to create GUI thread.\n");
		exit(1);
	}

	/* Only works if superuser or privileged user */
	pthread_setschedparam(regul_thread, policy, &regul_sp);
	pthread_setschedparam(gui_thread, policy, &gui_sp);
	
	/* Wait for GUI thread to finish, which turns regulator off */
	pthread_join(gui_thread, NULL);
	/* Wait for regulator to finish last loop */
	pthread_join(regul_thread, NULL);

	/* Free structs*/
	free_regul(thread_args->regul);
	free_data_struct(thread_args->data);
	free(thread_args);

	return 0;
}