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; }
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; }
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); }
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); }
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); } }
/** * 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; }
/** * 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(); } }
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(); }
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(); }