Ejemplo n.º 1
0
//センサからデータを取得
void* SensorDataThread(void *param)
{
	sigset_t	ss;
	siginfo_t	sig;
	struct timespec timeOut;
	int sigNo;
	int oldOutputMode = MODE_CLOCK;
	unsigned int i;
	const unsigned int dpSleepTime = 100000;

	//log用
	time_t 		t;
	struct tm 	*ts;
	char		dateBuf[20];

	//シグナルのタイムアウト
	timeOut.tv_sec = g_dataInterval;
	timeOut.tv_nsec = 0;
	if( SetSignalBlock(&ss) == -1 )
		pthread_exit(NULL);

	//スレッドを高優先に
	SetPriority(HIGH_PRIO);

	do{
		if( sigNo == THREAD_MSG_EXIT )
		{
			MySysLog(LOG_DEBUG, "Data Thread exit signal\n");
			break;
		}
		//センサー間隔が1分以上はセンサー実行時アニメーションモードにする
		if( g_dataInterval >= 60 )
		{
			oldOutputMode	= g_outputMode;
			g_outputMode	= MODE_ANI_0;
		}

		//DPの桁

		//sensorが何かで止まるので個別にログを取ってどこで止まるか確認
		//log用の時間
		t  = time(NULL);
		ts = localtime(&t);
		//strftime(dateBuf, sizeof(dateBuf), "%F %T", ts);
		strftime(dateBuf, sizeof(dateBuf), "%T", ts);
		SensorLogPrintf(SENSOR_LOG_LEVEL_0, 	"%s\t",		dateBuf);		//時刻

		i = 0;
		//Lps331をone shotモードでたたき起こす
			//SetDP(i++, DP_ON);
			usleep(dpSleepTime);
			WakeUpLps331();

		//外気温
			//SetDP(i++, DP_ON);
			usleep(dpSleepTime);
			g_temp	= GetTemp();
			SensorLogPrintf(SENSOR_LOG_LEVEL_0, 	"%.1f\t", 	g_temp);		//外気温

		//気圧
			//SetDP(i++, DP_ON);
			usleep(dpSleepTime);
			g_press	= GetPress();

			SensorLogPrintf(SENSOR_LOG_LEVEL_0, 	"%.1f\t",	g_press);		//大気圧

		//照度
			//SetDP(i++, DP_ON);
			usleep(dpSleepTime);
			//g_lux   = GetLuxOhm(100e+3); //100kohm
			g_lux	= GetLux();
			Set7segLightControl(g_lux);
			if( g_lux < 1 )
				SensorLogPrintf(SENSOR_LOG_LEVEL_0, "%.4f\t", 	g_lux);			//照度
			else
				SensorLogPrintf(SENSOR_LOG_LEVEL_0, "%.1f\t", 	g_lux);			//照度

		//湿度
			g_hum	= GetHumidity();
			SensorLogPrintf(SENSOR_LOG_LEVEL_0, 	"%.1f\t",	g_hum);			//湿度


		//CPU温度
			g_coreTemp = GetCoreTemp();
			SensorLogPrintf(SENSOR_LOG_LEVEL_0, 	"%.1f\n",	g_coreTemp);	//CPU温度


		usleep(dpSleepTime);
		//for( i=0; i<SEG_COUNT; i++)
		//	SetDP(i, DP_OFF);
			//g_dispData[i] &= ~(SEG_DP);


		////正常にデータ取得後データの保存
		//SensorLog();


		//モードを元に戻す
		if( g_dataInterval >= 60 )
			g_outputMode = oldOutputMode;

		//残り時間用に現在の時間の取得
		clock_gettime(CLOCK_MONOTONIC, &g_waitLog);

		sigNo = sigtimedwait( &ss, &sig, &timeOut);
		//何らかの形でシグナルが来なかった時の保険
		if( g_threadStatus == 0 )
			break;
	}while( 1 );

	SetPriority(NOMAL_PRIO);

	g_threadStatus = 0;

	pthread_exit(NULL);
}
Ejemplo n.º 2
0
void Process()
{
	if (s_unProcessStep == STEP_NONE)
	{
		return;
	}

	//Test LED control
	if (s_unProcessStep & STEP_TEST_LED)
	{
		if (TestLED_Proc())
		{
			//finished.
			s_unProcessStep &= ~STEP_TEST_LED;
			TEST_LED_OFF;
		}
	}

	if (s_unProcessStep & STEP_REF_ON)
	{
		CheckVoltage();

		s_unProcessStep &= ~STEP_REF_ON;
	}

	if (s_unProcessStep & STEP_TEMPERATURE)
	{
		if (s_unRetry == 0)
		{
			//Timeout to get data, cacel
			s_unProcessStep &= ~STEP_TEMPERATURE;

			TestLED_MeasureFailed();
		}
		else
		{
			s_unRetry--;

			if (GetTemperature())
			{
				//next step is getting humidity.
				StartHumidity();
				s_unProcessStep &= ~STEP_TEMPERATURE;
				s_unProcessStep |= STEP_HUMIDITY;

				s_unRetry = 10;
			}
		}
	}

	if (s_unProcessStep & STEP_HUMIDITY)
	{
		if (s_unRetry == 0)
		{
			//Timeout to get data, cancel
			s_unProcessStep &= ~STEP_HUMIDITY;

			TestLED_MeasureFailed();
		}
		else
		{
			s_unRetry--;

			if (GetHumidity())
			{
				//finish SHT11 measure
				s_unProcessStep &= ~STEP_HUMIDITY;

				// 进行温度和湿度的换算,计算出正确的问题,以及相对湿度(暂时不在分机转换,因为1122分机是汇编写的,无法进行浮点运输。还是要到Center运输后,再通过串口送到主机)

				TestLED_MeasureSuccess();
			}
		}
	}

	if (s_unProcessStep & STEP_BMP085_TEMPERATURE)
	{
		s_unProcessStep &= ~STEP_BMP085_TEMPERATURE;

		// 读取温度,继续压力测量
		if (GetTemperature_BMP085())
		{
			StartPressure_BMP085();
			s_unProcessStep |= STEP_BMP085_PRESSURE;
		}
	}
	else if (s_unProcessStep & STEP_BMP085_PRESSURE)
	{
		s_unProcessStep &= ~STEP_BMP085_PRESSURE;

		// 读取压力值,换算温度和压力
		if (GetPressure_BMP085())
		{
			CalculateBMP085Data();
		}
	}
}