Exemple #1
0
/** multitaster_timer_handler sendet eine Taster UP-/DOWN-Nachricht
 *  auf den CAN-Bus. Der multitaster_timer_handler wird alle 10msec aufgerufen. */ 
void multitaster_timer_handler(device_data_multitaster *p)
{
	canix_frame message;
	uint8_t time;

	// Wenn Taste gedrueckt ist, dann ist der Pin 0, ansonsten 1
	uint8_t status = ! tasterport_read(p->config.taster_port);

	// Message schon mal vorbereiten:
	message.src = canix_selfaddr();
	message.dst = HCAN_MULTICAST_CONTROL;
	message.proto = HCAN_PROTO_SFP;
	message.data[0] = HCAN_SRV_HES;
	// message.data[1] wird unten ausgefuellt
	message.data[2] = getGroup(p);
	// message.data[3] wird unten ausgefuellt
	message.size = 4;

	if (status) // gedrueckt
	{
		// Entprellschutz:
		if (p->pressed < 255)
			p->pressed++;
	}
	else
	{
		// Wenn Schalter-Down schon gesendet wurde,
		// dann ein Schalter-Up Event senden:
		if (p->pressed > 3)
		{
			//...und kein Rollladentaster im 2-Tasterbetrieb konfiguriert ist:
			if ( !(p->config.feature & ((1<<FEATURE_MULTITASTER_ROLLADEN_ZU) | (1<<FEATURE_MULTITASTER_ROLLADEN_AUF))) )
			{
				message.data[1] = HCAN_HES_TASTER_UP;
				message.data[3] = p->config.taster_port;
				canix_frame_send_with_prio(&message, HCAN_PRIO_HI);
			}
		}

		// Taste wurde losgelassen, also Zaehler zuruecksetzen
		p->pressed = 0;
	}

	if (p->config.feature & (1<<FEATURE_MULTITASTER_ENTPRELL_1S))
		time = 100;
	else
		time = 3;

	
	if (p->pressed == time) // mind. 30msec gedrueckt
	{
		if (p->config.feature & (1<<FEATURE_MULTITASTER_ROLLADEN_ZU))
		{
			message.data[1] = HCAN_HES_ROLLADEN_POSITION_SET;
			message.data[3] = 200; //gewuenschte Rollladenposition: Pos=200=0%=zu
		}
		else if (p->config.feature & (1<<FEATURE_MULTITASTER_ROLLADEN_AUF))
		{
			message.data[1] = HCAN_HES_ROLLADEN_POSITION_SET;
			message.data[3] = 201; //gewuenschte Rollladenposition: Pos=201=100%=auf
		}
		else //kein Rollladentaster im 2-Tasterbetrieb
		{
			message.data[1] = HCAN_HES_TASTER_DOWN;
			message.data[3] = p->config.taster_port;
		}
		
		canix_frame_send_with_prio(&message, HCAN_PRIO_HI);
	}
}
Exemple #2
0
inline void taster_timer_handler(device_data_taster *p, uint8_t zyklus)
{
    if (zyklus != 100) return; // 100tel-Sekunden-Zyklus verwendet

    canix_frame message;
    uint8_t time;

    // Wenn Taste gedrueckt ist, dann ist der Pin 0, ansonsten 1
    uint8_t status = ! tasterport_read(p->config.port);

    // Message schon mal vorbereiten:
    message.src = canix_selfaddr();
    message.dst = HCAN_MULTICAST_CONTROL;
    message.proto = HCAN_PROTO_SFP;
    message.data[0] = HCAN_SRV_HES;
    // message.data[1] wird unten ausgefuellt
    message.data[2] = p->config.gruppe;
    // message.data[3] wird unten ausgefuellt
    message.size = 4;

    if (status) // gedrueckt
    {
        // Entprellschutz:
        if (p->pressed < 255)
            p->pressed++;
    }
    else
    {
        // Wenn Schalter-Down schon gesendet wurde,
        // dann ein Schalter-Up Event senden:
        if (p->pressed > 3)
        {
            // ...und kein Flankenbetrieb konfiguriert ist:
            if (p->config.feature &
                    ((1<<FEATURE_TASTER_ROLLADEN_ZU)
                     | (1<<FEATURE_TASTER_ROLLADEN_AUF)) )
            {
                message.data[1] = HCAN_HES_ROLLADEN_POSITION_SET;
                message.data[3] = 222; // "Taster up" im Rolladen 2-Taster-Betrieb
                canix_frame_send_with_prio(&message, HCAN_PRIO_HI);
            }
            else if ( !(p->config.feature &
                        ((1<<FEATURE_TASTER_POWERPORT_AN)
                         | (1<<FEATURE_TASTER_POWERPORT_AUS)  )) )
            {
                message.data[1] = HCAN_HES_TASTER_UP;
                message.data[3] = p->config.port;
                canix_frame_send_with_prio(&message, HCAN_PRIO_HI);
            }
        }

        p->pressed = 0; // Taste wurde losgelassen, also Zaehler zuruecksetzen
    }

    if (p->config.feature & (1<<FEATURE_TASTER_ENTPRELL_1S))
        time = 100;
    else
        time = 3;

    if (p->pressed == time) // mind. 30msec gedrueckt
    {
        if (p->config.feature & (1<<FEATURE_TASTER_ROLLADEN_ZU))
        {
            message.data[1] = HCAN_HES_ROLLADEN_POSITION_SET;
            message.data[3] = 200; // gewuenschte Rollladenposition: Pos=200=0%=zu
        }
        else if (p->config.feature & (1<<FEATURE_TASTER_ROLLADEN_AUF))
        {
            message.data[1] = HCAN_HES_ROLLADEN_POSITION_SET;
            message.data[3] = 201; // gewuenschte Rollladenposition: Pos=201=100%=auf
        }
        else if (p->config.feature & (1<<FEATURE_TASTER_POWERPORT_AN))
        {
            message.data[1] = HCAN_HES_POWER_GROUP_ON;
            message.size = 3;
        }
        else if (p->config.feature & (1<<FEATURE_TASTER_POWERPORT_AUS))
        {
            message.data[1] = HCAN_HES_POWER_GROUP_OFF;
            message.size = 3;
        }
        else // kein z.B. Rollladentaster im 2-Tasterbetrieb
        {
            message.data[1] = HCAN_HES_TASTER_DOWN;
            message.data[3] = p->config.port;
        }

        canix_frame_send_with_prio(&message, HCAN_PRIO_HI);
    }
}