Пример #1
0
uint8_t get_heiz_details(uint8_t heiz_id, 
		uint8_t *mode,
		uint8_t *rate,
		int16_t *Tsoll,
		uint16_t *dauer,
		uint16_t *Tist)
{
	canix_frame message;

	heiz_details_heiz_id = heiz_id;
	heiz_details_Tsoll = 0;

	message.src = canix_selfaddr();
	message.dst = HCAN_MULTICAST_CONTROL;
	message.proto = HCAN_PROTO_SFP;
	message.data[0] = HCAN_SRV_HES;
	message.data[1] = HCAN_HES_HEIZUNG_DETAILS_REQUEST;
	message.data[2] = heiz_id;
	message.size = 3;
	canix_frame_send_with_prio(&message, HCAN_PRIO_HI);
	heiz_details_expected = 1; // Bit 0 = HCAN_HES_HEIZUNG_DETAILS_REQUEST

	// Auf die Anwort warten
	canix_sleep_100th(5);

	// ... und noch nach T(ist) fragen...
	message.data[1] = HCAN_HES_HEIZUNG_TIST_REQUEST;
	message.data[2] = heiz_id;
	message.size = 3;
	canix_frame_send_with_prio(&message, HCAN_PRIO_HI);
	heiz_details_expected = 2; // Bit 1 = HCAN_HES_HEIZUNG_TIST_REQUEST

	// Auf die Anwort warten
	canix_sleep_100th(5);

	if (heiz_details_expected == 0)
	{
		// aha, es ist eine Antwort eingetroffen...

		*mode = heiz_details_mode;
		*rate = heiz_details_rate;
		*Tsoll = heiz_details_Tsoll;
		*Tist = heiz_details_Tist;
		*dauer = heiz_details_dauer;
		heiz_details_heiz_id = 0;

		return 0;
	}

	// Timeout... keine Antwort erhalten :-(
	return 1;
}
Пример #2
0
uint8_t get_weck_details(uint8_t weck_id, uint16_t *dauer)
{
	canix_frame message;

	weck_details_weck_id = weck_id;

	message.src = canix_selfaddr();
	message.dst = HCAN_MULTICAST_CONTROL;
	message.proto = HCAN_PROTO_SFP;
	message.data[0] = HCAN_SRV_HES;
	message.data[1] = HCAN_HES_WECKER_DETAILS_REQUEST;
	message.data[2] = weck_id;
	message.size = 3;
	canix_frame_send_with_prio(&message, HCAN_PRIO_HI);
	weck_details_expected = 1; // Bit 0 = HCAN_HES_WECKER_DETAILS_REQUEST

	// Auf die Anwort warten
	canix_sleep_100th(5);

	if (weck_details_expected == 0)
	{
		// aha, es ist eine Antwort eingetroffen... (und zwar HCAN_HES_WECKER_DETAILS)

		*dauer = weck_details_dauer;
		weck_details_weck_id = 0;

		return 0;
	}

	// Timeout... keine Antwort erhalten :-(
	return 1;
}
Пример #3
0
void powerport_page_print_page(eds_powerport_page_block_t *p)
{
	char s[40];
	canix_frame message;

	// LCD Bildschirm loeschen
	lcd_clrscr();

	// 1. Zeile
	snprintf_P(s,sizeof(s), PSTR("%s"), p->line0); 
	lcd_gotoxy(0,0);
	lcd_puts(s);

	snprintf_P(s,sizeof(s), PSTR("%s"), p->line1); 
	lcd_gotoxy(0,1);
	lcd_puts(s);

	// In powerport_page_state wird spaeter der State gespeichert; sollte
	// keine Meldung eintreffen, so nuetzt es nichts, wenn der User OK
	// drueckt - man weiss ja den State nicht und kann ihn nicht aendern!
	// Das erkennt man am Wert -1
	powerport_page_state = -1;
	powerport_page_timer = -1;

	// nun den Status des Powerports erfragen und (asynchron)
	// in powerport_page_can_callback weitermachen

	message.src = canix_selfaddr();
	message.dst = HCAN_MULTICAST_CONTROL;
	message.proto = HCAN_PROTO_SFP;
	message.data[0] = HCAN_SRV_HES;
	message.data[1] = HCAN_HES_POWER_GROUP_STATE_QUERY;
	message.data[2] = p->gruppe;
	message.size = 3;
	canix_frame_send_with_prio(&message, HCAN_PRIO_HI);

	canix_sleep_100th(1);

	message.src = canix_selfaddr();
	message.dst = HCAN_MULTICAST_CONTROL;
	message.proto = HCAN_PROTO_SFP;
	message.data[0] = HCAN_SRV_HES;
	message.data[1] = HCAN_HES_POWER_GROUP_TIMER_QUERY;
	message.data[2] = p->gruppe;
	message.size = 3;
	canix_frame_send_with_prio(&message, HCAN_PRIO_HI);

}
Пример #4
0
void lcdctrl_blink(void)
{
	int j,i;

	for (j = 0; j < 3; j++)
	{
		for (i = 0; i < 10; i++)
		{
			OCR1A = i*10;
			OCR1B = 10;
			canix_sleep_100th(1);
		}
	}

	lcdctrl_set_display_light(LCD_MODE_ACTIVE);
}
Пример #5
0
void canix_syslog_P(uint8_t prio, const char *fmt, ...)
{
	if (canix_debug_level >= prio)
	{
		canix_frame message;
		uint8_t s_counter, payload_counter;
		char s[128];
		va_list ap;

		va_start(ap, fmt);
		vsnprintf_P(s, sizeof(s)-2, fmt, ap);
		va_end(ap);

		// An das Ende ein Retrun Zeichen anhaengen; somit kann die
		// empfangende Seite erkennen, wann die Meldung beendet ist.
		//
		// Hier benoetigen wir keinen Laengen-Check, da wir oben
		// sizeof(s)-2 verwendet haben.
		strcat(s,"\n");

		message.src = canix_selfaddr();
		message.dst = HCAN_MULTICAST_SYSLOG;
		message.proto = HCAN_PROTO_SYSLOG;

		s_counter = 0;

		message.data[0] = prio;
		payload_counter = 1;

		while (s_counter < strlen(s))
		{
			wdt_reset();

			while ((payload_counter < 8) && (s_counter < strlen(s)))
			{
				message.data[payload_counter++] = s[s_counter++];
			}

			message.size = payload_counter;
			payload_counter = 0;
			canix_frame_send(&message);
		}

		canix_sleep_100th(1);
	}
}
Пример #6
0
/**
 * Fragt alle konfigurierten Reedkontakte nach ihrem Status und sammelt
 * die Ergebnisse in fenster_monitor_reed_state; liefert die Anzahl der
 * offenen Reedkontakte zurueck
 */
