#include "control.h" /* Anlegen eines neuen Bedienelements */ /* Funktion zum Hinzufuegen eines Bedienelements zur Liste der Bedienelemente * @param usercontrol *st_control_list : Liste mit bereits definierten Bedienelements * @param volatile unsigned char uc_port_trigger : Port an dem der Taster angeschlossen ist * @param unsigned char uc_pin_trigger : Pin an dem der Taster angeschlossen ist * @param volatile unsigned char uc_port_led : Port an dem die LED angeschlossen ist * @param unsigned char uc_pin_led : Pin an dem die LED angeschlossen ist * @param volatile unsigned char uc_port_power : Port an dem der Schaltausgang angeschlossen ist * @param unsigned char uc_pin_power : Pin an dem der Schaltausgang angeschlossesn ist * @return usercontrol * : neue Liste mit Usercontrol-Elementen sonst alte * Liste mit Usercontrol-Elementen */ usercontrol *newUserControl(usercontrol *st_control_list, volatile unsigned char *uc_port_trigger, unsigned char uc_pin_trigger, volatile unsigned char *uc_port_led, unsigned char uc_pin_led, volatile unsigned char *uc_port_power, unsigned char uc_pin_power) { /* Arbeitspointer auf den Anker der Liste mit Bedienelementen */ usercontrol *st_insert; /* neues Bedienelement erzeugen */ usercontrol *st_control_ptr = malloc(sizeof(usercontrol)); /* Pruefen ob genug Speicher fuer die Struktur vorhanden war */ if (st_control_ptr == NULL) { /* Fehler, alte Liste zurueckgeben */ return st_insert; } /* Port fuer Taster setzen */ st_control_ptr->uc_port_trigger = uc_port_trigger; /* Pin fuer Taster setzen */ st_control_ptr->uc_pin_trigger = uc_pin_trigger; /* Port fuer LED setzen */ st_control_ptr->uc_port_led = uc_port_led; /* Pin fuer LED setzen */ st_control_ptr->uc_pin_led = uc_pin_led; /* Port fuer Schaltausgang setzen */ st_control_ptr->uc_port_power = uc_port_power; /* Pin fuer Schaltausgang setzen */ st_control_ptr->uc_pin_power = uc_pin_power; /* Bedienelement ist ausgeschaltet -> als naechstes kann eingeschaltet werden */ st_control_ptr->fcn = turnOnUserControl; /* Es existiert noch kein weiteres Bedienelement */ st_control_ptr->st_next = NULL; st_insert = st_control_list; /* Wenn es noch kein Bedienelement in der Liste gibt */ if (st_insert == NULL) { /* Dieses Bedienelement ist der Anfang der Liste */ st_control_list = st_control_ptr; } else { /* Das Ende der Liste suchen */ while (st_insert->st_next != NULL) { /* Wenn es noch ein naechstes Bedienelement gibt, dann zu diesem Bedienelement gehen */ st_insert = st_insert->st_next; } /* Verweis auf dieses Bedienelement */ st_insert->st_next = st_control_ptr; } /* Neue Liste mit Bedienelement zurueckgeben */ return st_control_list; } /* Funktion zum Abfragen aller Bedienelmente * @param usercontrol *st_control_list : Liste mit Bedienelementen */ void queryUserControls(usercontrol *st_control_list) { /* Arbeitspointer auf Liste mit Bedienelementen */ usercontrol *st_query = st_control_list; while (st_query != NULL) { /* Wenn Schalter gedrueckt */ if ((*st_query->uc_port_power) & (1 << st_query->uc_pin_trigger)) { /* Funktion zum Schalten des Bedienelements aufrufen */ st_query->fcn(st_query); } /* Zum naechten Bedienelement gehen */ st_query = st_query->st_next; } } /* Funktion zum Einschalten eines Schaltausgangs * @param usercontrol *st_control : Bedienelement, welches eingeschaltet werden soll */ void turnOnUserControl(usercontrol *st_control) { /* LED einschalten */ (*st_control->uc_port_led) |= (1 << st_control->uc_pin_led); /* SSR einschalten */ (*st_control->uc_port_power) |= (1 << st_control->uc_pin_power); /* Bedienelement ist eingeschaltet -> als naechstes kann ausgeschaltet werden */ st_control->fcn = turnOffUserControl; } /* Funktion zum Ausschalten eines Schaltausgangs * @param usercontrol *st_control : Bedienelement, welches ausgeschaltet werden soll */ void turnOffUserControl(usercontrol *st_control) { /* LED ausschalten */ (*st_control->uc_port_led) &= ~(1 << st_control->uc_pin_led); /* SSR ausschalten */ (*st_control->uc_port_power) &= ~(1 << st_control->uc_pin_power); /* Bedienelement ist ausgeschaltet -> als naechstes kann eingeschaltet werden */ st_control->fcn = turnOnUserControl; }