/******************************************************************* * * _DrawGraph */ static void _DrawGraph(void) { GUI_RECT Rect; int xSize; int ySize; int x; int y; WM_GetClientRect(&Rect); xSize = Rect.x1; ySize = Rect.y1; GUI_SetBkColor(GUI_BLACK); GUI_ClearRect(26, 1, 302, ySize - 21); GUI_SetColor(_ColorGrid); for (y = 20; y < (ySize - 21); y += 20) { int yPos = ySize - 20 - y; GUI_DrawHLine(yPos, 26, 302); } for (x = 40; x < (xSize - 25); x += 40) { int xPos = x + 25; GUI_DrawVLine(xPos, 1, ySize - 21); } GUI_SetColor(_ColorTemp1); GUI_DrawGraph(_aTemp1, GUI_COUNTOF(_aTemp1), 26, ySize - 121); GUI_SetColor(_ColorTemp2); GUI_DrawGraph(_aTemp2, GUI_COUNTOF(_aTemp2), 26, ySize - 121); }
/******************************************************************* * * _Draw Draws the graph area */ static void _Draw(void * p) { int i; PARAM * pParam = (PARAM *)p; GUI_SetBkColor(GUI_BLACK); GUI_SetColor(GUI_DARKGRAY); GUI_ClearRect(19, (LCD_YSIZE - 20) - YSIZE, (LCD_XSIZE - 2), (LCD_YSIZE - 21)); for (i = 0; i < (YSIZE / 2); i += 20) { GUI_DrawHLine((LCD_YSIZE - 20) - (YSIZE / 2) + i, 19, (LCD_XSIZE - 2)); if (i) { GUI_DrawHLine((LCD_YSIZE - 20) - (YSIZE / 2) - i, 19, (LCD_XSIZE - 2)); } } for (i = 40; i < (LCD_XSIZE - 20); i += 40) { GUI_DrawVLine(18 + i, (LCD_YSIZE - 20) - YSIZE, (LCD_YSIZE - 21)); } GUI_SetColor(COLOR_GRAPH0); GUI_DrawGraph(pParam->aY, (LCD_XSIZE - 20), 19, (LCD_YSIZE - 20) - YSIZE); }
static void _Draw(void * p) { int i; PARAM * pParam = (PARAM *)p; int lcd_xsize; int lcd_ysize; lcd_xsize = LCD_GetXSize(); lcd_ysize = LCD_GetYSize(); GUI_SetBkColor(GUI_BLACK); GUI_SetColor(GUI_DARKGRAY); GUI_ClearRect(19, (lcd_ysize - 20) - _YSize, (lcd_xsize - 2), (lcd_ysize - 21)); for (i = 0; i < (_YSize / 2); i += 20) { GUI_DrawHLine((lcd_ysize - 20) - (_YSize / 2) + i, 19, (lcd_xsize - 2)); if (i) { GUI_DrawHLine((lcd_ysize - 20) - (_YSize / 2) - i, 19, (lcd_xsize - 2)); } } for (i = 40; i < (lcd_xsize - 20); i += 40) { GUI_DrawVLine(18 + i, (lcd_ysize - 20) - _YSize, (lcd_ysize - 21)); } GUIDEMO_SetColor(COLOR_GRAPH0); GUI_DrawGraph(pParam->aY, (lcd_xsize - 20), 19, (lcd_ysize - 20) - _YSize); }
void TH_GUI (void const *argument) { static volatile uint16_t i=0; static uint16_t Triggered_Sample=0; osEvent evt; GUI_MEMDEV_Handle hMem0; GUI_SelectLayer(0); hMem0 = GUI_MEMDEV_Create(0,0,480,272); if(!GUI_CURSOR_GetState()) GUI_CURSOR_Select(&GUI_CursorCrossM); GUI_CURSOR_Show(); while (1) { Anal_CH1_Set(/*Main loop start*/); Anal_CH2_Set(/*Wait start*/); evt = osSignalWait(DMA_ConvCpltSig,(uint32_t)2); if( evt.status == osEventTimeout) Error_Handler(); Anal_CH2_Reset(/*Wait finish*/); //osSignalSet(tid_Touch,GUI_TouchStateReqSig); Anal_CH3_Set(/*Copy start*/); for(i=0;i<ADC_BUFFER_LENGTH;i++) // <- Temporary. Take the full advantage of DMA ! values_BUF[i]=255-values[i]; Anal_CH3_Reset(/*Copy finish*/); HAL_ADC_Start_DMA(&g_AdcHandle, values, ADC_BUFFER_LENGTH); osSignalClear(tid_TH_GUI, DMA_ConvCpltSig); Anal_CH4_Set(/*Wait start*/); osSignalWait(GUI_TouchGetSig,(uint32_t)0); GUI_CURSOR_SetPosition(g_Touched.pState->x,g_Touched.pState->y); Anal_CH4_Reset(/*Wait finish*/); Trigger_Point = g_Touched.MSG; Triggered_Sample = Trigger(Trigger_Point, values_BUF, ADC_BUFFER_LENGTH, 1348000UL); //if(Triggered_Sample >=20)Triggered_Sample -=20; // Offset to see the edge in the center <- bullshit ? GUI_MEMDEV_Select(hMem0); GUI_MEMDEV_Clear(hMem0); GUI_SetColor(GUI_DARKGRAY); GUI_FillRect(0,0,480,272); GUI_SetColor(GUI_BLACK); GUI_DrawRect(34,5,474,266); GUI_SetColor(GUI_WHITE); GUI_FillRect(35,6,475,266); Draw_GraphGrid(440,260,40,40); GUI_SetColor(GUI_BLUE); /*Draw garph start*/HAL_GPIO_TogglePin(GPIOI,GPIO_PIN_1); GUI_DrawGraph((short*)&values_BUF[Triggered_Sample],440,35,6); // Useful: GUI_COUNTOF(values) /*Draw garph finish*/HAL_GPIO_TogglePin(GPIOI,GPIO_PIN_1); GUI_SetColor(GUI_ORANGE); GUI_DrawHLine(Trigger_Point,0,480); GUI_FillCircle(15,Trigger_Point,10); GUI_SetColor(GUI_YELLOW); GUI_DrawCircle(15,Trigger_Point,10); GUI_MEMDEV_CopyToLCD(hMem0); Anal_CH1_Reset(/*Main loop finish*/); osThreadYield (); // suspend thread } }
/******************************************************************* * * _Draw2 */ static void _Draw2(void * p) { PARAM * pParam = (PARAM *)p; _Draw(p); GUI_SetColor(COLOR_GRAPH1); GUI_DrawGraph(pParam->aY+15, (LCD_XSIZE - 20), 19, (LCD_YSIZE - 20) - YSIZE); }
/******************************************************************* * * _DrawOrData */ static void _DrawOrData(GUI_COLOR Color, I16 * paY) { GUI_SetColor(Color); GUI_DrawGraph(paY, (LCD_XSIZE - 20), 19, (LCD_YSIZE - 20) - YSIZE); }
static void _Draw2(void * p) { PARAM * pParam = (PARAM *)p; _Draw(p); GUI_SetColor(COLOR_GRAPH1); GUI_DrawGraph(pParam->aY+15, (LCD_GetXSize() - 20), 19, (LCD_GetYSize() - 20) - _YSize); }
/* ********************************************************************************************************* * 函 数 名: DispCh1Wave * 功能说明: 显示通道1波形 * 形 参:无 * 返 回 值: 无 ********************************************************************************************************* */ void DispCh1Wave(void) { int16_t i,j = 0; /* 有符号数 */ uint16_t *px; uint16_t *py; int16_t iTemp; uint16_t VccMax,VccMin; uint16_t Average; for(i=0;i<1024;i++) { g_DSO.Ch1Buf[j++]=g_DSO.buffer[i]>>16; //ADC2 g_DSO.Ch1Buf[j++]=g_DSO.buffer[i] & 0xFFFF; //ADC1 } if (g_DSO.BufUsed == 0) { g_DSO.BufUsed = 1; } else { g_DSO.BufUsed = 0; } if (g_DSO.BufUsed == 0) { px = g_DSO.xCh1Buf1; py = g_DSO.yCh1Buf1; } else { px = g_DSO.xCh1Buf2; py = g_DSO.yCh1Buf2; } GUI_SetColor(GUI_MAGENTA); /* 下面的代码用于实现 最大值和最小值得差值 */ VccMax=g_DSO.Ch1Buf[0]; VccMin=g_DSO.Ch1Buf[0]; for(i=1;i<1024;i++) { if(VccMax<g_DSO.Ch1Buf[i])VccMax=g_DSO.Ch1Buf[i]; if(VccMin>g_DSO.Ch1Buf[i])VccMin=g_DSO.Ch1Buf[i]; } VccMax=VccMax-VccMin; GUI_GotoXY(323-55,104); GUI_DispFloatFix((VccMax* 1.406)/1050,5,2); /* CH1通道, 输入0V时,ADC采样值 = 1900 ,1024个点求到的平均值 */ /* 增益1:1的时候 1.406对应的AD值是2951 -1901 = 1050 */ for(i=1;i<21;i++) { Average +=g_DSO.Ch1Buf[i]; } Average = Average / 20; GUI_GotoXY(323-55,40); GUI_DispFloatFix(((Average-1900) * 1.406)/1050,5,2); GUI_DispDecAt(g_DSO.Ch1Buf[0], 323-55, 72, 4); /* 下面的代码用于实现波形的刷新 */ for (i = 0; i < 300; i++) { px[i] = 15 + i; iTemp = g_DSO.Ch1VOffset + (int16_t)((1900 - g_DSO.Ch1Buf[i + 1]) * 10)/g_DSO.Ch1Attenuation ; if (iTemp > 200) { iTemp = 200; } else if (iTemp < 0) { iTemp = 0; } py[i] = iTemp; } /* 下面的代码采取清除上帧波形,然后再重新描绘新波形,避免整屏刷新的闪烁感 */ /* 清除上帧波形 */ if (g_DSO.BufUsed == 0) { GUI_SetColor(GUI_BLUE); GUI_DrawGraph((signed short *)g_DSO.yCh1Buf2, 250, 14,20); } else { GUI_SetColor(GUI_BLUE); GUI_DrawGraph((signed short *)g_DSO.yCh1Buf1, 250, 14,20); } /* 显示更新的波形 */ GUI_SetColor(GUI_YELLOW); GUI_DrawGraph((I16 *)py, 250, 14,20); }