uint8_t fenster_monitor_collect_reed_states(eds_fenster_monitor_page_block_t 
		*p)
{
	uint8_t i,n_reed_open;
	uint8_t *reeds = (uint8_t *)(&p->reed0);

	// Ergebnis-Array initialisieren:
	for (i = 0; i < 24; i++)
		fenster_monitor_reed_state[i] = 255;

	// ueber alle Reedkontakte iterieren:
	for (i = 0; i < 24; i++)
	{
		if (reeds[i] != 255) // ist es ein konfigurierter Reedkontakt?
		{
			// Nach Kontakt-Status fragen; die Ergebnisse kommen asynchron
			// ueber den CAN Handler rein
			canix_frame message;
			message.src = canix_selfaddr();
			message.dst = HCAN_MULTICAST_CONTROL;
			message.proto = HCAN_PROTO_SFP;
			message.data[0] = HCAN_SRV_HES;
			message.data[1] = HCAN_HES_REEDKONTAKT_STATE_QUERY;
			message.data[2] = reeds[i]; // die Reedkontakt-Gruppen-ID
			message.size = 3;
			canix_frame_send_with_prio(&message, HCAN_PRIO_LOW);

			canix_sleep_100th(10); // 100msec Pause
		}
		wdt_reset();
	}

	// Reedkontakte zaehlen:
	n_reed_open = 0;
	for (i = 0; i < 24; i++)
	{
		if ((fenster_monitor_reed_state[i]) && 
				(fenster_monitor_reed_state[i] != 255))
			n_reed_open++;
	}

	return n_reed_open;
}
Пример #7
0
/**
 * Fragt alle konfigurierten Reedkontakte nach ihrem Status und sammelt
 * die Ergebnisse in monitor_reedkontakt_state
 */
