Beispiel #1
0
// 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); }
}
Beispiel #5
0
/**
  * @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);
	}
}