본문 바로가기

[STM32F746G-DISCO] STemWin 사용하기 (Graph widget)

by rudals.kim 2024. 7. 14. 댓글 개
반응형
아래 테스트는 STM32CubeIDE 1.6.1/STM32Cube_FW_F7_V1.16.1를 사용하여 테스트 되었습니다.


이전 게시글에서 ADC1_IN18을 사용하여 칩 내부의 온도센서를 사용해 보았습니다.

2024.07.06 - [Hardware/STM32] - [STM32F746G-DISCO] 칩 내부 온도센서 사용하기


STemWin의 Graph widget을 사용하여 이 데이터를 디스플레이해 보겠습니다.
시뮬레이터에서는 온도 값을 읽어오지 못하므로 랜덤 값으로 시뮬레이션을 해 보았습니다.
구성은 GUIBuilder에서 WINDOW/GRAPH/TEXT 3개의 위젯으로 구성된 간단한 화면입니다.
온도 데이터가 업데이트시 우상단에 현재 측정된 온도 값을 표시하도록 하였습니다.

프로젝트의 메인 함수입니다.

static void _cbDialog(WM_MESSAGE * pMsg) {
  WM_HWIN      hItem;
  // USER START (Optionally insert additional variables)
  static GRAPH_SCALE_Handle hScale;
  // USER END

  switch (pMsg->MsgId) {
  case WM_INIT_DIALOG:
    //
    // Initialization of 'Graph'
    //
    hItem = WM_GetDialogItem(pMsg->hWin, ID_GRAPH_0);
    GRAPH_SetBorder(hItem, 60, 5, 5, 5);

    hGraphData = GRAPH_DATA_YT_Create(GUI_RED, 400, NULL, 0);
    GRAPH_AttachData(hItem, hGraphData);

    hScale = GRAPH_SCALE_Create(55, GUI_TA_RIGHT, GRAPH_SCALE_CF_VERTICAL, 10);    
    GRAPH_SCALE_SetTextColor(hScale, GUI_BLACK);
    GRAPH_SCALE_SetFactor(hScale, 1.0/scale_factor);
    GRAPH_SCALE_SetFont(hScale, &GUI_Font16_ASCII);
    GRAPH_SCALE_SetTickDist(hScale, 50);
    GRAPH_AttachScale(hItem, hScale);

    GRAPH_SetGridVis(hItem, 1);
    GRAPH_SetLineStyleH(hItem, GUI_LS_DOT);
    GRAPH_SetLineStyleV(hItem, GUI_LS_DOT);

    GRAPH_SetUserDraw(hItem, _UserDraw);

    WM_SetCallback(hItem, _cbGraph);

    //
    // Initialization of 'STM32F746G-Disovery ADC1 Temperature'
    //
    hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_0);
    TEXT_SetFont(hItem, GUI_FONT_24B_ASCII);
    TEXT_SetTextColor(hItem, GUI_MAKE_COLOR(0x00FF0000));
    TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);

    // USER START (Optionally insert additional code for further widget initialization)
    // USER END
    break;
    // USER START (Optionally insert additional message handling)

    // USER END
  default:
    WM_DefaultProc(pMsg);
    break;
  }
}


MainTask에서 ADC1_IN18으로 읽어들인 온도 데이터는 아래 함수를 사용하여 업데이트됩니다.

GRAPH_DATA_YT_AddValue(hData, (int)adc1_temp*(int)scale_factor);


Graph widget의 업데이트는 _UserDraw callback 함수를 등록하여 업데이트되도록 하였습니다.

static void _UserDraw(WM_HWIN hWin, int Stage) {
  if (Stage == GRAPH_DRAW_LAST) {
    char acText[] = "Temperature(C)";
    char szbuf[10];
    GUI_RECT Rect;
    GUI_RECT RectInvalid;
    int      FontSizeY;

    GUI_SetFont(&GUI_Font16B_ASCII);
    FontSizeY = GUI_GetFontSizeY();
    WM_GetInsideRect(&Rect);
    WM_GetInvalidRect(hWin, &RectInvalid);

    Rect.x0 = 7;
    Rect.x1 = Rect.x0 + FontSizeY;

    GUI_SetColor(GUI_RED);
    GUI_DispStringInRectEx(acText, &Rect, GUI_TA_HCENTER, strlen(acText), GUI_ROTATE_CCW);

    sprintf(szbuf, "%5.1f ('C)", adc1_temp);

    GUI_SetFont(&GUI_Font24_ASCII);
    FontSizeY = GUI_GetFontSizeY();
    WM_GetInsideRect(&Rect);
    WM_GetInvalidRect(hWin, &RectInvalid);

    Rect.x0 = Rect.x1 - 130;
    Rect.y0 = Rect.y0 + 15;
    Rect.x1 = Rect.x0 + 100;

    GUI_SetColor(GUI_YELLOW);
    GUI_DispStringInRectEx(szbuf, &Rect, GUI_TA_RIGHT, strlen(szbuf), GUI_ROTATE_0);
  }
}


자세한 내용은 emWin - User & Reference Guide 문서를 참고하였습니다.

아래는 동작영상입니다. (GIF로 변환했더니 화질이 많이 안 좋습니다.)

반응형

댓글