//センサからデータを取得 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); }
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(); } } }