/********************************************************************* * * _AnimDrawCircle */ static void _AnimDrawCircle(GUI_ANIM_INFO * pInfo, void * pVoid) { ANIM_DATA * pData; static int xPosOld; _PrepareDrawing(pInfo, pVoid, &pData, xPosOld, 0); GUI_DrawCircle(pData->xPos, pData->yPos, pData->ObjectSize); xPosOld = pData->xPos; }
/********************************************************************* * * _DrawBkCircle */ static void _DrawBkCircle(int DrawLogo) { static GUI_MEMDEV_Handle hMemStretch; GUI_MEMDEV_Handle hMemGradient; GUI_MEMDEV_Handle hMemCircle; GUI_MEMDEV_Handle hMemOld; int CircleWidth; int ySizeV; int xSize; int ySize; int i; U32 * pData; xSize = LCD_GetXSize(); ySize = LCD_GetYSize(); ySizeV = LCD_GetVYSize(); if (ySizeV > ySize) { GUI_SetBkColor(BK_COLOR_1); GUI_ClearRect(0, 0, xSize, ySizeV); } if (hMemStretch == 0) { CircleWidth = (CIRCLE_RADIUS << 1) + 1; hMemCircle = GUI_MEMDEV_CreateFixed(0, 0, CircleWidth, CircleWidth, GUI_MEMDEV_NOTRANS, GUI_MEMDEV_APILIST_32, GUI_COLOR_CONV_8888); hMemStretch = GUI_MEMDEV_CreateEx (0, 0, xSize, ySize, GUI_MEMDEV_NOTRANS); hMemGradient = GUI_MEMDEV_CreateFixed(0, 0, 1, CIRCLE_RADIUS, GUI_MEMDEV_NOTRANS, GUI_MEMDEV_APILIST_32, GUI_COLOR_CONV_8888); // // Initialize background // hMemOld = GUI_MEMDEV_Select(hMemCircle); GUI_SetBkColor(BK_COLOR_1); GUI_Clear(); // // Create Gradient // GUI_MEMDEV_Select(hMemGradient); GUI_DrawGradientV(0, 0, 0, CIRCLE_RADIUS, BK_COLOR_0, BK_COLOR_1); // // Get color and draw circles // pData = (U32 *)GUI_MEMDEV_GetDataPtr(hMemGradient); GUI_MEMDEV_Select(hMemCircle); for (i = 0; i < CIRCLE_RADIUS; i++, pData++) { GUI_SetColor(*pData); GUI_DrawCircle(CIRCLE_RADIUS, CIRCLE_RADIUS, i); } // // Stretch and display // GUI_MEMDEV_Select(hMemStretch); GUI_MEMDEV_DrawPerspectiveX(hMemCircle, 0, 0, ySize, ySize, xSize, 0); GUI_MEMDEV_Delete(hMemCircle); GUI_MEMDEV_Delete(hMemGradient); GUI_MEMDEV_Select(hMemOld); } GUI_MEMDEV_Write(hMemStretch); if (DrawLogo) { GUI_DrawBitmap(&bmSTLogo70x35, LOGO_DIST_BORDER, LOGO_DIST_BORDER); } }
/********************************************************************* * * _cbFrameWin2 */ static void _cbFrameWin2(WM_MESSAGE* pMsg) { switch(pMsg->MsgId) { case WM_PAINT: GUI_SetBkColor(_aColors[_PaintCount2 % 6]); GUI_Clear(); GUI_SetColor(0x00FFC0); GUI_FillCircle(25, 25, 15); GUI_SetColor(GUI_BLACK); GUI_DrawCircle(25, 25, 15); _PaintCount2++; WM_InvalidateWindow(WM_HBKWIN); break; default: WM_DefaultProc(pMsg); } }
static void _cbDialog(WM_MESSAGE * pMsg) { WM_HWIN hItem; int Id, NCode; switch (pMsg->MsgId) { case WM_INIT_DIALOG: hItem = BUTTON_CreateEx(420, 0, 60, 60, pMsg->hWin, WM_CF_SHOW, 0, ID_BUTTON_EXIT); WM_SetCallback(hItem, _cbButton_exit); hItem = WM_GetDialogItem(pMsg->hWin, ID_VNC_CONNECTION); IMAGE_SetBitmap(hItem, &bmconnection_ko); hItem = BUTTON_CreateEx(315, 195, 40, 40, pMsg->hWin, WM_CF_SHOW, 0, START_VNC); WM_SetCallback(hItem, _cbButton_start); hItem = BUTTON_CreateEx(380, 195, 40, 40, pMsg->hWin, WM_CF_SHOW, 0, GO_BACKGROUND); WM_SetCallback(hItem, _cbButton_bg); hItem = BUTTON_CreateEx(245, 195, 40, 40, pMsg->hWin, WM_CF_SHOW, 0, ID_LOCK); WM_SetCallback(hItem, _cbButton_lock); hItem = WM_GetDialogItem(pMsg->hWin, GO_BACKGROUND); BUTTON_SetFont(hItem, &GUI_FontLubalGraph16B); break; case WM_PAINT: GUI_SetColor(GUI_STCOLOR_LIGHTBLUE); GUI_SetPenSize(5); GUI_DrawBitmap(&bmconnect, 7, 45); GUI_DrawCircle(332, 215, 40); GUI_AA_FillCircle(332, 215, 45); GUI_AA_FillRoundedRect(230, 182, 440, 250, 20); GUI_SetColor(GUI_WHITE); GUI_AA_FillCircle(332, 215, 42); GUI_SetBkColor(GUI_WHITE); GUI_AA_FillRoundedRect(233, 185, 437, 247, 20); GUI_SetColor(GUI_STCOLOR_LIGHTBLUE); GUI_AA_FillCircle(332, 215, 33); break; case WM_NOTIFY_PARENT: Id = WM_GetId(pMsg->hWinSrc); /* Id of widget */ NCode = pMsg->Data.v; /* Notification code */ switch(Id) { case START_VNC: /* Notifications sent by 'Start' */ switch(NCode) { case WM_NOTIFICATION_RELEASED: if((VNC_GetState() == VNC_IDLE)|| (VNC_GetState() == VNC_INIT)) { VNC_SERVER_LogMessage("Starting VNC connection..."); hItem = WM_GetDialogItem(pMsg->hWin, ID_VNC_CONNECTION); IMAGE_SetBitmap(hItem, &bmno_connection); VNC_SetState (VNC_INIT); WM_Exec(); VNC_SERVER_Start(); } else { VNC_SERVER_Stop(); } break; case WM_NOTIFICATION_CLICKED: hItem = WM_GetDialogItem(pMsg->hWin, START_VNC); WM_InvalidateWindow(hItem); WM_Update(hItem); break; } break; case GO_BACKGROUND: /* Notifications sent by 'Background' */ switch(NCode) { case WM_NOTIFICATION_RELEASED: WM_HideWindow(pMsg->hWin); module_prop[k_ModuleGetIndex(&vnc_server)].win_state = 1; ST_AnimatedIconView_SetItemText(hIcon,k_ModuleGetIndex(&vnc_server),"vnc server[B]"); ST_AnimatedIconView_SetDualTextColor(hIcon, ICONVIEW_CI_SEL, GUI_STCOLOR_LIGHTBLUE, GUI_STCOLOR_DARKBLUE ); break; } break; case ID_BUTTON_EXIT: switch(NCode) { case WM_NOTIFICATION_RELEASED: if(VNC_GetState() != VNC_IDLE) { VNC_SERVER_Stop(); } GUI_EndDialog(pMsg->hWin, 0); break; } break; case ID_LOCK: switch(NCode) { case WM_NOTIFICATION_RELEASED: if(VNC_GetState() == VNC_IDLE) { if(VNC_GetLockState()) { VNC_SetLockState(0); } else { VNC_SetLockState(1); } } break; } break; } break; default: WM_DefaultProc(pMsg); break; } }
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 } }
/******************************************************************************* * Function Name : main. * Description : Main routine. * Input : None. * Output : None. * Return : None. *******************************************************************************/ int main(void) { boolean_t Success = TRUE; /* ================================================================ */ /* Board Initializations and Configurations except OLED */ /* (clocks, I/Os, on-chip peripherals, on-board ICs) */ /* ================================================================ */ LBF_Board_Fixed_Inits(); LBF_Board_Selective_Inits(); // actions driven by User_Configuration.h Stm32_Led_ON(); /* ================================================================ */ /* Optional initialization of Middleware libraries : */ /* USBD drivers, FatFS File System, STemWin GUI */ /* ================================================================ */ // UNCOMMENT AS NEEDED: // (refer to INFO.txt for details on actions performed) /* ... To use La BlueFrog as USB Mass Storage (Full Speed) */ // Delay_ms(1000); // Success &= LBF_LaunchUSB_MassStorage(); /* ... To initialize FatFS */ /* and mount the Data Flash as FAT File System */ // Success &= LBF_FatFS_Init(); /* ... To initialize the STemWin Graphical Library */ /* Caution: reserves some RAM - keep some for stack/heap */ Success &= LBF_emWin_Init(); // ERROR HANDLER /* Replace by your own as wished */ Led_StopNBlinkOnFalse (Success); // stops here if one of above inits has failed Stm32_Led_OFF(); /* ===================================================== */ /* Application Code Below */ /* ===================================================== */ /* == User Declarations =============================== */ void Get_ZeroGauss_OffsetXY( int16_t* pMField_X_Raw_Offset, int16_t* pMField_Y_Raw_Offset ); void Get_Magnetic_FieldXY( int16_t MField_X_Raw_Offset, int16_t MField_Y_Raw_Offset, int16_t* pMField_X_mGauss, int16_t* pMField_Y_mGauss); uint8_t ReadValue; int16_t MField_X_Raw_Offset, MField_Y_Raw_Offset ; int16_t MField_X_mGauss, MField_Y_mGauss; int32_t MField_X_mGauss_2 =0, MField_Y_mGauss_2 =0; int32_t MField_X_mGauss_1 =0, MField_Y_mGauss_1 =0; int32_t MField_X_mGauss_Filtd, MField_Y_mGauss_Filtd; int32_t Field_Magnitude; int32_t X_Gfx_Vector, Y_Gfx_Vector; int32_t X_Previous_Gfx_Vector = 0, Y_Previous_Gfx_Vector=0; #define MGAUSS_MAX 450 //Max expected magnitude of magnetic field to display #define BKGND_COLOR 0x102020 // dark grey #define FOREGND_COLOR 0x00AAA0 // blue-green /* == Body ====================================================== */ OLED_Switch_ON(); // Provide power (13V) to OLED panel, enable display /* --- Check access to Magnetometer : ST LIS3MDL -------- */ ReadValue = I2C2_ReadSingleReg(LIS3MDL_CHIPID, LIS3MDL_WHOAMI); Led_StopNBlinkOnFalse ( ReadValue == LIS3MDL_WHOAMI_CONTENTS ); /* --- Configure Magnetometer -------------------------- */ // Define Full Scale: Reg. CTRL_REG2 @0x21 // NB- earth magnetic field magnitude = 0.25 to 0.65 Gauss I2C2_WriteSingleReg(LIS3MDL_CHIPID, 0x21, 0x00); // FS = 4 Gauss // Define XY Performance mode and ODR: Reg. CTRL_REG1 @0x20 I2C2_WriteSingleReg(LIS3MDL_CHIPID, 0x20, 0x90); // 0b10010000 // Enable T° sensor // Low-power mode on X and Y // ODR = 10Hz // Define Z Performance mode: Reg. CTRL_REG4 @0x23 I2C2_WriteSingleReg(LIS3MDL_CHIPID, 0x23, 0x00); // 0b00000000 // Calibrate to compensate Zero Gauss Offset Get_ZeroGauss_OffsetXY( &MField_X_Raw_Offset, &MField_Y_Raw_Offset ); /* --- Prepare Display of Results -------------------------- */ GUI_SetFont(&GUI_Font24B_ASCII); GUI_SetTextMode(GUI_TM_TRANS); GUI_SetColor(BKGND_COLOR); GUI_FillRect(0, 0, X_FULL_SCREEN-1, Y_FULL_SCREEN-1); GUI_SetColor(0xAAAA00); GUI_DrawCircle(Y_FULL_SCREEN/2, Y_FULL_SCREEN/2, (Y_FULL_SCREEN/2)-10); GUI_FillCircle(Y_FULL_SCREEN/2, Y_FULL_SCREEN/2, 2); /* --- Start Tracking Magnetic Field -------------------------- */ while(1) { // --- Capture :------------------------------------------------ // SINGLE SHOT conversion : CTRL_REG3 @0x22 : I2C2_WriteSingleReg(LIS3MDL_CHIPID, 0x22, 0x01); // 0b00000001 // Wait until data available from Magnetometer do { ReadValue = I2C2_ReadSingleReg(LIS3MDL_CHIPID, 0x27); // Status Reg } while ( (ReadValue & 0x08) != 0x08); // bit set when new XYZ data available // Read Results Get_Magnetic_FieldXY( MField_X_Raw_Offset, MField_Y_Raw_Offset, &MField_X_mGauss, &MField_Y_mGauss ); // --- Display North ------------------------------------------------ if (MField_X_mGauss > MGAUSS_MAX) MField_X_mGauss = MGAUSS_MAX; if (MField_X_mGauss < -MGAUSS_MAX) MField_X_mGauss = -MGAUSS_MAX; if (MField_Y_mGauss > MGAUSS_MAX) MField_Y_mGauss = MGAUSS_MAX; if (MField_Y_mGauss < -MGAUSS_MAX) MField_Y_mGauss = -MGAUSS_MAX; // Filtering to limit "jitter" effect on position MField_X_mGauss_Filtd = (MField_X_mGauss_2 + 2*MField_X_mGauss_1 + (int32_t)MField_X_mGauss) /4; MField_Y_mGauss_Filtd = (MField_Y_mGauss_2 + 2*MField_Y_mGauss_1 + (int32_t)MField_Y_mGauss) /4; MField_X_mGauss_2 = MField_X_mGauss_1; MField_X_mGauss_1 = (int32_t)MField_X_mGauss; MField_Y_mGauss_2 = MField_Y_mGauss_1; MField_Y_mGauss_1 = (int32_t)MField_Y_mGauss; Field_Magnitude = ( MField_X_mGauss_Filtd * MField_X_mGauss_Filtd) + ( MField_Y_mGauss_Filtd * MField_Y_mGauss_Filtd); X_Gfx_Vector = ( ( MField_X_mGauss_Filtd + MGAUSS_MAX) * (Y_FULL_SCREEN-1) ) / (2*MGAUSS_MAX) ; Y_Gfx_Vector = ( (-MField_Y_mGauss_Filtd + MGAUSS_MAX) * (Y_FULL_SCREEN-1) ) / (2*MGAUSS_MAX) ; // Only Y_FULL_SCREEN to avoid distorsion due to shape of screen // Compensate for size of letter "N" displayed as its x,y correspond to top left corner X_Gfx_Vector -= 6; Y_Gfx_Vector -= 12; // Skip Display if vector falls out of range if (Field_Magnitude < MGAUSS_MAX*MGAUSS_MAX ) { if ( (X_Gfx_Vector != X_Previous_Gfx_Vector) || (Y_Gfx_Vector != Y_Previous_Gfx_Vector) ) // Redraw only if needed { // Erase Previous GUI_SetColor( BKGND_COLOR ); GUI_DispStringAt("N", X_Previous_Gfx_Vector, Y_Previous_Gfx_Vector); // Draw New GUI_SetColor( FOREGND_COLOR ); GUI_DispStringAt("N", X_Gfx_Vector, Y_Gfx_Vector); X_Previous_Gfx_Vector = X_Gfx_Vector; Y_Previous_Gfx_Vector = Y_Gfx_Vector; } // end if } // end if Delay_ms(500); } // end while(1) }