## UI on 8160_GOSCAM_GD7612 ##### Tips and Tricks of Key UI on A1026 with Portrait Panel York <york_jiang@mars-semi.com.tw> Aug. 30, 2019 <!-- .slide: data-transition="zoom" --> slide: https://hackmd.io/@York/ByVGZtzSS --- ## Use Case of XnView * JPEG Parameters on XnView * Rotating (Turning Left) with XnView <!-- .slide: data-transition="fade-in convex-out" --> ---- ### JPEG Parameters on XnView ![](https://i.imgur.com/pMkI4R1.jpg) <!-- .slide: data-transition="fade-down convex-out" --> ---- ### Rotating (Turning Left) with XnView ![](https://i.imgur.com/bj2dDrC.jpg) <!-- .slide: data-transition="fade-down convex-out" --> --- ## Calculate the coordinates after rotation * Path of the Rotation Batch Files * Clicked turnLeft.bat * Drag&Drop turnLeft.bat * Clicked turnRight.bat * Drag&Drop turnRight.bat <!-- .slide: data-transition="fade-down convex-out" --> --- ### Path of the Rotation Batch Files ![](https://i.imgur.com/reT2JJs.jpg) <!-- .slide: data-transition="fade-down convex-out" --> ---- ### Clicked turnLeft.bat * Run with default input/output * input: * layout_org.yaml * JPG files in *out_org* folder * OSD files (.o8b or .o4v2) in *out_org* folder * output: * layout.yaml <!-- .slide: data-transition="fade-down convex-out" --> ---- ### Drag&Drop turnLeft.bat * Run with drag and drop a YAML file * input: * drag and drop a YAML file to *turnLeft.bat* * JPG files in *out_org* folder * OSD files (.o8b or .o4v2) in *out_org* folder * output: * XXX.ccw90.yaml <!-- .slide: data-transition="fade-down convex-out" --> ---- ### Clicked turnRight.bat * Run with default input/output * input: * layout_org.yaml * JPG files in *out_org* folder * OSD files (.o8b or .o4v2) in *out_org* folder * output: * layout.yaml <!-- .slide: data-transition="fade-down convex-out" --> ---- ### Drag&Drop turnRight.bat * Run with drag and drop a YAML file * input: * drag and drop a YAML file to *turnRight.bat* * JPG files in *out_org* folder * OSD files (.o8b or .o4v2) in *out_org* folder * output: * XXX.cw90.yaml <!-- .slide: data-transition="fade-down convex-out" --> --- ## Rotation aware batch files * _o4v2.bat/_o8b.bat * drag and drop a XXX_org folder to *_o4v2.bat/_o8b.bat* * will put generated .o4v2/.o8b files to *out_org* folder * _screen.bat * drag and drop a XXX_org.yaml file to *_screen.bat* * will put combined pictures to *screen_org* folder <!-- .slide: data-transition="fade-down convex-out" --> --- ## Rotation Supported APIs * Rotation Aware and Rotation Unaware * The Classify of APIs * Exception of the Classify * Rotation Functions in Pic module (Pic.h) * Use Case of Disp_setRotation (MainFlow.c) * Use Case of Disp_rotation (LiveViewFlow.c) * Use Case of DispBuf_coordBeforeRotation (MenuFunc.c) <!-- .slide: data-transition="fade-down convex-out" --> ---- #### Rotation Aware and Rotation Unaware * Rotation Aware * Logically view the coordinates and the dimensions when using APIs * Before rotation * landscape (horizontal) orientation * Rotation Unaware * Physical view * After rotation * upright (portrait) orientation <!-- .slide: data-transition="fade-down convex-out" --> ---- ### The Classify of APIs ```graphviz digraph { subgraph cluster_0 { label = "Rotation Aware" node [style=filled] color = blue "OsdBuf_*" "DispBuf_*" "vp_*" } subgraph cluster_1 { label = "Rotation Unaware" labelloc = b color = red "Layout_*" "Pic_*" } {"OsdBuf_*" "DispBuf_*" "vp_*"} -> "Pic_*" -> "Layout_*" } ``` <!-- .slide: data-transition="fade-down convex-out" --> ---- ### Exception of the Classify (1/2) * Physical dimensions of DispBuf_* APIs ```c DimPx DispBuf_Width(void); DimPx DispBuf_Height(void); ``` * Physical dimensions of OsdBuf_* APIs ```c DimPx OsdBuf_Width(void); DimPx OsdBuf_Height(void); ``` <!-- .slide: data-transition="fade-down convex-out" --> ---- ### Exception of the Classify (2/2) * APIs for conversion between Logical view an Physical view ```c void DispBuf_rotateCoord(DimPx *x, DimPx *y, DimPx w, DimPx h); void DispBuf_rotateExtent(DimPx *x, DimPx *y, DimPx *w, DimPx *h); void OsdBuf_rotateCoord(DimPx *x, DimPx *y, DimPx w, DimPx h); void OsdBuf_rotateExtent(DimPx *x, DimPx *y, DimPx *w, DimPx *h); void DispBuf_coordBeforeRotation(DimPx *x, DimPx *y); void OsdBuf_coordBeforeRotation(DimPx *x, DimPx *y); ``` <!-- .slide: data-transition="fade-down convex-out" --> ---- ## Rotation Functions in Pic module (Pic.h) ```c=137 /** Rotation Direction */ typedef enum { ROTATE_None, ///< keep original orientation, landscape (horizontal) ///< normally. ROTATE_Right, ///< rotate 90° clockwis ROTATE_Left ///< rotate 90° counterclockwis } Rotation; void Disp_setRotation(Rotation); Rotation Disp_rotation(void); void Disp_rotateCoord(DimPx *x, DimPx *y, DimPx w, DimPx h, DimPx canvas_w, DimPx canvas_h); void Disp_rotateExtent(DimPx *x, DimPx *y, DimPx *w, DimPx *h, DimPx canvas_w, DimPx canvas_h); void Disp_revertCoordRotation(DimPx *x, DimPx *y, DimPx w, DimPx h, DimPx canvas_w, DimPx canvas_h); void Disp_revertExtentRotation(DimPx *x, DimPx *y, DimPx *w, DimPx *h, DimPx canvas_w, DimPx canvas_h); //----------------------------------------------------------------------------- void DispBuf_rotateCoord(DimPx *x, DimPx *y, DimPx w, DimPx h); void DispBuf_rotateExtent(DimPx *x, DimPx *y, DimPx *w, DimPx *h); void OsdBuf_rotateCoord(DimPx *x, DimPx *y, DimPx w, DimPx h); void OsdBuf_rotateExtent(DimPx *x, DimPx *y, DimPx *w, DimPx *h); //----------------------------------------------------------------------------- void DispBuf_coordBeforeRotation(DimPx *x, DimPx *y); void OsdBuf_coordBeforeRotation(DimPx *x, DimPx *y); void Pic_getSizeBeforeRotation(const Pic *pic, DimPx *w, DimPx *h); ``` <!-- .slide: data-transition="fade-down convex-out" --> ---- ### Use Case of Disp_setRotation (MainFlow.c) ```c=358 #if LCM_ROTATION_SUPPORT == LCM_ROTATE_90_CLOCKWISE Disp_setRotation(ROTATE_Left); #elif LCM_ROTATION_SUPPORT == LCM_ROTATE_270_CLOCKWISE Disp_setRotation(ROTATE_Right); #endif UI_initViewport(); vp_alignCenter(); vp_puts("GOSCAM Video Baby Monitor"); ``` <!-- .slide: data-transition="fade-down convex-out" --> ---- ### Use Case of Disp_rotation (LiveViewFlow.c) ```c=300 /** Clears non-status-bar part of the OSD buffer. */ static void StatusBar_clearOthers(void) { LayPic bg = Layout_beginPic(LAY_StatusBar_Background); DimPx x = 0; DimPx y = LayPic_height(bg); DimPx w = LayPic_width(bg); DimPx h = OsdBuf_Height() - y; if (Disp_rotation()) { y = LayPic_width(bg); w = LayPic_height(bg); h = OsdBuf_Width() - y; } OsdBuf_fillRect(x, y, w, h, clLIMPID_OSD); } ``` <!-- .slide: data-transition="fade-down convex-out" --> ---- ### Use Case of DispBuf_coordBeforeRotation (MenuFunc.c) ```c=1104 /** Show a normal item. * @param i the index in a page of the item. * @param str the text of the item. */ static void PlbList_showNormalItem(Index i, const char* str, LayoutID lay_icons) { // Show the prefixing icon DispBuf_pasteLayPicFromOrderIdx(lay_icons, i); // Clear the highlighted background bar DispBuf_fillLayPicFromOrderIdx(LAY_PlbList_ItemSelBases, i, 0xFFFFFF); if (*str != '\0') { DimPx x = Layout_getXFromPicOrder(LAY_PlbList_Item1stCharCoords, i); DimPx y = Layout_getYFromPicOrder(LAY_PlbList_Item1stCharCoords, i); DispBuf_coordBeforeRotation(&x, &y); PlbList_initViewport(ResFromChar_Font40); vp_goto(x, y); vp_puts(str); // Show the text } } ``` <!-- .slide: data-transition="fade-down convex-out" --> --- ## Tips on *osd2pic.bat* * Shrink file sizes for PNG files * Replace colors for PNG files <!-- .slide: data-transition="fade-in convex-out" --> ---- ### Shrink file sizes for PNG files 1. *_o4v2.bat* * Drag a PNG (e.g., *o4v2_src_org*) folder to the *_o4v2.bat* * generated *.o4v2* files are in *out* folder 2. run *osd2pic.bat* with new *4.pal* * Drag the *out* folder to the *osd2pic.bat* * generated PNG files are in *out_osd2pic* folder <!-- .slide: data-transition="fade-down convex-out" --> ---- ### Replace colors for PNG files 1. *_o4v2.bat* with old *4.pal* * Drag a PNG (e.g., *o4v2_src_org*) folder to the *_o4v2.bat* * generated *.o4v2* files are in *out* folder 3. Edit *4.pal* to change color palatte 2. run *osd2pic.bat* with new *4.pal* * Drag the *out* folder to the *osd2pic.bat* * generated PNG files are in *out_osd2pic* folder 4. Recover the *4.pal* to the old one <!-- .slide: data-transition="fade-down convex-out" --> --- ## New Features of the Buttons module * Background with a Pure Color * Text Only Buttons * Composite Buttons * Geography of Buttons (Buttons_step2DButtonsAndGetIdx) * Do not support text only buttons * Buttons with Hot Keys (Buttons_stepHotKeyButtonsAndGetIdx) * 1D Buttons * Layouts as a Canvas <!-- .slide: data-transition="fade-in convex-out" --> ---- ### Composite Buttons on the Feed Time Setting menu ![](https://i.imgur.com/zCDxyDj.jpg) <!-- .slide: data-transition="fade-down convex-out" --> ---- ### Composite Buttons on the Feed Time List menu ![](https://i.imgur.com/S5pOq2k.jpg) <!-- .slide: data-transition="fade-down convex-out" --> ---- ### Layouts as a Canvas * Option Pictures for the background layout * Option Texts for the background layout * Value Increasing/Decreasing on the background layout * Button Options on the 2 button layouts * Text Replacement on the 2 button layouts <!-- .slide: data-transition="fade-down convex-out" --> ---- #### Option Pictures for the background layout ```c=60 //----------------------------------------------------------------------------- // Buttons::layBack with option pictures //----------------------------------------------------------------------------- Index Buttons_getBgPicOptionIdx(const Buttons*, LayoutID opt); Index Buttons_setBgPicOption(const Buttons*, LayoutID opt, Index optIdx); Index Buttons_goPrevBgPicOption(const Buttons*, LayoutID opt); Index Buttons_goNextBgPicOption(const Buttons*, LayoutID opt); ``` <!-- .slide: data-transition="fade-down convex-out" --> ---- #### Option Pictures on Unit and Enable in the TemperatureAlarm menu ![](https://i.imgur.com/7G3sxNQ.jpg) <!-- .slide: data-transition="fade-down convex-out" --> ---- #### Option Texts for the background layout ```c=71 //----------------------------------------------------------------------------- // Buttons::layBack with option texts (messages) //----------------------------------------------------------------------------- Index Buttons_getBgTxtOptionIdx(const Buttons*, LayoutID opt); Index Buttons_setBgTxtOption(const Buttons*, LayoutID opt, Index optIdx); Index Buttons_goPrevBgTxtOption(const Buttons*, LayoutID opt); Index Buttons_goNextBgTxtOption(const Buttons*, LayoutID opt); ``` <!-- .slide: data-transition="fade-down convex-out" --> ---- #### Option Texts on Enabled and EveryDay in the ClockAlarm menu ![](https://i.imgur.com/69SDYJM.jpg) <!-- .slide: data-transition="fade-down convex-out" --> ---- #### Value Increasing/Decreasing on the background layout ```c=82 //----------------------------------------------------------------------------- // Buttons::layBack with value selection //----------------------------------------------------------------------------- /** Attributes for values step-by-step changing on a background layout * (Buttons::layBack). */ typedef struct { int min; ///< the minima of the sequence int max; ///< the maxima of the sequence int step; ///< step size of the sequence Char2ResFunc res_from_char; } BgValAttr; int Buttons_getBgValue(const Buttons*, Index pic_order, const BgValAttr*); void Buttons_setBgValue( const Buttons*, Index pic_order, const BgValAttr*, int val); void Buttons_showBgValue(const Buttons*, Index pic_order, const BgValAttr*); int Buttons_goPrevBgValue(const Buttons*, Index pic_order, const BgValAttr*); int Buttons_goNextBgValue(const Buttons*, Index pic_order, const BgValAttr*); ``` <!-- .slide: data-transition="fade-down convex-out" --> ---- #### Value Increasing/Decreasing hour/minute on the ClockAlarm menu ![](https://i.imgur.com/69SDYJM.jpg) <!-- .slide: data-transition="fade-down convex-out" --> ---- #### Button Options on the 2 button layouts ```c=106 //----------------------------------------------------------------------------- // Buttons with Button Options //----------------------------------------------------------------------------- typedef struct { LayoutID layButton; ///< layout of options of a normal button ///< or layout of options of all untouched buttons. LayoutID layFocus; ///< layout of options of a selected/focused/touched ///< button or layout of options of all touched buttons. } ButtonOptions; void Buttons_replaceElemButton(Buttons*, const ButtonOptions*, Index optIdx); void Buttons_replaceButton(Buttons*, const ButtonOptions*, Index optIdx); ``` <!-- .slide: data-transition="fade-down convex-out" --> ---- #### Button Options for the camera icons on camera selection menus. ![](https://i.imgur.com/BGZa2xl.jpg) <!-- .slide: data-transition="fade-down convex-out" --> ---- #### Text Replacement on the 2 button layouts ```c=121 //----------------------------------------------------------------------------- // String of an Item button //----------------------------------------------------------------------------- /** Attributes of button string. */ typedef struct { Char2ResFunc btn_res_from_char; ///< for string Buttons::layButton. Char2ResFunc fcs_res_from_char; ///< for string on Buttons::layFocused. Index begin; ///< picture order (in the layouts) of 1st character of 1st ///< item. } ButtonStrAttr; void Buttons_replaceButtonStr(const Buttons*, Index btnIdx, const char* str, const ButtonStrAttr*); ``` <!-- .slide: data-transition="fade-down convex-out" --> ---- #### Text Replacement on hh:mm of the Feed Time List menu ![](https://i.imgur.com/S5pOq2k.jpg) <!-- .slide: data-transition="fade-down convex-out" --> --- ## Abstracted TextMenu (TextMenu.h) ```c=17 struct TextMenu; typedef void (*TMShowFrame)(const struct TextMenu*); typedef void (*TMShowItem)(const struct TextMenu*, Index itemIdx); /** Text Menu template */ typedef struct TextMenu { size_t nitems; ///< the total number of items Index now; ///< the index of now item size_t maxPageItems; ///< the number of items of a page TMShowItem showNormalItem; ///< function to show a normal item TMShowItem showFocusItem; ///< function to show a focused item TMShowFrame showFrame; ///< function to show the frame } TextMenu; void TextMenu_init(TextMenu*, size_t nitems, Index now, size_t maxPageItems); void TextMenu_setAttr(TextMenu*, size_t nitems, Index now, size_t maxPageItems); void TextMenu_setShowFunc(TextMenu*, TMShowItem normalFunc, TMShowItem focusFunc, TMShowFrame); Index TextMenu_nowPage(const TextMenu*); size_t TextMenu_totalPage(const TextMenu*); size_t TextMenu_itemsOfNowPage(const TextMenu *m); Index TextMenu_firstItemOfNowPage(const TextMenu *m); Index TextMenu_lastItemOfNowPage(const TextMenu *m); void TextMenu_goPrevItem(TextMenu*); void TextMenu_goNextItem(TextMenu*); void TextMenu_goItemOfNowPage(TextMenu*, Index itemIdx); void TextMenu_goPrevPage(TextMenu*); void TextMenu_goNextPage(TextMenu*); void TextMenu_removeNowItem(TextMenu*); const char* TextMenu_pageStr(const TextMenu*); void TextMenu_show(const TextMenu*); void TextMenu_showChanged(const TextMenu*, Index oldFocusItem); ``` <!-- .slide: data-transition="fade-out convex-out" --> --- ### Module Dependency Diagram ```graphviz digraph { node [shape=box] subgraph { node [color=green style=record] "LayoutPosition.i" "LayoutOffset.i" "LayoutID.h" "LangID.h" "MsgID.h" "ResID.h" "ResMap.i" } subgraph { node [shape=ellipse color=blue] MainFlow LiveViewFlow MenuDef MenuFunc MenuID Key } subgraph { node [color=red style=rounded] Menu Buttons } subgraph { node [shape=box style="filled,rounded"] TextMenu Viewport Pic SoftTimer Res Layout SNor } MainFlow -> {Menu LiveViewFlow} {MenuDef MenuFunc MenuID} -> Menu {MainFlow LiveViewFlow Menu MenuFunc} -> SoftTimer {MainFlow LiveViewFlow MenuFunc Menu} -> Key MenuFunc -> {TextMenu Buttons} {MenuFunc MainFlow} -> Viewport {Viewport Buttons Menu MenuFunc} -> Pic {Menu LiveViewFlow} -> Buttons Buttons -> {Layout Key} Pic -> {Layout Res SNor} Layout -> { "LayoutPosition.i" "LayoutOffset.i" "LayoutID.h" "LangID.h" "MsgID.h" "ResID.h" } Res -> {"ResID.h" "ResMap.i" SNor "MsgID.h" "LangID.h"} {rank=same; legend; Pic;} legend [ label="green: generated by tools\lblue: must be modified by project\lred: may be modified by project\l" shape=record label="{ green: tool generated\l | blue: manually modified\l | red: key specific\l | gray: common for all\l}" color=white ] } ``` <!-- .slide: data-transition="fade-out convex-out" --> --- ### Code Generation Batch Files ```graphviz graph { //rankdir=TB ranksep=0.02 node [shape=plaintext] //edge [style=invis] { // for layout only node [style=invis] a -- b -- c [style=invis] } c -- pl_i [style=invis] pl_i -- "_piclay.bat" -- pl_o subgraph cluster_0 { style="dashed,filled" label="_make.bat" labelloc=b subgraph cluster_1 { style=invis o8_i -- "_o8b.bat" -- o8_o o4_i -- "_o4v2.bat" -- o4_o cj_i -- "Copy\nJPG" -- cj_o } subgraph cluster_2 { style=invis fl_i -- "_fwlnk.bat" -- fl_o rl_i -- "_reslnk.bat" -- rl_o } o8_o -- fl_i [style=invis] // for layout only } "Copy\nJPG", "_o4v2.bat", "_o8b.bat", "_piclay.bat", "_reslnk.bat", "_fwlnk.bat" [ shape=redord style="filled,rounded" fillcolor=forestgreen fontcolor=white ] cj_i [label=<<br/><font color='brown'>jpg_src\*.jpg</font>>] cj_o [label=<out\*.jpg>] o4_i [label=<<font color='red'>4.pal<br/></font> <font color='brown'>o4v2_src\*.png</font>>] o4_o [label=<out\*.o4v2>] o8_i [label=<<font color='red'>64.pal<br/></font> <font color='brown'>o8b_src\*.png</font>>] o8_o [label=<out\*.o8b>] pl_i [label=<<br/><br/><font color='red'>layout.yaml,<br/> dic.xls,<br/></font>out\*.*>] pl_o [label=<<font color='blue'>LayoutOffset.i,<br/> LayoutPosition.i,<br/>LayoutID.h,<br/> MsgID.h,<br/>LangID.h,<br/>PosID.h,<br/></font>res.lst>] rl_i [label=<<br/><br/><br/>res.lst,<br/>out\*.*>] rl_o [label=< <font color='blue'>ResID.h,<br/>ResMap.i,<br/> </font>res.bin<br/><br/><br/><br/><br/><br/>>] fl_i [label=<pa9001.bin,<br/> <font color='forestgreen'>BL26UB_32MB.bin,</font><br/> res.bin,<br/> <font color='forestgreen'>header.lst,<br/> body.lst,<br/>burn.lst</font>>] fl_o [label=<~mainsize.bin,<br/> ~Version.bin,<br/>~Date.bin,<br/> ~header.bin,<br/>~head~*.bin,<br/>~body.bin,<br/> <font color='blue'><b>burn*.bin</b></font>>] } ``` <!-- .slide: data-transition="fade-out convex-out" --> <!-- .slide: data-background-size="1000px" --> --- ## enum.bat * To look-up enumerators from .h files * Run methods * double-clicked to look-up default folders (ui/inc, inc/HAL) * drag&drop a folder to enum.bat to look-up a user decided folder <!-- .slide: data-transition="fade-out convex-out" --> --- ## _merge_dist.bat * To generate replace_res folder to release to customer to replace UI pictures. * Run steps 1. Double clicked _merge_dist.bat will generate replace_res folder 2. Replace picture files in XXX_src folders 3. Drage&Drop original burn.bin file to _merge.bat to generate new burn file. <!-- .slide: data-transition="fade-out convex-out" --> --- ## burn2prog.bat * Generate a mass production programmer binary file from an ISP burn file * input: burn*.bin * output: prog*.bin * Run methods * Double clicked on the batchfile * apply the latest burn-*.bin file from _res folder as the input * Drage&Drop a burn*.bin file to the batchfile * apply the dropped file as the input --- ## _fwlnk_with_config.bat * Generate a burning file with config data * input: burn-*.bin * output: burn_config-*.bin * Run methods * Double clicked on the batchfile * apply the latest burn-*.bin file from _res folder as the input * generate a new one burn-*bin if it does not exist --- ## See Also * [Touch UI: UI architecture in A1026 projects](https://docs.google.com/presentation/d/1vJAWMa9tIMhGr9AIe4H9vzO5WXgVg2oMGlFkmslr9Bw/edit?usp=sharing) * [Mouse UI: UI architecture in 9300 projects](https://docs.google.com/presentation/d/1zzbgEl8ltEKE5XLcRsPXL446rZC5p84xVHSwDjaJraw/edit?usp=sharing) * [UI with Automation Tool: 6780 SDK](https://docs.google.com/presentation/d/1U1gEr36QpkwwT8vsNG791nmDShWBHMb8WfIsbZbIZwY/edit?usp=sharing) <!-- .slide: data-transition="fade-out convex-out" --> --- ## Backup Slides * Comparation of Statistics * Menu Tree of 8160_GOSCAM_GD7612 <!-- .slide: data-transition="fade-out convex-out" --> ---- ### Comparison of the Statistics | Project | Main Input | PNG | JPG | Pictures | Layouts | Menus | | ---------------------- | --------------------- | ---: | ---: | -------: | ------: | ----: | | 8160_GOSCAM_GD7612 | ADC **Keys** | 207 | 1353 | 1560 | 172 | 33 | | 8989_WOAN_M871TM | **Touch** Panel | 163 | 93 | 256 | 74 | 13 | | 9300-216M_EVB | Mouse | 727 | 1400 | 2127 | 245 | 88 | | 9670_HeChi | ADC **Keys** | 88 | 316 | 404 | 42 | 15 | | 9670_COMMAX_71UM | **Touch** Panel | 173 | 742 | 915 | 87 | 25 | | 9670_COMMAX_WI2 (70KM) | Touch **Keys** | 157 | 380 | 537 | 75 | 20 | | 9670_COMMAX (71AM) | I/O Extender **Keys** | 153 | 436 | 589 | 77 | 20 | <!-- .slide: data-transition="fade-left convex-out" --> ---- ### Menu Tree of 8160_GOSCAM_GD7612 ``` MENU_Main ├── MENU_CameraCfg -- Select a Camera and Adjust its volume │ └── MENU_CameraAddRemove -- Camera Adding and Removal │ ├── MENU_CfmToPair -- Confirm to Pair │ │ ├── Msg_show(LAY_MsgStartPairing) │ │ ├── Msg_show(LAY_MsgPairingOK) │ │ └── Msg_show(LAY_MsgPairingNG) │ ├── Msg_show(LAY_MsgCameraPaired) │ ├── MENU_CfmToUnpair -- Confirm to Unpair │ │ └── Msg_show(LAY_MsgCameraDeletingOK) │ └── Msg_show(LAY_MsgCameraCannotBeDeleted) ├── MENU_AlarmKind │ ├── MENU_SoundAlarm │ ├── MENU_ClockAlarmList -- List Feed Times │ │ └── MENU_ClockAlarm -- Set the Selected Feed Time │ └── MENU_TemperatureAlarm ├── MENU_PlbListSelDate -- List Date Folders │ ├── MENU_CfmToDelDate -- To Delete a Date Folder │ └── MENU_PlbListSelChannel -- List Channel Folders │ ├── MENU_CfmToDelChannel -- To Delete a Channel Folder │ └── MENU_PlbListSelVideo -- List Video Files │ ├── MENU_CfmToDelVideo -- To Delete a Video File │ └── MENU_PlayVideo -- Play Videos ├── MENU_Record -- Setting of Video Recording ├── MENU_LullabiesCamSel -- Select a Camera for Lullabies │ └── MENU_Lullabies -- Play/Pause a Lullaby to Selected Camera └── MENU_Setup ├── MENU_TimeSetting ├── MENU_Overwrite -- On/Off Overwrite for Video Recording ├── MENU_Language ├── MENU_AlarmSound -- On/Off the Sound of Alarms ├── MENU_WiFiSettingCamSel -- Select a Camera for WIFI Setting │ └── MENU_WiFiSetting -- WIFI Settings (SSID and Password) │ ├── MENU_Keyboard -- Virtual Keyboard │ ├── Msg_show(LAY_WiFiStatus_Connecting) │ ├── Msg_show(LAY_WiFiStatus_Success) │ └── Msg_show(LAY_WiFiStatus_Failed) ├── MENU_Sleep -- Setting of LCD Sleeping ├── MENU_Format -- Format the SD Card │ ├── Msg_show(LAY_MsgFormating) │ └── Msg_show(LAY_MsgFormatted) ├── MENU_Restore -- Restore to Factory Settings │ ├── Msg_show(LAY_MsgRestoring) │ └── Msg_show(LAY_MsgRestoringNG) └── MENU_Version -- Show f/w Versions of TX/RX ``` <!-- .slide: data-transition="fade-left convex-out" --> ---
{"metaMigratedAt":"2023-06-14T23:39:37.792Z","metaMigratedFrom":"YAML","title":"UI on 8160_GOSCAM_GD7612","breaks":true,"description":"Tips and Tricks of Key UI on A1026 with Portrait Panel","image":"https://i.imgur.com/zCDxyDj.jpg","robots":"noindex, nofollow","contributors":"[{\"id\":\"71906526-ed63-4cd8-9544-bd6a188a2e8b\",\"add\":39952,\"del\":14581}]"}
    229 views