static void init_monitor_reedkontakt_request_states(void)
{
	eds_block_p it = eds_find_next_block((eds_block_p)0, EDS_userpanel_reedkontakte_BLOCK_ID);
	if (!it)
	{
		load_error_page(ERROR_CONF_REEDKONTAKTE_MISSING);
		reedkontakt_configured = 0;
		return;
	}

	userpanel_reedkontakte_t c;
	eeprom_read_block(&c, (it+2), sizeof(c));
	uint8_t i;

	// Ergebnis-Array initialisieren:
	for (i = 0; i < 24; i++)
		monitor_reedkontakt_state[i] = 255;

	// ueber alle Reedkontakte iterieren:
	for (i = 0; i < 24; i++)
	{
		if (c.reed[i] != 255) // ist es ein konfigurierter Reedkontakt?
		{
			// Nach Kontakt-Status fragen; die Ergebnisse kommen asynchron
			// ueber den CAN Handler rein
			canix_frame message;
			message.src = canix_selfaddr();
			message.dst = HCAN_MULTICAST_CONTROL;
			message.proto = HCAN_PROTO_SFP;
			message.data[0] = HCAN_SRV_HES;
			message.data[1] = HCAN_HES_REEDKONTAKT_STATE_QUERY;
			message.data[2] = c.reed[i]; // die Reedkontakt-Gruppen-ID
			message.size = 3;
			canix_frame_send_with_prio(&message, HCAN_PRIO_LOW);

			canix_sleep_100th(10); // 100msec Pause
		}
		wdt_reset();
	}
}
Пример #8
0
void taster_page_handle_key_down_event(eds_taster_page_block_t *p, 
		uint8_t key)
{
	if (key == KEY_OK)
	{
		canix_frame message;

		message.src = canix_selfaddr();
		message.dst = HCAN_MULTICAST_CONTROL;
		message.proto = HCAN_PROTO_SFP;
		message.data[0] = HCAN_SRV_HES;
		message.data[1] = HCAN_HES_TASTER_DOWN;
		message.data[2] = p->gruppe;
		message.size = 3;
		canix_frame_send_with_prio(&message, HCAN_PRIO_HI);

		canix_sleep_100th(1);
		
		message.data[1] = HCAN_HES_TASTER_UP;
		message.size = 3;
		canix_frame_send_with_prio(&message, HCAN_PRIO_HI);

		lcdctrl_blink();

		return;
	}

	if (key == KEY_ESC)
	{
		goto_page_up();
		return;
	}

	if (key == KEY_UP)
		goto_prev_page();

	if (key == KEY_DOWN)
		goto_next_page();
}
Пример #9
0
void powerport_page_handle_key_down_event(eds_powerport_page_block_t *p, 
		uint8_t key)
{
	if (key == KEY_OK)
	{
		if ((powerport_page_state == 1) && (powerport_page_timer > 0))
		{
			// Powerport ist eingeschaltet und der Timer laeuft; in diesem
			// Fall schaltet die OK Taste den Timer aus, laesst aber den
			// Powerport an
			//
			canix_frame message;

			message.src = canix_selfaddr();
			message.dst = HCAN_MULTICAST_CONTROL;
			message.proto = HCAN_PROTO_SFP;
			message.data[0] = HCAN_SRV_HES;
			message.data[1] = HCAN_HES_POWER_GROUP_SET_TIMER;
			message.data[2] = p->gruppe;
			message.data[3] = 0;
			message.data[4] = 0;
			message.size = 5;
			canix_frame_send_with_prio(&message, HCAN_PRIO_HI);

			lcdctrl_blink();
			canix_sleep_100th(5);
			powerport_page_print_page(p);

			return;

		}

		// Wenn der Powerport ein oder aus ist:
		if (powerport_page_state != -1)
		{
			canix_frame message;

			message.src = canix_selfaddr();
			message.dst = HCAN_MULTICAST_CONTROL;
			message.proto = HCAN_PROTO_SFP;
			message.data[0] = HCAN_SRV_HES;
			message.data[1] = powerport_page_state ? 
				HCAN_HES_POWER_GROUP_OFF : HCAN_HES_POWER_GROUP_ON;
			message.data[2] = p->gruppe;
			message.size = 3;
			canix_frame_send_with_prio(&message, HCAN_PRIO_HI);

			lcdctrl_blink();
			canix_sleep_100th(5);
			powerport_page_print_page(p);

			return;
		}
	}

	if (key == KEY_ESC)
	{
		goto_page_up();
		return;
	}

	if (key == KEY_UP)
		goto_prev_page();

	if (key == KEY_DOWN)
		goto_next_page();
}