Example #1
0
int main(void)
{
	uint8_t cmd;
	uint8_t dispMode = MODE_MAIN;

	static int8_t direction = PARAM_UP;

	hwInit();

	showTimeMasked();

	ds18x20Process();
	sensTimer = TEMP_MEASURE_TIME;

	while(1) {
		// Update sensors with SENSOR_POLL_INTERVAL period
		if (!sensTimer == 0) {
			sensTimer = SENSOR_POLL_INTERVAL;
			ds18x20Process();
			if (bmp180HaveSensor())
				bmp180Convert();
			dht22Read();
		}

		// Check alarm
		checkAlarm();

		// Update brightness only when not in brightness setup
		if (dispMode != MODE_BRIGHTNESS)
			calcBrightness();

		// Get command from buttons
		cmd = getBtnCmd();

		// Beep on button pressed
		if (cmd != BTN_STATE_0) {
			if (cmd < BTN_0_LONG)
				startBeeper(BEEP_SHORT);
			else
				startBeeper(BEEP_LONG);
		}

		// Stop scrolling on any button pressed
		if (cmd != BTN_STATE_0)
			matrixHwScroll(MATRIX_SCROLL_STOP);

		// Handle command
		switch (cmd) {
		case BTN_0:
			direction = PARAM_UP;
			switch (dispMode) {
			case MODE_EDIT_TIME:
				rtcNextEditParam();
				break;
			case MODE_EDIT_ALARM:
				alarmNextEditParam();
				break;
			}
			break;
		case BTN_1:
			direction = PARAM_UP;
		case BTN_2:
			if (cmd == BTN_2)
				direction = PARAM_DOWN;
			switch (dispMode) {
			case MODE_MAIN:
				startScroll(cmd - BTN_1);
				break;
			case MODE_EDIT_TIME:
				rtcChangeTime(direction);
				break;
			case MODE_EDIT_ALARM:
				alarmChange(direction);
				break;
			case MODE_BRIGHTNESS:
				changeBrightness(direction);
				break;
			case MODE_TEST:
				displayChangeRotate(direction);
				break;
			}
			break;
		case BTN_0_LONG:
			if (dispMode == MODE_MAIN) {
				dispMode = MODE_EDIT_TIME;
				rtcNextEditParam();
			} else {
				rtc.etm = RTC_NOEDIT;
				alarmSave();
				alarm.eam = ALARM_NOEDIT;
				dispMode = MODE_MAIN;
				showTimeMasked();
			}
			break;
		case BTN_1_LONG:
			if (dispMode == MODE_MAIN) {
				dispMode = MODE_EDIT_ALARM;
				alarmNextEditParam();
			}
			break;
		case BTN_2_LONG:
			if (dispMode == MODE_MAIN) {
				dispMode = MODE_BRIGHTNESS;
				showBrightness(direction, MASK_ALL);
			}
			break;
		case BTN_0_LONG | BTN_1_LONG:
			displaySwitchHourZero();
			dispMode = MODE_MAIN;
			showTimeMasked();
			break;
		case BTN_1_LONG | BTN_2_LONG:
			displaySwitchBigNum();
			dispMode = MODE_MAIN;
			showTimeMasked();
			break;
		case BTN_0_LONG | BTN_2_LONG:
			displaySwitchHourSignal();
			dispMode = MODE_MAIN;
			showTimeMasked();
			break;
		case BTN_0_LONG | BTN_1_LONG | BTN_2_LONG:
			dispMode = MODE_TEST;
			break;
		}

		// Show things
		switch (dispMode) {
		case MODE_MAIN:
			showMainScreen();
			break;
		case MODE_EDIT_TIME:
			showTimeEdit(direction);
			break;
		case MODE_EDIT_ALARM:
			showAlarmEdit(direction);
			break;
		case MODE_BRIGHTNESS:
			showBrightness(direction, MASK_NONE);
			break;
		case MODE_TEST:
			showTest();
			break;
		}
	}

	return 0;
}
Example #2
0
int main(void)
{
	int8_t encCnt = 0;
	uint8_t cmd = CMD_END;

	static uint8_t dispPrev = MODE_STANDBY;

	rcInit();
	sndInit();
	matrixInit();
	sei();

	_delay_ms(100);
	powerOff();

	while(1) {
		encCnt = getEncoder();
		cmd = getCmdBuf();

		/* If no command from buttons, try remote control */
		if (cmd == CMD_END)
			cmd = getRcBuf();

		/* Don't handle commands in standby mode except some */
		if (dispMode == MODE_STANDBY) {
			encCnt = 0;
			if (cmd != CMD_RC_STBY && cmd != CMD_BTN_1 && cmd != CMD_BTN_1_2_LONG)
				cmd = CMD_END;
		}
		/* Don't handle buttons in learn mode except some */
		if (dispMode == MODE_LEARN) {
			if (encCnt || cmd != CMD_END)
				displayTime = TIMEOUT_LEARN;
			if (cmd != CMD_BTN_1_LONG && cmd != CMD_BTN_3)
				cmd = CMD_END;
		}

		/* Handle command */
		switch (cmd) {
		case CMD_RC_STBY:
		case CMD_BTN_1:
			if (dispMode == MODE_STANDBY)
				powerOn();
			else
				powerOff();
			break;
		case CMD_RC_MUTE:
		case CMD_BTN_2:
			if (dispMode == MODE_TIME_EDIT) {
				rtcNextEditParam();
				displayTime = TIMEOUT_TIME_EDIT;
			} else {
				if (aproc.mute) {
					sndSetMute(0);
					dispMode = MODE_SND_VOLUME;
				} else {
					sndSetMute(1);
					dispMode = MODE_MUTE;
				}
				displayTime = TIMEOUT_AUDIO;
			}
			break;
		case CMD_RC_MENU:
		case CMD_BTN_3:
			if (dispMode == MODE_LEARN) {
				nextRcCmd();
			} else {
				sndNextParam(&dispMode);
				displayTime = TIMEOUT_AUDIO;
			}
			break;
		case CMD_RC_RED:
		case CMD_RC_GREEN:
		case CMD_RC_YELLOW:
		case CMD_RC_BLUE:
			sndSetInput(cmd - CMD_RC_RED);
			dispMode = MODE_SND_GAIN0 + (cmd - CMD_RC_RED);
			displayTime = TIMEOUT_AUDIO;
			break;
		case CMD_BTN_1_LONG:
			switch (dispMode) {
			case MODE_STANDBY:
			case MODE_LEARN:
				powerOff();
				break;
			default:
				dispMode = MODE_BRIGHTNESS;
				displayTime = TIMEOUT_BR;
				break;
			}
			break;
		case CMD_BTN_2_LONG:
			switch (dispMode) {
			case MODE_TIME_EDIT:
				dispMode = MODE_TIME;
				rtc.etm = RTC_NOEDIT;
				break;
			default:
				dispMode = MODE_TIME_EDIT;
				rtc.etm = RTC_HOUR;
				displayTime = TIMEOUT_TIME_EDIT;
				break;
			}
			break;
		case CMD_RC_NEXT:
		case CMD_BTN_3_LONG:
			if (dispMode >= MODE_SND_GAIN0 && dispMode < MODE_SND_END)
				aproc.input++;
			sndSetInput(aproc.input);
			dispMode = MODE_SND_GAIN0 + aproc.input;
			displayTime = TIMEOUT_AUDIO;
			break;
		case CMD_BTN_1_2_LONG:
			if (dispMode == MODE_STANDBY)
				dispMode = MODE_LEARN;
			switchTestMode(CMD_RC_STBY);
			displayTime = TIMEOUT_LEARN;
			break;
		}

		/* Emulate RC VOL_UP/VOL_DOWN as encoder actions */
		if (cmd == CMD_RC_VOL_UP)
			encCnt++;
		if (cmd == CMD_RC_VOL_DOWN)
			encCnt--;

		/* Handle encoder */
		if (encCnt) {
			switch (dispMode) {
			case MODE_STANDBY:
			case MODE_LEARN:
				break;
			case MODE_TIME_EDIT:
				displayTime = TIMEOUT_TIME_EDIT;
				rtcChangeTime(encCnt);
				break;
			case MODE_BRIGHTNESS:
				changeBrWork(encCnt);
				displayTime = TIMEOUT_BR;
				break;
			case MODE_MUTE:
			case MODE_LOUDNESS:
			case MODE_TIME:
				dispMode = MODE_SND_VOLUME;
			default:
				sndSetMute(0);
				sndChangeParam(dispMode, encCnt);
				displayTime = TIMEOUT_AUDIO;
				break;
			}
		}

		/* Exid to default mode if timer expired */
		if (displayTime == 0) {
			if (dispMode == MODE_LEARN || dispMode == MODE_STANDBY) {
				dispMode = MODE_STANDBY;
			} else {
				rtc.etm = RTC_NOEDIT;
				if (aproc.mute)
					dispMode = MODE_MUTE;
				else
					dispMode = MODE_TIME;
			}
		}

		/* Show things */
		switch (dispMode) {
		case MODE_STANDBY:
			showStby();
			break;
		case MODE_MUTE:
			showMute();
			break;
		case MODE_LOUDNESS:
			showLoudness();
			break;
		case MODE_LEARN:
			showLearn();
			break;
		case MODE_TIME:
		case MODE_TIME_EDIT:
			showTime();
			break;
		case MODE_BRIGHTNESS:
			showBrWork();
			break;
		default:
			showSndParam(dispMode, ICON_NATIVE);
			break;
		}

		if (dispMode == dispPrev)
			updateScreen(EFFECT_NONE, dispMode);
		else
			updateScreen(EFFECT_SPLASH, dispMode);

		dispPrev = dispMode;
	}

	return 0;
}