/** * @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 : 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); } }
/******************************************************************************* * 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 : Processing_Analog_CH * Description : * Input : None * Return : None *******************************************************************************/ void Processing_Analog_CH(gChannel_MODE CH_Mode) { uint8_t tmp = NO_activeButton; /* If channel is STOP(OFF) return */ if(CH_Mode.EN == STOP) return; /* Set pointer pINFO to the appropriate channel ID, if it no sets before */ if(pINFO->Mode.ID != CH_Mode.ID) Set_CH_TypeINFO(CH_Mode.ID); NVIC_DisableIRQ(ADC1_2_IRQn); /* If global state is RUN */ if(gOSC_MODE.State == RUN) { if( !(INFO_A.Mode.EN == RUN && pINFO == &INFO_B) ) { if(EPM570_SRAM_Write() != COMPLETE) return; EPM570_SRAM_Read(); } /* Проверяем "зашкал" и переключаем делитель при необходимости */ if(Analog_AutodividerMain() == ENABLE) { Clear_OLD_DataCH_ON_SCREEN(pINFO->Mode.ID, leftLimit, rightLimit - 2); gInterfaceMenu.Buttons[pINFO->Mode.ID + 1]->Text = Change_AnalogDivider(pINFO->Mode.ID, pINFO->AD_Type.Analog.Div); if((pMenu == &gInterfaceMenu) && (pMenu->Indx == pINFO->Mode.ID + 1)) tmp = activeButton; LCD_DrawButton(gInterfaceMenu.Buttons[pINFO->Mode.ID + 1], tmp); } } if(HostMode == DISABLE) { /* Если коэффициент цифровой лупы больше 1, то репроцессинг данных */ if((*SweepScale) > 1) Data_Reprocessing(); /* вызов отрисовки соответсвующей интерполяции */ ActiveMode->InterpolationMODEfunc(0, rightLimit - leftLimit, (int16_t)pINFO->Position); /* автоизмерения */ if(gOSC_MODE.autoMeasurments == ON) mModeActive->MeasurmentsFunc(); else if(gShowFFTFreq == TRUE) Calc_Show_Freq(); } NVIC_EnableIRQ(ADC1_2_IRQn); }
void Input_Task(void *parg) { u8 err; u8 OK=0; u8 buffer[4]={0}; u8 LEN=0; u8 flag=0; u16 e=0; OS_CPU_SR cpu_sr; (void)parg; for(;;) { OSSemPend(PENIRQ,0,&err); Exti_Set(0); OS_ENTER_CRITICAL(); touch.FLAG=Read_XY_2(&touch.AD_X,&touch.AD_Y); OS_EXIT_CRITICAL(); if(touch.FLAG) { Led_On(1); touch.FLAG=0; touch.LCD_X=CalcXY(touch.AD_X,0); touch.LCD_Y=CalcXY(touch.AD_Y,1); touch.KEY=Get_Key(touch.PID,touch.LCD_X,touch.LCD_Y); if(touch.KEY<=10) { OS_ENTER_CRITICAL(); Set_Color(WHITE,BLACK); if(touch.KEY==10) Show_Char('.',cursor.x,cursor.y); else { Show_Dec(touch.KEY,1,cursor.x,cursor.y); if(LEN<4) { buffer[LEN]=touch.KEY; LEN++; } } if(cursor.x<224) { cursor.x+=8; if(cursor.x>=224) cursor.x=224; } OS_EXIT_CRITICAL(); } else if(touch.KEY==11) { OK++; if(OK==1) { VALUE1=CalcDec(buffer,LEN); Set_Color(BLACK,GREEN); Show_String(">>VALUE1:",2,22); Show_Dec(VALUE1,LEN,82,22); OS_ENTER_CRITICAL(); LCD_Clear(4,121,232,38,WHITE); cursor.x=8; cursor.y=132; OS_EXIT_CRITICAL(); buffer[0]=0; buffer[1]=0; buffer[2]=0; buffer[3]=0; LEN=0; } else if(OK==2) { VALUE2=CalcDec(buffer,LEN); Set_Color(BLACK,GREEN); Show_String(">>VALUE2:",2,38); Show_Dec(VALUE2,LEN,82,38); OS_ENTER_CRITICAL(); LCD_Clear(4,121,232,38,WHITE); cursor.x=8; cursor.y=132; OS_EXIT_CRITICAL(); buffer[0]=0; buffer[1]=0; buffer[2]=0; buffer[3]=0; LEN=0; } else if(OK==3) { VALUE3=CalcDec(buffer,LEN); Set_Color(BLACK,GREEN); Show_String(">>VALUE3:",2,54); Show_Dec(VALUE3,LEN,82,54); OS_ENTER_CRITICAL(); LCD_Clear(4,121,232,38,WHITE); cursor.x=8; cursor.y=132; OS_EXIT_CRITICAL(); buffer[0]=0; buffer[1]=0; buffer[2]=0; buffer[3]=0; LEN=0; } else if(OK==4) { if(VALUE2>0&&VALUE2<=5000) { if(VALUE1<VALUE2&&VALUE1>0) { if(VALUE3>0&&VALUE3<10000) { e=0; Set_Color(BLACK,GREEN); Show_String(">>OK!",2,70); } else { e=1; } } else { e=1; } } else { e=1; } if(e) { Set_Color(BLACK,GREEN); Show_String(">>ERROR!",2,70); } } else if(OK==5) { if(!e) { OK=0; OSTaskSuspend(CURSOR_TASK_PRIO); Show_Main(VALUE1,VALUE2,VALUE3,1); } else { OK=0; e=0; LCD_Clear(2,20,236,100,BLACK); LCD_DrawEdit(input); Set_Cursor(8,132); } VALUE1=0; VALUE2=0; VALUE3=0; } else; } else if(touch.KEY==12) { OS_ENTER_CRITICAL(); if(LEN>0) { LEN--; } if(cursor.x>=8) { LCD_Clear(cursor.x,cursor.y,8,16,WHITE); cursor.x-=8; if(cursor.x<8) { cursor.x=8; } } OS_EXIT_CRITICAL(); } else if(touch.KEY==13) { if(flag==0) { flag=1; button1.str="stop"; button1.len=4; button1.line_color=GREEN; LCD_DrawButton(button1); OSTaskResume(TIMER_TASK_PRIO); } else { flag=0; button1.str="start"; button1.len=5; button1.line_color=BLACK; LCD_DrawButton(button1); OSTaskSuspend(TIMER_TASK_PRIO); } } else if(touch.KEY==14) { OSTaskSuspend(TIMER_TASK_PRIO); Show_KeyMap(); OSTaskResume(CURSOR_TASK_PRIO); } else if(touch.KEY==99)//無效輸入 {} else; OSTimeDlyHMSM(0,0,0,50); Led_Off(1); } Exti_Set(1); } }