コード例 #1
0
ファイル: MSREG_universal.cpp プロジェクト: Klocman/MSREG
int main(void)
{
	// Enable watchdog (restart avr if program hangs for 2 seconds)
	wdt_enable(WDTO_2S);
	
	Buttons buttons;
	DHT22sensor sensor;
	
	//uart_init(UART_BAUD_SELECT(USART_BAUDRATE, F_CPU));
	extConnector.Init();
	
	// Initialize all connected devices
	//alarm.Init(OnAlarmStarted, OnAlarmEnded);
	alarm.ClearAllFlags();
	sevSegMenu.Init();
	ledIndicators.Init();
	buttons.Init();
	
	sensor.Init();
	sensorRefreshTimer.Init();
	sensorRefreshTimer.SetCounterTop(DHT22_REFRESHTIME);
	
	timerHum.Init();
	timerTemp.Init();
	
	speaker.InitSpeaker();
	speaker.PlayTone();
	
	//sensorResultAverageTemperature.Init();
	//sensorResultAverageHumidity.Init();
	
	MULTIPLEX_Setup();
	Timer_Setup();
	
	//ReadDefaultSettings(); done in readsettings if needed
	ReadSettings();
	
	triacTemp.InitPorts(&TRIAC_TEMP_PORT, &TRIAC_TEMP_DDR, TRIAC_TEMP_PIN, &regSettingsTemp.normallyClosed.variable);
	triacHum.InitPorts(&TRIAC_HUM_PORT, &TRIAC_HUM_DDR, TRIAC_HUM_PIN, &regSettingsHum.normallyClosed.variable);
	
	DHT22result sensorResult = {0,0};
	
	sei();
	//alarm.SetAlarmFlag(AlarmType_SOFTWARE_FAIL);
	//DHT22result tempResult = {0,0};
	while (1)
	{
		wdt_reset();
		uint8_t sendSensorDataOverUart = 0;
		
		if (!sensorRefreshTimer.IsRunning())
		{
			SensorResult sr = sensor.ReadSensor(&sensorResult);
			switch(sr)
			{
				case SensorOK:
				alarm.ClearAlarmFlag(AlarmType_SENSOR_FAILURE);
				bootCompleted = 1; // Enable regulation updates
				sendSensorDataOverUart = 1;
				sensorRefreshTimer.ResetCounter();
				//sensorAverage.ProcessValue(&sensorResult);
				break;
				
				default:
				alarm.SetAlarmFlag(AlarmType_SENSOR_FAILURE);
				
				sprintf_P(buffor, PSTR("E%u"), sr); // Newline gets added in SendAlarmInfo
				extConnector.uPuts(buffor); //uart_puts
				SendAlarmInfo();
				
				case SensorBusy:
				sensorRefreshTimer.AddTicks(20); // Reduce the error flood
				break;
			}
		}
		
		// If alarm is because of bad regulation, show normal menu instead of error code
		sevSegMenu.SetAlarm(alarm.GetActiveCriticalFlags());
		
		// Beep the speaker if buttons are pressed
		ButtonEvent currentButtonEvent = buttons.ProcessInputs();
		
		if (currentButtonEvent > BUTTON_MULTIPLE && currentButtonEvent < BUTTON_LEFT_RAPID )
		{
			speaker.PlayTone();
		}
		
		sevSegMenu.MainMenuUpdate(currentButtonEvent, &sensorResult);
		
		//////////////////////////////////////////////////////////////////////////
		// Regulation
		//_delay_ms(1);
		RegulationResult resTemp, resHum;
		
		resTemp = RegulationUpdate(AlarmType_TEMPERATURE_REGULATION, &sensorResult);
		resHum = RegulationUpdate(AlarmType_HUMIDITY_REGULATION, &sensorResult);
		
		//////////////////////////////////////////////////////////////////////////
		// Repaint LEDs
		sevSegMenu.TurnOnMenuLeds();
		
		if (alarm.GetActiveFlags())
		{
			ledIndicators.TurnOn(LED_Alarm);
		}
		
		if (triacTemp.GetState() || triacHum.GetState())
		{
			ledIndicators.TurnOn(LED_Praca);
		}
		ledIndicators.PushChanges();
		
		//////////////////////////////////////////////////////////////////////////
		// Update UART
		if (sendSensorDataOverUart)
		{
			//snprintf_P(buffor, UART_BUFFER_SIZE, PSTR("T%.3u.%u H%.3u.%u "),
			//extConnector.uPuts(buffor);
			
			//snprintf_P(buffor, UART_BUFFER_SIZE, PSTR("T%.3u.%u H%.3u.%u G%u N%u\r\n"),
			
			int8_t tempRemainder = sensorResult.temperature % 10;
			if (tempRemainder < 0)
			{
				tempRemainder *= -1;
			}
			
			sprintf_P(buffor, PSTR("T%i.%i H%u.%u G%u N%u"), // Newline at the end is added in SendAlarmInfo
				sensorResult.temperature / 10, tempRemainder,
				sensorResult.humidity / 10, sensorResult.humidity % 10,
				resTemp, resHum);
			extConnector.uPuts(buffor);
			SendAlarmInfo();
		}
		
		ProcessUartInput();
		
		if (saveSettingsQueued)
		{
			saveSettingsQueued = 0;
			SaveSettings();
		}
	}
}