/** poti_init wird fuer alle konfigurierten Potis einmal aufgerufen. */ void poti_init(device_data_poti *p, eds_block_p it) { setADMUX(p->config.port); ADCSRA = (1<<ADPS1) | (1<<ADPS2); //set ADC prescaler to 3,686MHz / 64 = 57,6kHz p->lastPotiValue = getADCvalue(); p->potiTelegramCountdown = 0; //sende ein erstes Potitelegramm }
/** Der poti_timer_handler liest den ADC-Wert des * konfigurierten Potis und sendet diesen auf den CAN-Bus. */ inline void poti_timer_handler(device_data_poti *p, uint8_t zyklus) { if (zyklus != 10) return; // 10tel-Sekunden-Zyklus verwendet int16_t currentADCvalue; setADMUX(p->config.port); currentADCvalue = getADCvalue(); if (p->potiTelegramCountdown) { /* Abfrage, ob sich der ADC-Wert signifikant aenderte, * gegenueber dem Wert im letzten Potitelegramm (Filterung): */ if ( ( currentADCvalue > (p->lastPotiValue + POTI_VALUE_TOLERANCE) ) || ( currentADCvalue < (p->lastPotiValue - POTI_VALUE_TOLERANCE) ) ) { //sign. Potiwertaenderung gegenueber dem currentADCvalue p->potiTelegramCountdown--; } else { //Potiwert wieder der gleiche Wert (oder zumindest in etwa) p->potiTelegramCountdown = POTI_TELEGRAM_COUNTDOWN_INIT; } } else //p->potiTelegramCountdown == 0 { //Das Potitelegramm senden: p->lastPotiValue = currentADCvalue; //Angleich p->potiTelegramCountdown = POTI_TELEGRAM_COUNTDOWN_INIT; //sende das Potitelegramm: 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_POTI_POS_CHANGED; message.data[2] = p->config.gruppe; message.data[3] = (uint8_t)((currentADCvalue & 0xFF00) >> 8); //high value message.data[4] = (uint8_t)currentADCvalue; //low value message.size = 5; canix_frame_send_with_prio(&message, HCAN_PRIO_LOW); } }
/** Der helligkeitssensor_timer_handler wird alle 1 s aufgerufen: Er liest den ADC-Wert des * konfigurierten helligkeitssensors und sendet diesen auf den CAN-Bus. */ inline void helligkeitssensor_timer_handler(device_data_helligkeitssensor *p, uint8_t zyklus) { if (zyklus != 1) return; // 1s-Zyklus verwendet uint16_t currentADCaverage; if (p->secsUntilNextSend) { p->secsUntilNextSend--; // nur die letzten n Werte vorm Senden sind wichtig: if(p->secsUntilNextSend <= SIZE_OF_AVG) { setADMUX(p->config.port); addToFloatAvg(&(p->filterBrightness), getADCvalue_inverted()); } } else { currentADCaverage = getOutputValue(&(p->filterBrightness)); // sende das Helligkeitssensortelegramm: 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_HELLIGKEITS_INFO; //z.B. fuer rolladenAutomat-Device message.data[2] = p->config.gruppe; message.data[3] = (uint8_t)((currentADCaverage & 0xFF00) >> 8); //high value message.data[4] = (uint8_t)currentADCaverage; //low value message.size = 5; canix_frame_send_with_prio(&message, HCAN_PRIO_LOW); p->secsUntilNextSend = (uint16_t) 60 * p->config.sendCycleMins; } }