// handler for pointer touch events bool AnsiWidget::pointerTouchEvent(MAEvent &event) { bool result = false; // hit test buttons on the front screen if (setActiveButton(event, _front)) { _focus = _front; } else { // hit test buttons on remaining screens for (int i = 0; i < MAX_SCREENS; i++) { if (_screens[i] != NULL && _screens[i] != _front) { if (setActiveButton(event, _screens[i])) { _focus = _screens[i]; break; } } } } // paint the pressed button if (_activeButton != NULL) { _activeButton->clicked(event.point.x, event.point.y, true); drawActiveButton(); } // setup vars for page scrolling if (_front->overlaps(event.point.x, event.point.y)) { _touchTime = maGetMilliSecondCount(); _xTouch = _xMove = event.point.x; _yTouch = _yMove = event.point.y; result = true; } return result; }
/** * @brief Draw_Menu * @param Menu pointer for draw * @retval None */ void Draw_Menu(Menu_Struct_TypeDef *Menu) { uint8_t i; /* если для меню нужно установить ограничение по отрисовке */ if(Menu->Clip == ENABLE) { /* устанавливаем ограничения для отрисовки */ Set_New_ClipObject(Menu->Coord[0], Menu->Coord[1], Menu->Coord[2], Menu->Coord[3], IN_OBJECT, Menu->ClipObjIndx); LCD_ClearArea(Menu->Coord[0] + 2, Menu->Coord[1] + 2, Menu->Coord[2] - 2, Menu->Coord[3] - 2, Active_BackColor); Update_Oscillogram(); /* обновлем осциллограммы, для того что бы они "обрезались" по размерам отсечения */ } /* If not (void*)0 */ if(Menu->MenuCallBack != (void*)0) Menu->MenuCallBack(DRAW); /* отрисовываем кнопки */ for(i = 0; i <= Menu->MaxButton; i++) { LCD_DrawButton(Menu->Buttons[i], NO_activeButton); } if(Menu == pMenu) // если отрисовываемое меню активно тогда отрисовываем активной стартовую кнопку { setActiveButton(Menu->Buttons[Menu->Indx]); LCD_DrawButton(btn, activeButton); } }
/******************************************************************************* * Function Name : Change_Menu_Indx * Description : Функция смены индекса меню * Input : None * Output : None * Return : None *******************************************************************************/ void Change_Menu_Indx(void) { /* Если были нажаты кнопки вверх или вниз то изменяем положения указателя меню */ if(ButtonsCode == pMenu->ChangeIndButton_UP)pMenu->Indx++; else if(ButtonsCode == pMenu->ChangeIndButton_DOWN)pMenu->Indx--; /* проверка и выход если нажата кнопка вниз на самом нижнем положении указателя */ if(pMenu->Indx == 255) pMenu->Indx = pMenu->MaxButton; else if(pMenu->Indx > pMenu->MaxButton) { pMenu->Indx = pMenu->StartButton; if(pMenu->MaxIndexState != M_SKIP) { if(pMenu->MaxIndexState == M_CLEAR) Clear_Menu(pMenu); else if(pMenu->MaxIndexState == M_NTH) { LCD_DrawButton(btn, NO_activeButton); } SetActiveMenu(&gInterfaceMenu); setActiveButton(pMenu->Buttons[pMenu->Indx]); LCD_DrawButton(btn, activeButton); return; } } /* Index is changed */ if(tmp_MenuIndex != pMenu->Indx) { if(ColorMn.State == DRAW) Clear_COLOR_Mn(); if(btn == &btnTIME_SCALE) Draw_btnTIME_SCALE(NO_activeButton); else LCD_DrawButton(btn, NO_activeButton); // перерисовываем текущую кнопку как неактивную setActiveButton(pMenu->Buttons[pMenu->Indx]); // сделать активной кнопку по индексу tmp_MenuIndex = pMenu->Indx; // сохраним текущий индекс } if(gOSC_MODE.BeepState != DISABLE) Beep_Start(); if(btn->btnEvent_func != (void*)0) { btn->btnEvent_func(); // вызвать соответсвующую функцию обработчик } if(btn == &btnTIME_SCALE) Draw_btnTIME_SCALE(activeButton); else LCD_DrawButton(btn, activeButton); // и перерисовать кнопку }
/******************************************************************************* * Function Name : ReDraw_Menu * Description : * Input : * Return : None *******************************************************************************/ void ReDraw_Menu(Menu_Struct_TypeDef *ReDrawMenu, btnINFO *ActiveButton) { uint8_t i; uint8_t MaxButtons = (ReDrawMenu == &gInterfaceMenu)? ReDrawMenu->MaxButton - 1 : ReDrawMenu->MaxButton; /* отрисовываем кнопки */ for(i = 0; i <= MaxButtons; i++) if(ReDrawMenu->Buttons[i] != ActiveButton) LCD_DrawButton(ReDrawMenu->Buttons[i], NO_activeButton); if(ActiveButton != (void*)0){ setActiveButton(ActiveButton); LCD_DrawButton(btn, activeButton); } }
/** * @brief LoadPreference * @param None * @retval None */ void LoadPreference(void) { uint16_t i, j = 0; uint8_t load_success = 0; char m_txt[50] = "param "; uint16_t m_color; Settings_Message("For skip load settings push 'DOWN'", Red); /* Init data massive */ for(i = 0; i < 800; i ++) { INFO_A.DATA[i] = INFO_B.DATA[i] = 0; INFO_A.visDATA[i] = INFO_B.visDATA[i] = 120; } delay_ms(1000); if(EPM570_Read_Keys() == DOWN) { Settings_Message("Load Preference SKIPED", White); delay_ms(1000); } else { /* Load all params */ for(i = 0; i < PARAM_NUM; i++) { load_success = Settings_LoadParam(SettingsParams[i]); memset(&m_txt[6], 0, 49 - 6); ConvertToString(i, &m_txt[6], 3); j = strlen(m_txt); if(load_success != 0) { strcat(&m_txt[j], " failed, erased"); m_color = Red; } else { strcat(&m_txt[j], " load"); m_color = LighGreen; } Settings_Message(m_txt, m_color); if(load_success != 0) delay_ms(200); } /* ------------------------------------- Update States, Modes, Texts and other ------------------------------------- */ /* вид интерполяции */ ActiveMode = (InterpolationMode_TypeDef*)InterpModes[Interpolate_AciveMode_Index]; // if(ActiveMode == &FFT_MODE) { gOSC_MODE.autoMeasurments = ON; mModeActive = (MeasMode_TypeDef*)&MeasurmentsMode[2]; } /* чтение значения времени автоотключения */ if( (AutoOff_Timer.Work_Minutes != 0) && (AutoOff_Timer.Work_Minutes != (int8_t)-1) ) { AutoOff_Timer.State = ENABLE; AutoOff_Timer.ResetTime = RTC_GetCounter(); sprintf (&AutoPowerOFF_btnTxt[10], "%d", AutoOff_Timer.Work_Minutes); AutoPowerOFF.Text = AutoPowerOFF_btnTxt; } /* Samples num points */ if(gOSC_MODE.oscNumPoints == 0) gOSC_MODE.oscNumPoints = 388; /* Update sync */ gInterfaceMenu.Buttons[4]->Text = (char*)&sweepMODE_text[gSyncState.Mode]; TrigMenu.Buttons[4]->Text = TriggShowInfo.triggType_Name[gSyncState.Type]; TrigMenu.Buttons[5]->Text = (char*)&Trigg_Sourse_Sync_Text[gSyncState.Sourse][0]; gSyncState.foops->SetTrigg_X(trigPosX_cursor.Position - leftLimit); gSyncState.foops->StateUpdate(); /* AC/DC inputs state */ setActiveButton(gInterfaceMenu.Buttons[8]); ON_OFF_Channels(&INFO_A, TRUE); setActiveButton(gInterfaceMenu.Buttons[9]); ON_OFF_Channels(&INFO_B, TRUE); /* Autodivider for analog inputs */ Set_AutoDivider_State(param_auto_div, ENABLE); /* PWM correction zero for analog inputs */ *(INFO_A.AD_Type.Analog.corrZ) = INFO_A.AD_Type.Analog.Zero_PWM_values[INFO_A.AD_Type.Analog.Div]; *(INFO_B.AD_Type.Analog.corrZ) = INFO_B.AD_Type.Analog.Zero_PWM_values[INFO_B.AD_Type.Analog.Div]; /* */ gInterfaceMenu.Buttons[1]->Text = Change_AnalogDivider(CHANNEL_A, INFO_A.AD_Type.Analog.Div); // btnVDIV_A gInterfaceMenu.Buttons[2]->Text = Change_AnalogDivider(CHANNEL_B, INFO_B.AD_Type.Analog.Div); // btnVDIV_B /* Interpolation */ changeInterpolation(ActiveMode); Interpolation.Text = (char*)ActiveMode->Text; /* Update sweep state, scale coeffs */ Sweep_UpdateState(); /* Update UI elements */ UI_LoadPreferenceUpdate(); /*Set LCD backlight*/ EPM570_Set_BackLight(gOSC_MODE.BackLight); } }