## 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

<!-- .slide: data-transition="fade-down convex-out" -->
----
### Rotating (Turning Left) with XnView

<!-- .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

<!-- .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

<!-- .slide: data-transition="fade-down convex-out" -->
----
### Composite Buttons on the Feed Time List menu

<!-- .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

<!-- .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

<!-- .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

<!-- .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.

<!-- .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

<!-- .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}]"}