void PAGE_TelemtestEvent() { if (current_page == telemetry_off) return; struct Telemetry cur_telem = Telemetry; int current_row = GUI_ScrollableCurrentRow(&gui->scrollable); int visible_rows = GUI_ScrollableVisibleRows(&gui->scrollable); const struct telem_layout *ptr = TELEMETRY_Type() == TELEM_DEVO ? devo_page[current_page].layout : dsm_page[current_page].layout; for (long i = 0; ptr->source; ptr++, i++) { if ((ptr->row_type & 0x0f) < current_row) continue; if ((ptr->row_type & 0x0f) >= current_row + visible_rows) break; if (!( ptr->row_type & 0x80)) continue; long cur_val = _TELEMETRY_GetValue(&cur_telem, ptr->source); long last_val = _TELEMETRY_GetValue(&tp->telem, ptr->source); struct LabelDesc *font; font = &TELEM_FONT; if (cur_val != last_val) { GUI_Redraw(&gui->box[i]); } else if(! TELEMETRY_IsUpdated(ptr->source)) { font = &TELEM_ERR_FONT; } GUI_SetLabelDesc(&gui->box[i], font); } tp->telem = cur_telem; }
void PAGE_TelemtestEvent() { if (current_page == telemetry_off) return; static u32 count; int flicker = ((++count & 3) == 0); struct Telemetry cur_telem = Telemetry; int current_row = GUI_ScrollableCurrentRow(&gui->scrollable); int visible_rows = GUI_ScrollableVisibleRows(&gui->scrollable); const struct telem_layout *ptr = _get_telem_layout2()->layout; for (long i = 0; ptr->source; ptr++, i++) { if ((ptr->row_type & 0x0f) < current_row) continue; if ((ptr->row_type & 0x0f) >= current_row + visible_rows) break; if (!( ptr->row_type & 0x80)) continue; long cur_val = _TELEMETRY_GetValue(&cur_telem, ptr->source); long last_val = _TELEMETRY_GetValue(&tp->telem, ptr->source); struct LabelDesc *font; font = &TELEM_FONT; if((TELEMETRY_HasAlarm(ptr->source) && flicker) || ! TELEMETRY_IsUpdated(ptr->source)) { font = &TELEM_ERR_FONT; } else if (cur_val != last_val) { GUI_Redraw(&gui->box[i]); } GUI_SetLabelDesc(&gui->box[i], font); } tp->telem = cur_telem; }
void PAGE_MainEvent() { int i; if (PAGE_GetModal()) { #if HAS_TELEMETRY if(pagemem.modal_page == 2) { PAGE_TelemtestEvent(); } #endif return; } volatile s32 *raw = MIXER_GetInputs(); for(i = 0; i < NUM_ELEMS; i++) { if (! ELEM_USED(pc->elem[i])) break; if (! OBJ_IS_USED(&gui->elem[i])) continue; int src = pc->elem[i].src; int type = ELEM_TYPE(pc->elem[i]); switch(type) { case ELEM_VTRIM: case ELEM_HTRIM: { int value = *(MIXER_GetTrim(src-1)); if (mp->elem[i] != value) { mp->elem[i] = value; GUI_Redraw(&gui->elem[i].bar); } break; } case ELEM_SMALLBOX: case ELEM_BIGBOX: { s32 val = get_boxval(src); #if HAS_RTC if (src <= NUM_RTC) { if (mp->elem[i] != val) { mp->elem[i] = val; GUI_Redraw(&gui->elem[i].box); } } else #endif if (src - NUM_RTC <= NUM_TIMERS) { //Timer if ((val >= 0 && mp->elem[i] < 0) || (val < 0 && mp->elem[i] >= 0)) { GUI_SetLabelDesc(&gui->elem[i].box, get_box_font(type == ELEM_BIGBOX ? 0 : 2, val < 0)); mp->elem[i] = val; GUI_Redraw(&gui->elem[i].box); } else if (mp->elem[i] / 1000 != val /1000) { mp->elem[i] = val; GUI_Redraw(&gui->elem[i].box); } } else if (src - NUM_RTC - NUM_TIMERS <= NUM_TELEM) { //Telem int alarm = TELEMETRY_HasAlarm(src - NUM_RTC - NUM_TIMERS); if (alarm || ! TELEMETRY_IsUpdated(0xff)) { GUI_SetLabelDesc(&gui->elem[i].box, get_box_font(type == ELEM_BIGBOX ? 0 : 2, 1)); } else if(mp->elem[i] != val) { GUI_SetLabelDesc(&gui->elem[i].box, get_box_font(type == ELEM_BIGBOX ? 0 : 2, 0)); mp->elem[i] = val; GUI_Redraw(&gui->elem[i].box); } } else if (mp->elem[i] != val) { //Source mp->elem[i] = val; GUI_Redraw(&gui->elem[i].box); } break; } case ELEM_BAR: { s32 chan = MIXER_GetChannel(src-1, APPLY_SAFETY); if (mp->elem[i] != chan) { mp->elem[i] = chan; GUI_Redraw(&gui->elem[i].bar); } break; } case ELEM_TOGGLE: { src = MIXER_SRC(src); int idx = -1; if(src) { if (src > INP_HAS_CALIBRATION && src < INP_LAST) { //switch for (int j = 0; j < 3; j++) { // Assume switch 0/1/2 are in order if(ELEM_ICO(pc->elem[i], j) && raw[src+j] > 0) { idx = ELEM_ICO(pc->elem[i], j); break; } } } else { //Non switch int sw = raw[src] > 0 ? 1 : 0; if (ELEM_ICO(pc->elem[i], sw)) { idx = ELEM_ICO(pc->elem[i], sw); } } } if (idx != -1) { #ifdef HAS_CHAR_ICONS gui->elem[i].box.cb_data = (void *)(long)idx; #else struct ImageMap img; img = TGLICO_GetImage(idx); GUI_ChangeImage(&gui->elem[i].img, img.file, img.x_off, img.y_off); #endif GUI_SetHidden((guiObject_t *)&gui->elem[i], 0); } else { GUI_SetHidden((guiObject_t *)&gui->elem[i], 1); } } break; case ELEM_BATTERY: _check_voltage(&gui->elem[i].box); break; } } if(HAS_TOUCH) //FIXME: Hack to let 320x240 GUI continue to work _check_voltage(NULL); #if HAS_RTC if(Display.flags & SHOW_TIME) { u32 time = RTC_GetValue() / 60; if(mp->time != time) { mp->time = time; GUI_Redraw(&gui->time); } } #endif }
//#define DEBUG_TELEMALARM void TELEMETRY_Alarm() { //Update 'updated' state every time we get here u32 current_time = CLOCK_getms(); if (current_time - last_time > TELEM_ERROR_TIME) { last_time = current_time; for(int i = 0; i < TELEM_UPDATE_SIZE; i++) { last_updated[i] = Telemetry.updated[i]; Telemetry.updated[i] = 0; } } // don't need to check all the 6 telem-configs at one time, this is not a critical and urgent task // instead, check 1 of them at a time telem_idx = (telem_idx + 1) % TELEM_NUM_ALARMS; if(! Model.telem_alarm[telem_idx]) { alarm &= ~(1 << telem_idx); // clear this set return; } u8 idx = Model.telem_alarm[telem_idx]; s32 value = TELEMETRY_GetValue(idx); if (value == 0) { alarm &= ~(1 << telem_idx); // clear this set return; } if (! TELEMETRY_IsUpdated(0xff)) { // bug fix: do not alarm when no telem packet is received, it might caused by RX is powered off alarm &= ~(1 << telem_idx); // clear this set return; } if (Model.telem_flags & (1 << telem_idx)) { if (! (alarm & (1 << telem_idx)) && (value <= Model.telem_alarm_val[telem_idx])) { if (alarm_duration[telem_idx] == 0) { alarm_duration[telem_idx] = current_time; } else if (current_time - alarm_duration[telem_idx] > CHECK_DURATION) { alarm_duration[telem_idx] = 0; alarm |= 1 << telem_idx; #ifdef DEBUG_TELEMALARM printf("set: 0x%x\n\n", alarm); #endif } } else if ((alarm & (1 << telem_idx)) && (value > (s32)Model.telem_alarm_val[telem_idx])) { if (alarm_duration[telem_idx] == 0) { alarm_duration[telem_idx] = current_time; } else if (current_time - alarm_duration[telem_idx] > CHECK_DURATION) { alarm_duration[telem_idx] = 0; alarm &= ~(1 << telem_idx); #ifdef DEBUG_TELEMALARM printf("clear: 0x%x\n\n", alarm); #endif } } else alarm_duration[telem_idx] = 0; } else { if (! (alarm & (1 << telem_idx)) && (value >= Model.telem_alarm_val[telem_idx])) { if (alarm_duration[telem_idx] == 0) { alarm_duration[telem_idx] = current_time; } else if (current_time - alarm_duration[telem_idx] > CHECK_DURATION) { alarm_duration[telem_idx] = 0; alarm |= 1 << telem_idx; #ifdef DEBUG_TELEMALARM printf("set: 0x%x\n\n", alarm); #endif } } else if ((alarm & (1 << telem_idx)) && (value < (s32)Model.telem_alarm_val[telem_idx])) { if (alarm_duration[telem_idx] == 0) { alarm_duration[telem_idx] = current_time; } else if (current_time - alarm_duration[telem_idx] > CHECK_DURATION) { alarm_duration[telem_idx] = 0; alarm &= ~(1 << telem_idx); #ifdef DEBUG_TELEMALARM printf("clear: 0x%x\n\n", alarm); #endif } } else alarm_duration[telem_idx] = 0; } if ((alarm & (1 << telem_idx))) { if (current_time >= alarm_time + MUSIC_INTERVAL) { alarm_time = current_time; #ifdef DEBUG_TELEMALARM printf("beep: %d\n\n", telem_idx); #endif MUSIC_Play(MUSIC_TELEMALARM1 + telem_idx); } } }