Beispiel #1
0
/**
 * Liefert den Index des aktiven solltemp_line_t zurueck
 */
int8_t heizung_get_matching_zeitzone_index(device_data_heizung *p)
{
	uint8_t i;
	solltemp_line_t *solltemp_line = (solltemp_line_t *) 
		&(p->config.zeitzone0_id);

	for (i = 0; i < 8; i++)
	{
		const uint8_t tr_id = solltemp_line[i].id;
		if (zeitzone_matches(tr_id))
		{
			// we got an zeitzone which matches
			return i;
		}
	}
	return -1;
}
Beispiel #2
0
inline void zeitschaltuhr_timer_handler(device_data_zeitschaltuhr *p, uint8_t zyklus)
{
	if (zyklus != 1) return; // 1s-Zyklus verwendet

	uint8_t i,found;
	uint8_t* zeitzonen_ids;

	if(!p->automatikEin) return; // kein Automatikbetrieb
	
	zeitzonen_ids = &(p->config.zeitzone0_id);

	// Wenn State == 0, ueber alle Zeitzonen iterieren und, falls eine
	// passende gefunden wird, die Gruppe einschalten; im else Block
	// das Gegenteil: wenn keine gefunden wurde und State == 1, dann
	// ausschalten.
	
	if (p->state == 0)
	{
		for (i = 0; i < 8; i++)
		{
			// wenn eine Zeitzone beginnt

			if ((p->state == 0) && zeitzone_matches(zeitzonen_ids[i]))
			{
				// Beginn einer Zeitzone
				p->state = 1;
				sendMessage(p, HCAN_HES_POWER_GROUP_ON); // Power Gruppe einschalten
				return;
			}
		}
	}
	else 
	{
		// p->state == 1:
		
		found = 0;

		for (i = 0; i < 8; i++)
		{
			if ((p->state == 1) && zeitzone_matches(zeitzonen_ids[i]))
				found = 1;
		}

		if (found == 0)
		{
			// in der oberen Iteration ueber die Zeitzonen keine passende
			// Zeitzone gefunden; falls der Port an ist, diesen jetzt 
			// ausschalten:
			p->state = 0;
			sendMessage(p, HCAN_HES_POWER_GROUP_OFF);
			return;
		}
	}

	// die regelmaessigen Update-Infos versenden (Achtung: Mutlicast
	// ist trotzdem CONTROL !)
	
	if (p->update_counter == 0)
	{
		p->update_counter = ZEITSCHALTUHR_UPDATE_INTERVAL;

		if (p->state) 	sendMessage(p, HCAN_HES_POWER_GROUP_ON);
		else 		sendMessage(p, HCAN_HES_POWER_GROUP_OFF);
	}

	p->update_counter--;
}