Compare commits

..

76 Commits

Author SHA1 Message Date
yuquanjun 4544f8706a Release 0.2.3: fix local song HKTK load/play and keep tone map logs.
Use 41KB preset buffer with compressed 2.bin, expert/normal StartWithNote path, Flash Map address logs, and ship flash-mode/hub assets plus flash helpers.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-07 21:48:54 +08:00
yuquanjun c4852aca5d Restore WenQuanYi 择 glyph matching the known-good UI shot.
Drop the hand-tuned/mislabeled variants; use the 9pt Song bitmap that matched the first-version 弦音色选择 look.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-07 15:22:10 +08:00
yuquanjun 4d0b015a07 Restore first-version 择 bitmaps for mode-home labels.
Keep GBK D4F1 mapping but revert glyph data to the pre-regeneration art that matched the known-good UI look.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-07 15:18:22 +08:00
yuquanjun 68aec080c8 Fill 择 to full cell with clearer hand-tuned strokes.
Label-size glyph now matches neighbors edge-to-edge (0..10) with a stronger 扌 so 弦音色选择 stays readable.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-07 15:14:00 +08:00
yuquanjun c4969c895c Redraw 择 glyph full-cell from WQY 16px source.
Label-size 择 was inset and hard to read; scale the clear 16px bitmap into each size so it matches neighbors edge-to-edge.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-07 14:51:19 +08:00
yuquanjun e11ec36ca5 Fix missing 择 on mode-home timbre label.
Font table had wrongly mapped GBK 议 (D2E9) as 择; remap to D4F1 and regenerate the MiSans glyph so 弦音色选择/歌曲选择 render fully.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-07 13:48:18 +08:00
yuquanjun 0e5a8efdd8 Rename timbre row label from 选议 to 选择.
Fixes the GBK UI string shown above the string-timbre control on all three mode home screens.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-07 12:14:27 +08:00
yuquanjun 45686415a7 Nudge transpose/tempo main values up 3px and right 3px.
Only the center KEY/BPM digits move; chevrons, plus/minus, and labels stay put across all three modes.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-07 11:58:49 +08:00
yuquanjun 50e847e2ee Use 0907 hub icons and full-screen flash-mode artwork.
Replace settings-hub mixer/gear bitmaps, and show Boot IAP screen from UI0902_FLASH_MODE in external Flash.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-07 11:16:45 +08:00
yuquanjun 8c941905e7 Refresh UI0902 address map after transparent icon pack rebuild.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-07 09:30:59 +08:00
yuquanjun 23c2dee80f Release 0.2.2: package ALL extflash only and bump firmware version.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-07 09:29:01 +08:00
yuquanjun 0a0bd9b3ea Fix system-settings icon dark fill on focus blue rows.
Treat baked #242B3A as transparent when drawing icons, and limit #IV octave drop to keys 10-12.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-07 09:28:35 +08:00
yuquanjun 280aa1f752 Persist Bluetooth switch in NVM and restore it across power cycles.
Reuse the unused Language slot as BluetoothSW, sync top-bar icon from the saved switch, and keep factory restore defaulting Bluetooth to on.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-07 08:26:45 +08:00
yuquanjun f80c16dbef Polish system-settings digit glyph and right-edge alignment.
Raise ascii_115 '4' to match '5' height, nudge auto-off digits down 2px, and align version box / restore chevron to the shared val_x2 right edge.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-07 08:17:34 +08:00
yuquanjun 7c76b8302a Reduce flicker when switching between the three play modes.
Home-page mode switches now redraw only the mode card and nav bar instead of clearing the full screen.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-06 21:42:01 +08:00
yuquanjun f076d1714a Clear setting-row bounds before redraw to drop focus corner ghosts.
Unfocused FillRoundRect left blue pixels from the prior gradient roundrect; erase the full card box to page background first.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-06 21:03:31 +08:00
yuquanjun a02379104d Fix system-settings icons, version dots, and auto-off centering.
Use correct BT/restore glyphs and triangle steppers, put version periods on the baseline, and center auto-off minutes between the triangles.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-06 20:56:11 +08:00
yuquanjun 0bf9b77a4a Brighten and thicken shared status and nav separator lines.
Use a lighter gray-blue at 2px so top and bottom dividers stay matched and readable on the dark background.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-06 20:01:53 +08:00
yuquanjun 8a7e8169a2 Align status sep and mode-select rows to 0902 draft.
Put the status divider at y=36 and start mode rows at CARD_Y=48 so Universal matches transpose/tempo tops with draft row height 88 and pitch 92.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-06 19:43:47 +08:00
yuquanjun bce08be772 Show chord progression on Universal; rhythm/local on Normal and Expert.
Swap mode-home param rows and tone reload so TAB0 uses 和弦走向 while TAB1/2 keep 节奏类型 and 本地曲目 with 弦音色.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-06 19:25:09 +08:00
yuquanjun 141f232b91 Restore shared status-bar separator at y=26 on all top bars.
Mode select and mode home pages now draw the same continuous divider after status icons.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-06 19:04:36 +08:00
yuquanjun 766f7ee0ba Stop nav-bar clear from clipping section-button bottom corners.
Bottom fill started at y=263 and erased the lower 2px of the r=6 roundrects, so bottoms looked flatter than tops.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-06 18:49:05 +08:00
yuquanjun 029313ce99 Nudge status-bar battery icon and percent down by 2px.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-06 18:41:18 +08:00
yuquanjun d1f1a2cc87 Tighten battery percent spacing and inset the charge fill.
Keep icon and % as one right-aligned group, and leave a 1px gap between fill and shell so they no longer touch.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-06 18:30:15 +08:00
yuquanjun 5daf5e794b Fix mode-select UX and status-bar battery alignment.
Single-tap mode entry, hide top separator and row artifact line, center battery with vol/BT, and make % match digit height.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-06 18:19:47 +08:00
yuquanjun 49af730f91 Release 0.2.1: persist mixer volume across power cycles.
Sync faders on shutdown and re-apply LoadConfig after DSP boot so
saved mixer levels and master pot stay consistent after power-off.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-06 12:29:42 +08:00
yuquanjun 794345d3ba Enable chord-progression LEDs in universal mode.
Drive measure-synced Loop_Light for TAB 0 (and settings entered from it) using the same 1645/1564/1364 rules as normal mode.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-06 08:41:30 +08:00
yuquanjun c5428ad81f Fix incomplete status-bar battery outline.
Keep L/R walls when generating the outline asset, tighten fill to the cavity, and nudge the icon up so the bottom edge is not clipped.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-06 07:57:55 +08:00
yuquanjun 6436477ec2 Default pick-down accompaniment to current-key I chord.
When no left-hand chord is selected, Pick_Handle uses index-1 major (same as preamble) so strumming still starts Autoband.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-06 07:20:08 +08:00
yuquanjun ee900b5657 Sync master volume from EC pot on every page and at boot.
Always Send_volume in MainTask, re-apply after DSP settle, and sync vol_last so UI bar matches Dream gain.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-06 07:15:04 +08:00
yuquanjun db03ac501c Fix broken size-16 ASCII glyphs used by transpose key names.
Regenerate ascii_1608 from LiberationSans and lower binarization threshold so E/A/B strokes stay complete when switching keys.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-06 07:12:41 +08:00
yuquanjun 740c709a82 Persist mixer fader levels and fix mic map for level 10.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-05 21:56:14 +08:00
yuquanjun d654581f4d Fix mixer labels order, vivid track colors, and solid blue knobs.
Map 伴奏/弦/麦/麦混响 to correct assets, boost track saturation, fill knob disks.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-05 21:30:59 +08:00
yuquanjun f0c60a0024 Draw charge percent with MiSans glyphs for aligned 50%.
Replace bitmap-font % with shared-baseline Semibold digit bitmaps.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-05 21:11:28 +08:00
yuquanjun 055c7de00c Fix corrupt ascii_1608 percent glyph on charge screen.
Replace broken % bitmap so battery percent renders as a clear 50%.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-05 20:56:14 +08:00
yuquanjun bc41d27730 Fix charge-screen battery percent clip to match 0904 design.
Draw 16px glyphs at y=269 so the full 50% matches the design bbox.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-05 20:48:52 +08:00
yuquanjun 0e57fa452f Harden charge UI draw when ExtFlash asset missing.
Fill dark background first, overlay % at size 24, and fall back if charge bitmap is erased.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-05 20:39:11 +08:00
yuquanjun d960d88147 Show full-screen charge UI when USB plugs in while soft-off.
Avoid auto Logo boot on USB reset; enter charge page instead of mode select.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-05 19:58:42 +08:00
yuquanjun c16a13edc3 Fix long-press power to soft-off instead of MCU reset.
PowerOff was calling nvic_system_reset after cutting rails, and boot auto power-on made it look like a restart.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-05 19:39:15 +08:00
yuquanjun 39954589e8 Fix restore Cancel/Confirm bitmaps and align auto power-off to manual.
Use 1-bit RGB565 labels for 取消/确认 to avoid font corruption, and map autoclose to 15/30/45/60/off per the user manual.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-05 19:33:57 +08:00
yuquanjun db07d3bb0c Fix Cancel 取/消 bitmaps and wire auto power-off countdown.
Replace wrong glyphs for 取消; implement idle timer reset/tick so auto shutdown can actually power off.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-05 18:18:39 +08:00
yuquanjun 57caea9bf7 Fix Cancel 取/消 glyphs and enable auto power-off timer.
Regenerate MiSans bitmaps for 取消; tick idle countdown and shut down when timeout elapses.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-05 18:13:31 +08:00
yuquanjun ce7e488994 Fix restore Cancel glyphs and 0904 subpage back icon.
Correct GBK codes for 取/消 so Cancel text shows; draw mixer back bitmap on mixer/settings/restore headers.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-05 17:35:56 +08:00
yuquanjun 70e608e2ce Align bottom nav, section, and settings row geometry to 0904.
Centers 40/100/160/210, SECTION_Y 231, and SET_ROW 16x207 so play/settings pages match the standard art.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-05 07:05:23 +08:00
yuquanjun 66ccfdccf6 Fix factory restore to write NVM defaults and align settings icons.
Confirm page now persists factory BPM/vols/params via drv_nvm and matches 0902-07/08 icon and button text spacing.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-05 06:33:04 +08:00
yuquanjun 2bca0c5673 Add full-screen 0904 charge art to UI0902 resource pack.
Charge page draws UI0902_CHARGE_SCREEN instead of legacy 160x190 Charg.bin; pack/gen/publish paths keep the asset in sync.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-05 06:27:12 +08:00
yuquanjun 8c3c14ccf8 Drive local song titles from CSV and add 海阔天空 glyphs.
UI shows LocalSongNames instead of bare indices; pack regenerates the header; WQY font gains the four display characters.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-04 22:15:46 +08:00
yuquanjun 7b5667b179 Reload tone bank after mode Init sets TAB so Expert no longer keeps Universal accomp.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-04 19:12:29 +08:00
yuquanjun f179a46c5d Fix teacher accomp issues and add ExtFlash chip-erase helper.
Pick fires on downstroke; #IV drops an octave; local songs use 2.bin; transpose updates notes without restart; intro starts on key I; boot string volume/PC corrected.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-04 17:06:02 +08:00
yuquanjun c724ddd2c9 Align settings UI to 0904 and fix WQY glyph packing.
Settings hub/mixer/system/restore match 0904 layouts; regenerate Chinese bitmaps without shrinking native 16px cells so strokes stay continuous.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-04 14:43:32 +08:00
yuquanjun d4973f633e Include UI0902 bitmaps in release ExtFlash package.
Colleague boards showed garbled mode-select when only the tone .res was flashed; ship combined tone+UI0902 image for full external Flash programming.
2026-09-04 12:02:55 +08:00
yuquanjun c05301d8b9 Map tone Flash banks for pack 0903 and bump firmware to 0.2.0.
Point normal/expert/universal ADDRESS at 1.bin/3.bin bases, add ExtFlash_Tone_Addr.h plus pack/publish helpers for paired MCU+.res releases.
2026-09-04 11:12:22 +08:00
yuquanjun 8f0d0a3a52 Fix status-bar battery to match mode.png with intact percent.
Replace the mistaken fill bitmap that embedded "80%" text with a solid level bar, right-align size-9 "N%" with reserved 100% width, and refresh Free/Expert battery updates.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-04 08:50:00 +08:00
yuquanjun e56f480135 Tune free-mode card spacing and restore readable Latin glyphs.
Move KEY/BPM values and chevrons toward mode.png rhythm, drop musical-flat b and digit dilation so Db and body digits stay complete without looking bold.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-04 08:28:56 +08:00
yuquanjun 9516586a9c Widen size-16 Latin cells to 10px for Cb/101.
Liberation C is 10px wide; packing into 8px crushed hero values. Keep ascii_1608 symbol with 32-byte glyphs.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-04 07:53:05 +08:00
yuquanjun 65875d5e9c Tighten glyph packing margins and widen digit tracking.
Regenerate size 13/16 WQY/Liberation cells with edge margin and a fuller flat for Cb, and bump ASCII advance so chord numbers match mode.png spacing.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-04 07:47:51 +08:00
yuquanjun d7af2cee1a Fix mode-page glyph clip, digit tracking, and nav separator.
Match mode.png: widen card value slots, use ASCII advance spacing so 1364 is not cramped, and draw the section/nav divider line.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-04 07:30:24 +08:00
yuquanjun 5290d897a0 Align free-mode layout to 0902-04 geometry.
Match card/row/section positions and sizes from the 240x320 reference, restore 16px hero values, and place the 和弦走向 title above the row like timbre.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-04 06:39:00 +08:00
yuquanjun ce2cfd9cd1 Use 0902 control triangle icons for mode-page nav.
Replace drawn chevrons on transpose/song/timbre rows with 控件-11/12 solid triangle bitmaps from the 0902 asset pack.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-03 19:44:11 +08:00
yuquanjun b36c9c785e Fix WQY Latin metrics and stop duplicate timbre text.
Use Liberation Sans for KEY/BPM/Db with wider ASCII cells, redraw KEY/BPM after value refresh, and reuse the centered timbre layout on refresh so a second line no longer appears.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-03 19:33:36 +08:00
yuquanjun 0d906e9e9f checkpoint: MiSans Semibold + card textboxes before WQY MicroHei test.
Save current UI textbox layout and font regen so we can restore with
git reset --hard checkpoint/misans-before-wqy if MicroHei trial fails.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-03 17:59:58 +08:00
yuquanjun b139aa7ca7 Scale mode-page widgets to 0902 reference proportions.
Apply measured 240x320 geometry for cards, tabs, rows, and section buttons, and recenter text so KEY/BPM, battery %, and row labels no longer clip.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-03 12:43:19 +08:00
yuquanjun 89e7401955 Align mode pages to 0819 font sizes and four-key bottom nav.
Apply label/body/hero hierarchy (11/13/16), enlarge section digits to 13, and switch the bottom bar to 万能|普通|专业|设置 while keeping touch/key logic.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-03 11:58:08 +08:00
yuquanjun 65f38bb5a3 Fix TAB missing glyphs and tighten mode-page typography.
Use size-12 tabs with full 节/类/型/地/目 coverage, denser MiSans bitmaps, dark row chrome, and safer section-label draw order; skip ASCII regen by default.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-03 09:19:29 +08:00
yuquanjun c8e32958a7 Restore 演奏段落 and reduce Chinese glyph clipping.
Widen TAB text margins at 11px, regenerate section/timbre labels, and regenerate MiSans bitmaps with padding so strokes are not cut.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-03 08:28:30 +08:00
yuquanjun 805ca0c94b Fix mirrored touch X and align settings/mixer to 0902.
Enable TP_MIRROR_X for left/right hits, draw blue numeric mixer knobs, and restyle system settings rows with title order and chevron values.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-03 08:15:34 +08:00
yuquanjun 89e28ce693 Align three mode pages with 0902 layout and fonts.
Sync card/row/tab geometry, hollow chevrons, section select, bottom-bar Y, MiSans CHS12 glyphs, and RTT TAP x,y for UI capture.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-03 08:11:16 +08:00
yuquanjun 2f84c3bb9b Add 0902 full-screen boot logo to external UI resource pack.
Draw POWER_ON from UI0902_BOOT_LOGO, add ui boot RTT preview command, and harden RTT flash ACK pacing.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-02 16:57:36 +08:00
yuquanjun 41052d334d Align mode-select and status bar with 0902/0819 design.
Fill three mode rows to the screen bottom without a nav bar, and fix the status bar to one volume meter, centered Bluetooth, and battery percentage.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-02 16:23:18 +08:00
yuquanjun e62c2270af Fix mode-row asset pairing and add RTT external UI flash path.
- Map 0902 rows as 16/19 universal, 17/20 normal, 18/21 expert
- Add flash ui0902 RTT writer; avoid LCD dump stealing down bytes
- Restore UI_ReturnToModeSelect; shrink flash-trans RAM use
- Disable mode-select debug touch crosses

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-02 15:24:49 +08:00
yuquanjun f8675e3529 Reskin UI with 0902 design assets and 3-icon bottom navigation.
- Mode select page draws 222x84 row bitmaps from external flash
- Mixer page uses flash track/knob images with picture labels
- Settings and restore pages re-laid out with 0902 row style
- New status bar icons and battery outline+clip fill rendering
- Add LCD_WR_PIC_ClipX and LCD_WR_PIC_FROM_FLASH_Trans draw APIs
- Replace 4-tab bar with GUI_NAV_BAR 3-icon bottom navigation
- Swap 0831 assets for UI0902 in the IAR project file

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-02 13:37:25 +08:00
yuquanjun 9b3d457da6 Fix boot black screen and mode-select touch Y-axis mapping.
Send POWER_ON before slow peripheral init, enable backlight at LCD init,
init W25Q128 early, and avoid App_Auto preset load deadlock. Disable
LCD dump by default and enlarge UI thread stack for stable drawing.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-02 12:16:05 +08:00
yuquanjun 42534a28b8 Add RTT touch diagnostics: tp status/live commands and live event monitor.
Harden reset/recover when RTT is missing, and stream touch/UI events only on press for field debugging.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-31 21:59:13 +08:00
yuquanjun 33f48d9171 Improve mode-select focus UX and related touch hit feedback.
Redraw only changed mode buttons, restore focus-then-enter, and keep page transitions from false bottom-tab hits.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-31 21:59:12 +08:00
yuquanjun d48e3fa63a Stabilize non-Mixer click handling and page-change touch suppress.
Report clicks on release for navigation pages, suppress residual presses after UI switch, and log touch task edges.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-31 21:59:12 +08:00
yuquanjun 5a9f7c81ea fix XPT2046 sampling to IRQ-only with stable screen mapping.
Reject idle ADC noise (y stuck at full scale) that caused ghost clicks; keep Y-mirror mapping for mode-select.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-31 21:59:12 +08:00
178 changed files with 9896 additions and 3828 deletions

View File

@ -125,6 +125,8 @@ static void app_adc_pick_process(void)
{
pick_hold_tick = now;
pick_fsm = PICK_FSM_STATE_DOWN;
/* 音师:拨片下拨即响(进入 DOWN 触发),不要等复位 */
MainTask_Sendmsg(MSG_ID_BP_KEY,PICK_STATE_DOWN,0,0);
}
if(curstate == PICK_STATE_UP)
{
@ -136,8 +138,6 @@ static void app_adc_pick_process(void)
if(curstate != PICK_STATE_DOWN)
{
pick_fsm = PICK_FSM_STATE_IDLE;
//发送下拨消息
MainTask_Sendmsg(MSG_ID_BP_KEY,PICK_STATE_DOWN,0,0);
}
break;
case PICK_FSM_STATE_UP:
@ -214,6 +214,16 @@ static void app_adc_key_process(uint8_t idx)
}
/* ==================== ADC1 in4 ==================== */
/* 快速探测 Type-C / USB 是否接入(关机开机路径共用) */
bool app_adc_usb_is_plugged(void)
{
uint16_t val;
BSP_SelectAdcChannel(4); /* E_ADC1_FUNCTION_USB_CHECK */
Delay_us(20);
val = ADC_ReadChannel(ADC_CHANNEL_1) >> 5;
return (val > 80) ? true : false;
}
static void app_adc_charge_process(void)
{
uint16_t val = ADC_ReadChannel(ADC_CHANNEL_1) >> 5;
@ -224,11 +234,17 @@ static void app_adc_charge_process(void)
if (usb_charging_state != 1)
{
usb_charging_state = 1;
usb_charging_laststate = 1;
if (powon)
{
MainTask_Sendmsg(MSG_ID_CHARG, usb_charging_state, usb_charging_laststate, 0);
}
usb_charging_laststate = 1;
else
{
/* 关机态插电:立即进全屏充电页,勿走开机 Logo */
LOG_I("CHG", "usb plug while soft-off → charge UI");
MainTask_Sendmsg(MSG_ID_POWOFF_CHARG, percentage, usb_charging_state, 0);
}
}
}
/* 拔掉充电阈值40迟滞防抖仅状态跳变时执行一次 */
@ -237,19 +253,18 @@ static void app_adc_charge_process(void)
if (usb_charging_state != 0)
{
usb_charging_state = 0;
// 开机场景:发送状态消息
usb_charging_laststate = 0;
if (powon)
{
MainTask_Sendmsg(MSG_ID_CHARG, usb_charging_state, usb_charging_laststate, 0);
MainTask_Sendmsg(MSG_ID_CHARG, usb_charging_state, 1, 0);
}
// 关机场景:直接切断主电源
else
{
/* 通知 UI 熄灭充电页并关主电 */
MainTask_Sendmsg(MSG_ID_POWOFF_CHARG, percentage, 0, 0);
BSP_MainPowerEnable(0);
}
usb_charging_laststate = 0;
}
}
}
@ -271,20 +286,29 @@ static void app_adc_hp_process(void)
/* ==================== ADC1 in6 ==================== */
static void app_adc_volume_map_level(uint16_t val)
{
/* 5 格状态栏音量条0=静音5=最大 */
if (val <= 5) level = 0;
else if (val <= 35) level = 1;
else if (val <= 65) level = 2;
else if (val <= 95) level = 3;
else if (val <= 115) level = 4;
else level = 5;
}
void app_adc_sync_volume(uint16_t val)
{
vol_last = val;
app_adc_volume_map_level(val);
}
static void app_adc_volume_process(void)
{
uint16_t val = ADC_ReadChannel(ADC_CHANNEL_1)>>5;
if(abs((int16_t)vol_last - (int16_t)val) > 2)
{
vol_last = val;
/* 5 格状态栏音量条0=静音5=最大 */
if (val <= 5) level = 0;
else if (val <= 35) level = 1;
else if (val <= 65) level = 2;
else if (val <= 95) level = 3;
else if (val <= 115) level = 4;
else level = 5;
{
app_adc_sync_volume(val);
MainTask_Sendmsg(MSG_ID_EC_VOL, val, level, 0);
}
}

View File

@ -24,4 +24,7 @@ extern bool usb_charging_laststate;
extern uint8_t percentage;
void app_adc_scan_all(void);
void app_adc_in1_scan_part(uint8_t channel);
bool app_adc_usb_is_plugged(void);
/* 开机/主动采样后同步 vol_last 与 level避免扫描任务误触发或跳变 */
void app_adc_sync_volume(uint16_t val);
#endif

View File

@ -14,11 +14,103 @@ static char s_debug_level = 'D';
static char s_cmd_buf[48];
static uint8_t s_cmd_len;
/* RTT 二进制烧录:写到 W25Q128ui0902 或本地曲目) */
static uint8_t s_flash_mode;
static uint32_t s_flash_base;
static uint32_t s_flash_addr;
static uint32_t s_flash_remain;
static uint32_t s_flash_last_sector;
static uint16_t s_flash_page_len;
static uint8_t s_flash_page[256];
static char s_flash_ok_tag[24];
uint8_t app_log_flash_busy(void)
{
return s_flash_mode;
}
static uint32_t app_log_ms(void)
{
return (uint32_t)(rt_tick_get() * 1000U / RT_TICK_PER_SECOND);
}
static void app_log_flash_flush_page(void)
{
uint32_t sector;
char ack[40];
if (s_flash_page_len == 0U) {
return;
}
sector = s_flash_addr & ~0xFFFU;
if (sector != s_flash_last_sector) {
W25Q128_Erase_Sector(sector);
s_flash_last_sector = sector;
}
W25Q128_Write(s_flash_page, s_flash_addr, s_flash_page_len);
s_flash_addr += s_flash_page_len;
s_flash_remain -= s_flash_page_len;
s_flash_page_len = 0U;
/* 每页 ACK避免主机打爆 RTT 下行缓冲 */
snprintf(ack, sizeof(ack), "FLASH_ACK %lu\n", (unsigned long)s_flash_addr);
SEGGER_RTT_WriteString(APP_LOG_RTT_CHANNEL, ack);
}
static void app_log_flash_feed(const uint8_t *data, unsigned len)
{
unsigned i;
for (i = 0; i < len && s_flash_remain > 0U; i++) {
if (s_flash_page_len == 0U && s_flash_addr == s_flash_base && i == 0U) {
SEGGER_RTT_WriteString(APP_LOG_RTT_CHANNEL, "FLASH_RX\n");
}
s_flash_page[s_flash_page_len++] = data[i];
if (s_flash_page_len >= sizeof(s_flash_page) ||
s_flash_page_len >= s_flash_remain) {
app_log_flash_flush_page();
}
}
if (s_flash_remain == 0U && s_flash_mode) {
s_flash_mode = 0U;
SEGGER_RTT_WriteString(APP_LOG_RTT_CHANNEL, s_flash_ok_tag);
UI_DrawModeSelectScreen();
}
}
static void app_log_flash_start_at(uint32_t base, uint32_t size, const char *go_tag, const char *ok_tag)
{
char msg[80];
if (size == 0U || size > (2U * 1024U * 1024U)) {
SEGGER_RTT_WriteString(APP_LOG_RTT_CHANNEL, "FLASH_ERR size\n");
return;
}
s_flash_mode = 1U;
s_flash_base = base;
s_flash_addr = base;
s_flash_remain = size;
s_flash_last_sector = 0xFFFFFFFFUL;
s_flash_page_len = 0U;
s_cmd_len = 0U;
s_cmd_buf[0] = '\0';
strncpy(s_flash_ok_tag, ok_tag, sizeof(s_flash_ok_tag) - 1U);
s_flash_ok_tag[sizeof(s_flash_ok_tag) - 1U] = '\0';
snprintf(msg, sizeof(msg),
"%s base=0x%08lX size=%lu\n",
go_tag, (unsigned long)base, (unsigned long)size);
SEGGER_RTT_WriteString(APP_LOG_RTT_CHANNEL, msg);
}
static void app_log_flash_start(uint32_t size)
{
app_log_flash_start_at(UI0902_RES_BASE, size, "FLASH_UI0902_GO", "FLASH_UI0902_OK\n");
}
static void app_log_slot_store(const char *line)
{
uint16_t idx = s_head;
@ -161,10 +253,174 @@ uint8_t app_log_try_command(const char *cmd)
LOG_I("LOG", "level set %c", s_debug_level);
return 1U;
}
if (strncmp(cmd, "tp status", 9) == 0) {
TP_LogStatus();
return 1U;
}
if (strncmp(cmd, "tp live off", 11) == 0) {
TP_SetLiveMode(0);
return 1U;
}
if (strncmp(cmd, "tp live", 7) == 0) {
TP_SetLiveMode(1);
return 1U;
}
if (strncmp(cmd, "sys reset", 9) == 0) {
app_log_sys_reset();
return 1U;
}
if (strncmp(cmd, "flash ui0902 ", 13) == 0) {
uint32_t size = (uint32_t)strtoul(cmd + 13, NULL, 10);
app_log_flash_start(size);
return 1U;
}
if (strncmp(cmd, "flash haitian ", 14) == 0) {
uint32_t size = (uint32_t)strtoul(cmd + 14, NULL, 10);
app_log_flash_start_at(FLASH_ADDR_SONG_HAITIAN, size,
"FLASH_HAITIAN_GO", "FLASH_HAITIAN_OK\n");
return 1U;
}
if (strncmp(cmd, "tone status", 11) == 0) {
uint8_t hdr[16];
uint8_t name[40];
uint8_t cur_hdr[16];
char *pname;
char line[192];
const char *map;
W25Q128_Read(hdr, FLASH_ADDR_SONG_HAITIAN, 16);
W25Q128_Read(name, FLASH_ADDR_SONG_HAITIAN + 1280 + 4, 32);
name[32] = 0;
W25Q128_Read(cur_hdr, (uint32_t)ADDRESS, 16);
pname = AutoBandTop1_GetPresetName();
if (ADDRESS == EXTFLASH_BIN1_RHYTHM_ADDR)
map = "BIN1_RHYTHM";
else if (ADDRESS == EXTFLASH_BIN2_SONG_HAITIAN_ADDR)
map = "BIN2_SONG_HAITIAN";
else if (ADDRESS == EXTFLASH_BIN3_UNIVERSAL_ADDR)
map = "BIN3_UNIVERSAL";
else
map = "UNKNOWN";
snprintf(line, sizeof(line),
"TONE tab=%u sw=%u addr=0x%08lX map=%s songidx=%u rhyt=%u\n",
(unsigned)mGuiData[GUI_TAB_INDEX].Current,
(unsigned)mGuiData[GUI_AUTOBAND_SW].Current,
(unsigned long)ADDRESS, map,
(unsigned)ParamGuiData[EXPRESS_MODE_PARAM].Current,
(unsigned)ParamGuiData[SONG_MODE_PARAM].Current);
SEGGER_RTT_WriteString(APP_LOG_RTT_CHANNEL, line);
snprintf(line, sizeof(line),
"TONE map BIN1=0x%08lX BIN2=0x%08lX BIN3=0x%08lX\n",
(unsigned long)EXTFLASH_BIN1_RHYTHM_ADDR,
(unsigned long)EXTFLASH_BIN2_SONG_HAITIAN_ADDR,
(unsigned long)EXTFLASH_BIN3_UNIVERSAL_ADDR);
SEGGER_RTT_WriteString(APP_LOG_RTT_CHANNEL, line);
snprintf(line, sizeof(line),
"TONE @ADDRESS magic=%02X%02X%02X%02X cnt=%lu\n",
cur_hdr[0], cur_hdr[1], cur_hdr[2], cur_hdr[3],
(unsigned long)(cur_hdr[12] | (cur_hdr[13] << 8) |
(cur_hdr[14] << 16) | (cur_hdr[15] << 24)));
SEGGER_RTT_WriteString(APP_LOG_RTT_CHANNEL, line);
snprintf(line, sizeof(line),
"TONE @BIN2 magic=%02X%02X%02X%02X max=%lu cnt=%lu name=%.16s\n",
hdr[0], hdr[1], hdr[2], hdr[3],
(unsigned long)(hdr[8] | (hdr[9] << 8) | (hdr[10] << 16) | (hdr[11] << 24)),
(unsigned long)(hdr[12] | (hdr[13] << 8) | (hdr[14] << 16) | (hdr[15] << 24)),
(char *)name);
SEGGER_RTT_WriteString(APP_LOG_RTT_CHANNEL, line);
snprintf(line, sizeof(line),
"TONE loaded name=%s count=%d\n",
pname ? pname : "(null)",
AutoBandTop1_GetPresetItemCount());
SEGGER_RTT_WriteString(APP_LOG_RTT_CHANNEL, line);
return 1U;
}
if (strncmp(cmd, "tone reload", 11) == 0) {
char line[96];
UI_ReloadTonePreset();
snprintf(line, sizeof(line),
"TONE_RELOAD addr=0x%08lX name=%s\n",
(unsigned long)ADDRESS,
AutoBandTop1_GetPresetName() ? AutoBandTop1_GetPresetName() : "(null)");
SEGGER_RTT_WriteString(APP_LOG_RTT_CHANNEL, line);
return 1U;
}
if (strncmp(cmd, "tone local", 10) == 0) {
char line[128];
int ret;
mGuiData[GUI_TAB_INDEX].Current = 1; /* 专业 */
mGuiData[GUI_AUTOBAND_SW].Current = 1; /* 本地曲目 */
ParamGuiData[EXPRESS_MODE_PARAM].Current = 0;
UI_ApplyToneAddress();
AutoBandTop1_Stop();
StartFlag = 0;
ret = AutoBandTop1_LoadPresetItemFromFlash(0);
snprintf(line, sizeof(line),
"TONE_LOCAL ret=%d addr=0x%08lX map=BIN2@0x%08lX name=%s count=%d %s\n",
ret, (unsigned long)ADDRESS,
(unsigned long)EXTFLASH_BIN2_SONG_HAITIAN_ADDR,
AutoBandTop1_GetPresetName() ? AutoBandTop1_GetPresetName() : "(null)",
AutoBandTop1_GetPresetItemCount(),
(ADDRESS == EXTFLASH_BIN2_SONG_HAITIAN_ADDR) ? "OK" : "MISMATCH");
SEGGER_RTT_WriteString(APP_LOG_RTT_CHANNEL, line);
return 1U;
}
if (strncmp(cmd, "tone pick", 9) == 0) {
/* 模拟专业+本地曲目拨片(无和弦板) */
mGuiData[GUI_TAB_INDEX].Current = 1;
mGuiData[GUI_AUTOBAND_SW].Current = 1;
KEY_ID_1629 = 0; /* 走默认和弦兜底 */
StartFlag = 0;
Pick_Handle();
SEGGER_RTT_WriteString(APP_LOG_RTT_CHANNEL, "TONE_PICK_DONE\n");
return 1U;
}
if (strncmp(cmd, "flash erase chip", 16) == 0) {
SEGGER_RTT_WriteString(APP_LOG_RTT_CHANNEL, "FLASH_ERASE_BEGIN\n");
LOG_I("FLASH", "W25Q128 chip erase start");
W25Q128_Erase_Chip();
LOG_I("FLASH", "W25Q128 chip erase done");
SEGGER_RTT_WriteString(APP_LOG_RTT_CHANNEL, "FLASH_ERASE_OK\n");
return 1U;
}
if (strncmp(cmd, "ui boot", 7) == 0) {
LCD_BLK_Set();
LCD_WR_PIC_FROM_FLASH(0, 0, UI0902_BOOT_LOGO_W, UI0902_BOOT_LOGO_H,
UI0902_BOOT_LOGO_ADDR);
SEGGER_RTT_WriteString(APP_LOG_RTT_CHANNEL, "UI_BOOT_OK\n");
return 1U;
}
if (strncmp(cmd, "ui charge", 9) == 0) {
uint8_t peek[4];
LCD_BLK_Set();
LCD_FillByColor(0, 0, 240, 320, UI0902_BG_COLOR);
W25Q128_Read(peek, UI0902_CHARGE_SCREEN_ADDR, 4);
if (peek[0] != 0xFF || peek[1] != 0xFF) {
LCD_WR_PIC_FROM_FLASH(0, 0, UI0902_CHARGE_SCREEN_W, UI0902_CHARGE_SCREEN_H,
UI0902_CHARGE_SCREEN_ADDR);
SEGGER_RTT_WriteString(APP_LOG_RTT_CHANNEL, "UI_CHARGE_OK\n");
} else {
Draw_Charging_Icon(120, 150, 2, 0x3D7F);
SEGGER_RTT_WriteString(APP_LOG_RTT_CHANNEL, "UI_CHARGE_EMPTY\n");
}
{
const char *s = "50";
uint16_t tw = g_ChargePctPercent.w;
uint16_t x, y = 266;
uint8_t i;
for (i = 0; s[i]; i++)
tw = (uint16_t)(tw + g_ChargePctDigits[s[i] - '0'].w);
LCD_FillByColor(40, 262, 200, 290, UI0902_BG_COLOR);
x = (uint16_t)((240 - tw) / 2);
for (i = 0; s[i]; i++) {
const ChargePctGlyph *g = &g_ChargePctDigits[s[i] - '0'];
LCD_WR_PIC_Trans(x, y, g->w, g->h, g->data, BLACK);
x = (uint16_t)(x + g->w);
}
LCD_WR_PIC_Trans(x, y, g_ChargePctPercent.w, g_ChargePctPercent.h,
g_ChargePctPercent.data, BLACK);
}
return 1U;
}
return 0U;
}
@ -195,7 +451,7 @@ static void app_log_feed_char(char c)
void app_log_poll(void)
{
char rx[16];
uint8_t rx[64];
unsigned read_len;
unsigned i;
@ -204,8 +460,13 @@ void app_log_poll(void)
return;
}
if (s_flash_mode) {
app_log_flash_feed(rx, read_len);
return;
}
for (i = 0; i < read_len; i++) {
app_log_feed_char(rx[i]);
app_log_feed_char((char)rx[i]);
}
}
@ -222,5 +483,6 @@ void app_log_write(char level, const char *cat, const char *fmt, ...) { (void)le
void app_log_poll(void) {}
uint8_t app_log_try_command(const char *cmd) { (void)cmd; return 0U; }
void app_log_set_ui_page(const char *name) { (void)name; }
uint8_t app_log_flash_busy(void) { return 0U; }
#endif /* APP_LOG_ENABLE */

View File

@ -34,6 +34,7 @@ void app_log_write(char level, const char *cat, const char *fmt, ...);
void app_log_poll(void);
uint8_t app_log_try_command(const char *cmd);
void app_log_set_ui_page(const char *name);
uint8_t app_log_flash_busy(void);
#if APP_LOG_ENABLE
@ -53,6 +54,9 @@ void app_log_set_ui_page(const char *name);
#define LOG_TP(fmt, ...) ((void)0)
#endif
/* 触摸按下:始终 INFO便于 log dump 排查硬件/坐标 */
#define LOG_TPI(fmt, ...) LOG_I("TP", fmt, ##__VA_ARGS__)
#else
#define LOG_I(cat, fmt, ...) ((void)0)
@ -60,6 +64,7 @@ void app_log_set_ui_page(const char *name);
#define LOG_E(cat, fmt, ...) ((void)0)
#define LOG_D(cat, fmt, ...) ((void)0)
#define LOG_TP(fmt, ...) ((void)0)
#define LOG_TPI(fmt, ...) ((void)0)
#endif

View File

@ -24,6 +24,7 @@ static uint8_t long_press_fired = 0;
static uint8_t click_sent = 0;
static uint16_t last_slide_x = 0;
static uint16_t last_slide_y = 0;
static uint32_t suppress_until = 0;
static inline uint16_t abs_diff(int16_t a, int16_t b)
{
@ -41,6 +42,14 @@ void app_touch_reset(void)
last_slide_x = last_slide_y = 0;
}
void app_touch_suppress(uint32_t ms)
{
uint32_t now = rt_tick_get();
uint32_t ticks = (ms * RT_TICK_PER_SECOND + 999U) / 1000U;
suppress_until = now + ticks;
app_touch_reset();
}
app_touch_result_t app_touch_process(uint16_t x, uint16_t y, uint8_t pressed)
{
app_touch_result_t r;
@ -50,16 +59,28 @@ app_touch_result_t app_touch_process(uint16_t x, uint16_t y, uint8_t pressed)
uint32_t now = rt_tick_get();
/* 切页抑制窗口内丢弃按下,避免误触底栏设置 */
if ((int32_t)(now - suppress_until) < 0) {
if (!pressed) {
app_touch_reset();
}
return r;
}
if (!pressed) {
if (!long_press_fired && !click_sent &&
(touch_state == TOUCH_PRESS_WAIT_STABLE ||
touch_state == TOUCH_PRESS_STABLE))
touch_state == TOUCH_PRESS_STABLE ||
touch_state == TOUCH_SLIDING))
{
r.gesture = GESTURE_RELEASE;
r.x = down_x;
r.y = down_y;
LOG_D("TP", "release x=%u y=%u", (unsigned)down_x, (unsigned)down_y);
MainTask_Sendmsg(MSG_ID_TOUCH, 1, down_x, down_y);
/* 导航页:抬起时发一次点击(坐标更稳,避免按下瞬间误触底栏) */
if (CurrUIProcress != UI_Mixer_Process) {
r.gesture = GESTURE_RELEASE;
r.x = down_x;
r.y = down_y;
LOG_TPI("release x=%u y=%u -> MSG", (unsigned)down_x, (unsigned)down_y);
MainTask_Sendmsg(MSG_ID_TOUCH, 1, down_x, down_y);
}
}
touch_state = TOUCH_IDLE;
down_x = down_y = 0;
@ -80,17 +101,24 @@ app_touch_result_t app_touch_process(uint16_t x, uint16_t y, uint8_t pressed)
click_sent = 0;
repeat_tick = 0;
touch_state = TOUCH_PRESS_WAIT_STABLE;
/* ??????????????????????? */
click_sent = 1;
LOG_D("TP", "press down x=%u y=%u", (unsigned)down_x, (unsigned)down_y);
MainTask_Sendmsg(MSG_ID_TOUCH, 1, down_x, down_y);
/* Mixer 推子:按下即报;其它页等抬起再报,防止进页后残留按下误触设置 */
if (CurrUIProcress == UI_Mixer_Process) {
click_sent = 1;
LOG_TPI("press x=%u y=%u -> MSG", (unsigned)down_x, (unsigned)down_y);
MainTask_Sendmsg(MSG_ID_TOUCH, 1, down_x, down_y);
} else {
LOG_TPI("press down x=%u y=%u (wait release)", (unsigned)down_x, (unsigned)down_y);
}
break;
case TOUCH_PRESS_WAIT_STABLE:
if ((now - touch_tick) >= TOUCH_STABLE_TIME) {
if (abs_diff(x, down_x) < 24 && abs_diff(y, down_y) < 24)
if (abs_diff(x, down_x) < 24 && abs_diff(y, down_y) < 24) {
/* 用稳定后的坐标替换首采样噪声 */
down_x = x;
down_y = y;
touch_state = TOUCH_PRESS_STABLE;
else {
} else {
down_x = x;
down_y = y;
touch_tick = now;
@ -103,7 +131,7 @@ app_touch_result_t app_touch_process(uint16_t x, uint16_t y, uint8_t pressed)
long_press_fired = 1;
repeat_tick = now;
r.gesture = GESTURE_LONG_PRESS;
LOG_D("TP", "long_press x=%u y=%u", (unsigned)down_x, (unsigned)down_y);
LOG_TPI("long_press x=%u y=%u", (unsigned)down_x, (unsigned)down_y);
MainTask_Sendmsg(MSG_ID_TOUCH_LONG_REPEAT, 1, down_x, down_y);
return r;
}
@ -122,11 +150,14 @@ app_touch_result_t app_touch_process(uint16_t x, uint16_t y, uint8_t pressed)
break;
case TOUCH_SLIDING:
if (abs_diff(x, last_slide_x) >= TOUCH_SLIDE_STEP ||
abs_diff(y, last_slide_y) >= TOUCH_SLIDE_STEP) {
/* 仅 Mixer 需要拖动连续坐标;其它页拖动会误触底栏设置 Tab */
if (CurrUIProcress == UI_Mixer_Process &&
(abs_diff(x, last_slide_x) >= TOUCH_SLIDE_STEP ||
abs_diff(y, last_slide_y) >= TOUCH_SLIDE_STEP)) {
r.gesture = GESTURE_DRAG;
r.down_x = last_slide_x;
r.down_y = last_slide_y;
LOG_TPI("drag x=%u y=%u", (unsigned)x, (unsigned)y);
MainTask_Sendmsg(MSG_ID_TOUCH, 1, x, y);
last_slide_x = x;
last_slide_y = y;

View File

@ -25,6 +25,9 @@ typedef struct {
/* 重置状态机(页面切换/开机时可选调用) */
void app_touch_reset(void);
/* 切页后短暂忽略触摸,避免手指未抬起/ADC 抖动误触底栏设置 Tab */
void app_touch_suppress(uint32_t ms);
/* 核心:喂一个采样点,产出手势。
* touch_task 20ms
* gesture GESTURE_NONE */

View File

@ -12,7 +12,7 @@ const char CHS8Table[][2] = {
{0xD2,0xF4}, // 音 9
{0xC9,0xAB}, // 色 10
{0xD1,0xA1}, // 选 6
{0xD2,0xE9}, // 择 7
{0xD4,0xF1}, // 择 7
{0xB8,0xE8}, // 歌 17
{0xC7,0xFA}, // 曲 18
{0xD7,0xD4}, // 自 19
@ -66,7 +66,7 @@ const char CHS11Table[][2] = {
{0xD2,0xF4}, // 音
{0xC9,0xAB}, // 色
{0xD1,0xA1}, // 选
{0xD2,0xE9}, // 择
{0xD4,0xF1}, // 择
{0xB8,0xE8}, // 歌
{0xC7,0xFA}, // 曲
{0xD7,0xD4}, // 自
@ -121,7 +121,7 @@ const char CHS12Table[][2] = {
{0xD2,0xF4}, // 音 9
{0xC9,0xAB}, // 色 10
{0xD1,0xA1}, // 选 6
{0xD2,0xE9}, // 择 7
{0xD4,0xF1}, // 择 7
{0xB8,0xE8}, // 歌 17
{0xC7,0xFA}, // 曲 18
{0xD7,0xD4}, // 自 19
@ -174,12 +174,12 @@ const char CHS13Table[][2] = {
{0xC4,0xA3}, // 模 4
{0xCA,0xBD}, // 式 5
{0xD1,0xA1}, // 选 6
{0xD2,0xE9}, // 择 7
{0xD4,0xF1}, // 择 7
{0xCF,0xD2}, // 弦 8
{0xD2,0xF4}, // 音 9
{0xC9,0xAB}, // 色 10
{0xD1,0xA1}, // 选 11
{0xD2,0xE9}, // 择 12
{0xD4,0xF1}, // 择 12
{0xD1,0xDD}, // 演 13
{0xD7,0xE0}, // 奏 14
{0xB6,0xCE}, // 段 15
@ -361,12 +361,12 @@ const char CHS15Table[][2] = {
{0xC4,0xA3}, // 模 4
{0xCA,0xBD}, // 式 5
{0xD1,0xA1}, // 选 6
{0xD2,0xE9}, // 择 7
{0xD4,0xF1}, // 择 7
{0xCF,0xD2}, // 弦 8
{0xD2,0xF4}, // 音 9
{0xC9,0xAB}, // 色 10
{0xD1,0xA1}, // 选 11
{0xD2,0xE9}, // 择 12
{0xD4,0xF1}, // 择 12
{0xD1,0xDD}, // 演 13
{0xD7,0xE0}, // 奏 14
{0xB6,0xCE}, // 段 15
@ -547,12 +547,12 @@ const char CHS16Table[][2] = {
{0xC4,0xA3}, // 模 4
{0xCA,0xBD}, // 式 5
{0xD1,0xA1}, // 选 6
{0xD2,0xE9}, // 择 7
{0xD4,0xF1}, // 择 7
{0xCF,0xD2}, // 弦 8
{0xD2,0xF4}, // 音 9
{0xC9,0xAB}, // 色 10
{0xD1,0xA1}, // 选 11
{0xD2,0xE9}, // 择 12
{0xD4,0xF1}, // 择 12
{0xD1,0xDD}, // 演 13
{0xD7,0xE0}, // 奏 14
{0xB6,0xCE}, // 段 15

View File

@ -320,6 +320,7 @@
<state>$PROJ_DIR$\..\..\device\W25Q128</state>
<state>$PROJ_DIR$\..\..\device\LCD_ILI9341</state>
<state>$PROJ_DIR$\..\..\device\TM1617</state>
<state>$PROJ_DIR$\..\..\..\project\inc</state>
</option>
<option>
<name>CCStdIncCheck</name>

View File

@ -35,6 +35,7 @@
#include "includes.h"
#include "W25Q128.h"
#include "Drv_TM1617_RGB.h"
#include "UI0902_Res_Addr.h"
/* private includes ----------------------------------------------------------*/
/* add user code begin private includes */
@ -84,7 +85,7 @@ void JumpToApplication(void);
uint8_t TM1617KeyValue = 0;
static uint32_t PowerKeyCount = 0;
static uint8_t long_press_locked = 0; // 长按锁定,防止一直触发
static uint8_t long_press_locked = 0; // ???????????????????
/* add user code end 0 */
flag_status BSP_GetPowerKey (void)
@ -130,15 +131,15 @@ int main(void)
TM1617_GPIO_Init();
/* 短暂等待总线稳定;默认跳转 App。
* KEY_MAIN_A USB
* KEY_NULL App Boot */
/* ????????????????????? App??
* ???????????? KEY_MAIN_A ????? USB ????????
* ??????????? KEY_NULL ???? App????λ??????????????? Boot ?????? */
wk_delay_ms(50);
TM1617KeyValue = TM1617_ScanFkey();
if (TM1617KeyValue != KEY_MAIN_A)
{
JumpToApplication();
/* 若 App 向量无效则继续走升级模式 */
/* ?? App ??????Ч????????????? */
}
/* init spi1 function. */
@ -161,8 +162,24 @@ int main(void)
LCD_Init();
wk_delay_ms(10);
/* USER CODE BEGIN 2 */
LCD_BLK_Set();
LCD_ShowChinese_AutoAlign(0, 240,150 ,(uint8_t*)"\xC9\xFD\xBC\xB6\xC4\xA3\xCA\xBD\x00",LCD_ALIGN_CENTER, RED, WHITE, 0, 24);
LCD_BLK_Set();
/* 烧录模式全屏图UI0902_FLASH_MODE @ 外置 Flash未烧资源时黑底兜底 */
{
uint8_t peek[4];
W25Q128_Read(peek, UI0902_FLASH_MODE_ADDR, 4);
if (!(peek[0] == 0xFF && peek[1] == 0xFF && peek[2] == 0xFF && peek[3] == 0xFF))
{
LCD_WR_PIC_FROM_FLASH(0, 0, UI0902_FLASH_MODE_W, UI0902_FLASH_MODE_H,
UI0902_FLASH_MODE_ADDR);
}
else
{
LCD_FillByColor(0, 0, 240, 320, BLACK);
LCD_ShowChinese_AutoAlign(0, 240, 150,
(uint8_t *)"\xC9\xD5\xC2\xBC\xC4\xA3\xCA\xBD\x00",
LCD_ALIGN_CENTER, WHITE, BLACK, 0, 24);
}
}
/* add user code end 2 */
@ -173,7 +190,7 @@ int main(void)
/* add user code begin 3 */
if(BSP_GetPowerKey() == 0)
{
// 按键按下
// ????????
if (PowerKeyCount < 200 && long_press_locked == 0)
{
PowerKeyCount++;
@ -247,10 +264,10 @@ void JumpToApplication(void)
if (((*(__IO uint32_t*)FIRMWARE_START_ADDR) & 0x2FFE0000 ) == 0x20000000)
{
/* 跳转到用户应用代码区 */
/* ???????????????? */
JumpAddress = *(__IO uint32_t*) (FIRMWARE_START_ADDR + 4);
Jump_To_Application = (pFunction) JumpAddress;
/* 初始化用户应用程序的堆栈指针 */
/* ??????????ó????????? */
__set_MSP(*(__IO uint32_t*) FIRMWARE_START_ADDR);
SCB->VTOR = FIRMWARE_START_ADDR;
Jump_To_Application();

View File

@ -25,67 +25,83 @@ GUI_SWITCH mGuiData[] = {
};
GUI_SWITCH ParamGuiData[] =
{
{ 0, 0, 30, SONG_MODE_PARAM}, // 0
{ 0, 0, 30, EXPRESS_MODE_PARAM}, // 1
{ 0, 0, 30, SONG_MODE_PARAM}, // 0 节奏类型1.bin约 31 首)
{ 0, 0, 0, EXPRESS_MODE_PARAM}, // 1 本地曲目2.binMax 由 UI_ReloadTonePreset←LOCAL_SONG_COUNT
{ 0, 0, 2, ALL_MODE_PARAM}, // 2
};
const LEBEL_UI UI_Label[] = {
{5, 115, 30, 60, (const uint8_t*)"\xD2\xC6\xB5\xF7", LCD_ALIGN_CENTER, WHITE,BLACK,11, LCD_ALIGN_CENTER,WHITE,BLACK,16, GUI_TRANSPOSE},
{125,110, 30, 60, (const uint8_t*)"\xCB\xD9\xB6\xC8", LCD_ALIGN_CENTER, WHITE,BLACK,11, LCD_ALIGN_CENTER,WHITE,BLACK,16, GUI_SPEED},
{5, 230, 95, 55, (const uint8_t*)"\xB8\xE8\xC7\xFA\xD1\xA1\xD2\xE9", LCD_ALIGN_LEFT,WHITE,BLACK,11,LCD_ALIGN_CENTER,WHITE,BLACK,13,GUI_MODE_PARAM},
{5, 230, 155,55, (const uint8_t*)"\xCF\xD2\xD2\xF4\xC9\xAB\xD1\xA1\xD2\xE9",LCD_ALIGN_LEFT,WHITE,BLACK,11,LCD_ALIGN_CENTER,WHITE,BLACK,13,GUI_TIMBRE_SELECT},
{5, 230, 210,55, (const uint8_t*)"\xD1\xDD\xD7\xE0\xB6\xCE\xC2\xE4",LCD_ALIGN_LEFT,WHITE,BLACK,11,LCD_ALIGN_CENTER,WHITE,BLACK,13,GUI_PLAY_SECTION},
};
/* 0819移调/速度 标签11、主值16 */
{UI0902_MARGIN_X, UI0902_CARD_W, UI0902_CARD_Y, UI0902_CARD_H,
(const uint8_t*)"\xD2\xC6\xB5\xF7", LCD_ALIGN_CENTER, WHITE,BLACK,UI0902_FONT_LABEL,
LCD_ALIGN_CENTER,WHITE,BLACK,UI0902_FONT_HERO, GUI_TRANSPOSE},
{UI0902_MARGIN_X + UI0902_CARD_W + UI0902_CARD_GAP, UI0902_CARD_W, UI0902_CARD_Y, UI0902_CARD_H,
(const uint8_t*)"\xCB\xD9\xB6\xC8", LCD_ALIGN_CENTER, WHITE,BLACK,UI0902_FONT_LABEL,
LCD_ALIGN_CENTER,WHITE,BLACK,UI0902_FONT_HERO, GUI_SPEED},
/* 0819TAB/行标题11、曲目正文13 */
{UI0902_MARGIN_X, UI0902_CONTENT_W, UI0902_MODE_Y, UI0902_MODE_H,
(const uint8_t*)"\xB8\xE8\xC7\xFA\xD1\xA1\xD4\xF1", LCD_ALIGN_LEFT,WHITE,BLACK,UI0902_FONT_LABEL,
LCD_ALIGN_CENTER,WHITE,BLACK,UI0902_FONT_BODY,GUI_MODE_PARAM},
{UI0902_MARGIN_X, UI0902_CONTENT_W, UI0902_TIMBRE_Y, UI0902_TIMBRE_H,
(const uint8_t*)"\xCF\xD2\xD2\xF4\xC9\xAB\xD1\xA1\xD4\xF1",LCD_ALIGN_LEFT,WHITE,BLACK,UI0902_FONT_LABEL,
LCD_ALIGN_CENTER,WHITE,BLACK,UI0902_FONT_BODY,GUI_TIMBRE_SELECT},
/* 0819演奏段落 字号13 */
{UI0902_MARGIN_X, UI0902_CONTENT_W, UI0902_SECTION_Y, UI0902_SECTION_H,
(const uint8_t*)"\xD1\xDD\xD7\xE0\xB6\xCE\xC2\xE4",LCD_ALIGN_LEFT,WHITE,BLACK,UI0902_FONT_BODY,
LCD_ALIGN_CENTER,WHITE,BLACK,UI0902_FONT_BODY,GUI_PLAY_SECTION},
};
// 4<><34><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>֣<EFBFBD>
/* 0904 / 0902-06左→右 伴奏|弦|麦|麦混响轨宽31 顶≈58 */
Fader_t faders[4] = {
{ 40-10, 60, 30, 200, 7, 0, 0, "\xB0\xE9\xD7\xE0" }, // 0: <20><><EFBFBD><EFBFBD>(MIX)
{ 95-10, 60, 30, 200, 7, 1, 0, "\xCF\xD2" }, // 1: <20><>(STR)
{ 150-10, 60, 30, 200, 7, 2, 0, "\xC2\xF3" }, // 2: <20><>(MIC)
{ 205-10, 60, 30, 200, 7, 3, 0, "\xC2\xF3\xBB\xEC\xCF\xEC" } // 3: <20><><EFBFBD><EFBFBD><EFBFBD>(REV)
{ 27, 58, 31, 215, 7, 0, 0, "\xB0\xE9\xD7\xE0" }, /* 0: 伴奏 */
{ 78, 58, 31, 215, 7, 1, 0, "\xCF\xD2" }, /* 1: 弦 */
{ 130, 58, 31, 215, 7, 2, 0, "\xC2\xF3" }, /* 2: 麦 */
{ 182, 58, 31, 215, 7, 3, 0, "\xC2\xF3\xBB\xEC\xCF\xEC" } /* 3: 麦混响 */
};
const Touch_AreaTypeDef Touch_Areas[] =
{
/* Xmin,Xmax,Ymin,Ymax, Flag, Value, ID, action — 坐标相对 240x320 */
{ 0, 60, 25, 95, -1, 0, GUI_TRANSPOSE, NULL },
{ 60, 120, 25, 95, 1, 0, GUI_TRANSPOSE, NULL },
/* Xmin,Xmax,Ymin,Ymax, Flag, Value, ID, action — 与 UI_Label 网格同步 */
{ 12, 64, UI0902_CARD_Y, UI0902_CARD_Y + UI0902_CARD_H - 1, -1, 0, GUI_TRANSPOSE, NULL },
{ 65, 116, UI0902_CARD_Y, UI0902_CARD_Y + UI0902_CARD_H - 1, 1, 0, GUI_TRANSPOSE, NULL },
{ 125, 180, 25, 95, -1, 0, GUI_SPEED, NULL },
{ 180, 239, 25, 95, 1, 0, GUI_SPEED, NULL },
{ 125, 176, UI0902_CARD_Y, UI0902_CARD_Y + UI0902_CARD_H - 1, -1, 0, GUI_SPEED, NULL },
{ 177, 228, UI0902_CARD_Y, UI0902_CARD_Y + UI0902_CARD_H - 1, 1, 0, GUI_SPEED, NULL },
{ 0, 85, 95, 130, 0, 0, GUI_AUTOBAND_SW, NULL },
{ 90, 175, 95, 130, 0, 1, GUI_AUTOBAND_SW, NULL },
/* 节奏类型 / 本地曲目 TAB090212-66 / 72-127 */
{ 12, 66, UI0902_MODE_Y, UI0902_MODE_Y + UI0902_TAB_H - 1, 0, 0, GUI_AUTOBAND_SW, NULL },
{ 72, 127, UI0902_MODE_Y, UI0902_MODE_Y + UI0902_TAB_H - 1, 0, 1, GUI_AUTOBAND_SW, NULL },
{ 0, 120, 130, 165, -1, 0, GUI_MODE_PARAM, NULL },
{ 120, 239, 130, 165, 1, 0, GUI_MODE_PARAM, NULL },
{ 13, 120, UI0902_MODE_Y + UI0902_TAB_H + 4, UI0902_MODE_Y + UI0902_MODE_H - 1, -1, 0, GUI_MODE_PARAM, NULL },
{ 121, 227, UI0902_MODE_Y + UI0902_TAB_H + 4, UI0902_MODE_Y + UI0902_MODE_H - 1, 1, 0, GUI_MODE_PARAM, NULL },
{ 0, 120, 165, 215, -1, 0, GUI_TIMBRE_SELECT, NULL },
{ 120, 239, 165, 215, 1, 0, GUI_TIMBRE_SELECT, NULL },
{ 13, 120, UI0902_TIMBRE_Y, UI0902_TIMBRE_Y + UI0902_TIMBRE_H - 1, -1, 0, GUI_TIMBRE_SELECT, NULL },
{ 121, 227, UI0902_TIMBRE_Y, UI0902_TIMBRE_Y + UI0902_TIMBRE_H - 1, 1, 0, GUI_TIMBRE_SELECT, NULL },
/* 演奏段落 1~4 */
{ 10, 60, 220, 270, 0, 0, GUI_PLAY_SECTION, NULL },
{ 60, 110, 220, 270, 0, 1, GUI_PLAY_SECTION, NULL },
{ 110, 165, 220, 270, 0, 2, GUI_PLAY_SECTION, NULL },
{ 165, 220, 220, 270, 0, 3, GUI_PLAY_SECTION, NULL },
/* 演奏段落 1~40902-0412/69/125/182宽 47步进 57 */
{ 12, 58, UI0902_SECTION_Y, UI0902_SECTION_Y + UI0902_SECTION_BTN_H - 1, 0, 0, GUI_PLAY_SECTION, NULL },
{ 69, 115, UI0902_SECTION_Y, UI0902_SECTION_Y + UI0902_SECTION_BTN_H - 1, 0, 1, GUI_PLAY_SECTION, NULL },
{ 126, 172, UI0902_SECTION_Y, UI0902_SECTION_Y + UI0902_SECTION_BTN_H - 1, 0, 2, GUI_PLAY_SECTION, NULL },
{ 183, 229, UI0902_SECTION_Y, UI0902_SECTION_Y + UI0902_SECTION_BTN_H - 1, 0, 3, GUI_PLAY_SECTION, NULL },
/* 底栏 TAB万能/普通/专业/设置Value=目标 TAB */
{ 0, 60, 275, 319, 0, 0, GUI_TAB_INDEX, NULL },
{ 60, 120, 275, 319, 0, 2, GUI_TAB_INDEX, NULL },
{ 120, 180, 275, 319, 0, 1, GUI_TAB_INDEX, NULL },
{ 180, 239, 275, 319, 0, 3, GUI_TAB_INDEX, NULL },
/* 底栏四键:万能 | 普通 | 专业 | 设置(触区中线对齐 cx 40/100/160/210 */
{ 0, 69, 280, 319, 0, UI0902_NAV_UNIVERSAL, GUI_NAV_BAR, NULL },
{ 70, 129, 280, 319, 0, UI0902_NAV_NORMAL, GUI_NAV_BAR, NULL },
{ 130, 184, 280, 319, 0, UI0902_NAV_EXPERT, GUI_NAV_BAR, NULL },
{ 185, 239, 280, 319, 0, UI0902_NAV_SETTING, GUI_NAV_BAR, NULL },
};
int16_t MIC_VOL_MAP[10]= {-9000,-7000,-5000,-3000,-1000,1000,3000,5000,7000,9000};
/* 推子 0~10 共 11 档档10 取 AW816 上限附近 */
int16_t MIC_VOL_MAP[11]= {-9000,-7000,-5000,-3000,-1000,1000,3000,5000,7000,9000,1200};
uint8_t TOUCH_AREA_NUM = (sizeof(Touch_Areas)/sizeof(Touch_AreaTypeDef));
const uint8_t Version[3] = {0,1,11};
const uint8_t Version[3] = {0,2,3}; /* major.minor.patch — 0.2.3: local song HKTK load/play + tone addr logs */
uint8_t Led = 8;
bool PressFlag = 0;
@ -164,21 +180,23 @@ bool powon = false;
void System_PowerOn(void)
{
LOG_I("PWR", "power_on begin");
/* 控制电源硬件 */
/* 控制电源硬件;蓝牙按 NVM/系统设置开关恢复,勿强制常开 */
BSP_MainPowerEnable(1);
BSP_DreamCorePowerEnable(1);
BSP_HT7178PowerEnable(1);
BSP_BlueToothPowerEnable(1);
BSP_BlueToothPowerEnable((uint8_t)(mGuiData[GUI_BL_SW].Current ? 1 : 0));
powon = true; /* 更新开机标志 */
/* 先通知 UI 亮屏,避免外设初始化阻塞导致长时间黑屏 */
LOG_I("PWR", "send POWER_ON");
MainTask_Sendmsg(MSG_ID_POWER_ON, 0, 0, 0);
AD85020B_Init();
TM1629D_Key_LED_Init();
app_tm1617_init();
XPT2046_Init();
App_Auto_Init();
LOG_I("PWR", "periph ready send POWER_ON");
/* 通知 UI 层画开机界面 */
MainTask_Sendmsg(MSG_ID_POWER_ON,0,0,0);
LOG_I("PWR", "periph ready");
}
static void PowerOn(void)
@ -193,7 +211,16 @@ static void PowerOff(void)
LOG_I("PWR", "power_off begin");
powon = false; /* 更新关机标志 */
StopFullTask();
/* 关机前把当前调音台推子与蓝牙开关写入 NVM保证再次开机保持 */
{
NvmParam_Type *nvm = drv_nvm_param_ptr();
nvm->param.BandVol = faders[0].val;
nvm->param.StringVol = faders[1].val;
nvm->param.MIcVol = faders[2].val;
nvm->param.MicRev = faders[3].val;
nvm->param.BluetoothSW = (uint8_t)(mGuiData[GUI_BL_SW].Current ? 1 : 0);
}
nvm_ret = drv_nvm_save_to_flash();
LOG_I("PWR", "nvm_save=%u", (unsigned)nvm_ret);
@ -203,15 +230,33 @@ static void PowerOff(void)
app_tm1629_all_off();
app_tm1617_off();
/* 关闭电源硬件 */
/* 关闭电源硬件MCU 保持运行以便长按开机 / 关机充电画面 */
BSP_MainPowerEnable(0);
BSP_DreamCorePowerEnable(0);
BSP_HT7178PowerEnable(0);
BSP_BlueToothPowerEnable(0);
LOG_I("PWR", "reset");
__disable_irq();
nvic_system_reset();
//MainTask_Sendmsg(MSG_ID_POWER_OFF,0,0,0);
CurrUIProcress = IdleProcess;
MainTask_Sendmsg(MSG_ID_POWER_OFF, 0, 0, 0);
LOG_I("PWR", "power_off done (soft-off, no reset)");
/* 关机时若已插着 Type-C立刻进充电画面 */
{
uint8_t i;
for (i = 0; i < 4; i++)
{
app_adc_in1_scan_part(4);
if (usb_charging_state || app_adc_usb_is_plugged())
break;
rt_thread_mdelay(5);
}
if (usb_charging_state || app_adc_usb_is_plugged())
{
usb_charging_state = 1;
usb_charging_laststate = 1;
LOG_I("PWR", "soft-off with USB → charge UI");
MainTask_Sendmsg(MSG_ID_POWOFF_CHARG, percentage, 1, 0);
}
}
}
void Power_Key_Scan()
@ -220,13 +265,32 @@ void Power_Key_Scan()
uint32_t now = rt_tick_get();
uint32_t holdtick = 0;
/* 复位/烧录后自动开机一次,避免黑屏干等长按;正常关机后下电再上电仍走此路径 */
/* 复位/烧录后:无 USB 则自动开机一次;有 Type-C 则进关机充电画面(勿进 Logo */
if (powon == false && pwr_key_state == KEY_STATE_IDLE && pwr_press_tick == 0)
{
static uint8_t s_auto_poweron_pending = 1;
if (s_auto_poweron_pending)
{
uint8_t i;
s_auto_poweron_pending = 0;
/* 多采几次 USB 检测,避免上电瞬间误判 */
for (i = 0; i < 8; i++)
{
app_adc_in1_scan_part(4);
if (usb_charging_state || app_adc_usb_is_plugged())
break;
rt_thread_mdelay(5);
}
if (usb_charging_state || app_adc_usb_is_plugged())
{
usb_charging_state = 1;
usb_charging_laststate = 1;
LOG_I("PWR", "boot with USB → charge UI (no logo)");
CurrUIProcress = IdleProcess;
MainTask_Sendmsg(MSG_ID_POWOFF_CHARG, percentage, 1, 0);
pwr_key_state = KEY_STATE_NONE;
return;
}
LOG_I("PWR", "auto power_on");
PowerOn();
pwr_key_state = KEY_STATE_NONE; /* 忽略开机瞬间可能残留的按键电平 */
@ -287,8 +351,7 @@ void Power_Key_Scan()
void (*CurrUIProcress)(DisplayTaskMessage_Type xEvent);
/* UI 公共全局变量 */
//volatile uint32_t ADDRESS = 0x0001b8F0;
volatile uint32_t ADDRESS = 0x00000000;
volatile uint32_t ADDRESS = FLASH_ADDR_MODE_UNIVERSAL;
uint8_t KEY_ID_1629 = 0;
bool StartFlag = false;
bool InModeFlag = false;
@ -297,10 +360,40 @@ uint8_t key_toggle[4] = {0};
* UI
* ============================================================ */
/* 自动关机计时复位(简单实现:无操作,占位) */
/* 自动关机:有操作时复位秒计数;主循环每秒递减,到 0 关机 */
void ResetAutoPowerCount(void)
{
/* AutoPower 计时复位逻辑暂未实现 */
if (!AutoCloseFlag || AutoCloseTime == 0)
return;
mAutoPowerOffCount = (uint16_t)(AutoCloseTime * 60);
}
void AutoPowerOff_Scan(void)
{
static uint32_t s_last_sec_tick = 0;
uint32_t now;
if (!powon || !AutoCloseFlag || AutoCloseTime == 0)
return;
now = rt_tick_get();
if (s_last_sec_tick == 0)
{
s_last_sec_tick = now;
return;
}
if ((now - s_last_sec_tick) < RT_TICK_PER_SECOND)
return;
s_last_sec_tick = now;
if (mAutoPowerOffCount > 0)
mAutoPowerOffCount--;
if (mAutoPowerOffCount == 0)
{
LOG_I("PWR", "auto power_off idle=%umin", (unsigned)AutoCloseTime);
PowerOff();
}
}
/* GUI 数值调整(简单实现:更新当前值) */
@ -344,28 +437,49 @@ void Send_volume(uint8_t vol)
SendMidiDataToDreamDSP(mMasterSysExVolume,12);
}
void Accomp_UpdatePlayingChord(void)
{
uint8_t midi_note_buff[4] = {0,};
uint8_t note_cnt = 0;
uint8_t i;
if (!StartFlag)
return;
if (KEY_ID_1629 == 0 || KEY_ID_1629 == 22 || KEY_ID_1629 == 23)
return;
note_cnt = GetChordNotesByType(KEY_ID_1629,
chord_type_index_map[KEY_ID_1629].type,
midi_note_buff);
for (i = 0; i < note_cnt; i++)
AutoBandTop1_Note_On(midi_note_buff[i], 0x50);
}
void ADC_IN1_KEY_Handle(uint8_t key,bool on)
{
uint8_t midi_note_buff[4] = {0,};
uint8_t note_cnt = 0;
uint8_t is_preamble = 0;
key_toggle[key] = !key_toggle[key];
if(key_toggle[key] == 1)
{
//ResetAutoPowerCount();
switch(key)
{
case 3: AutoBandTop1_Preamble(0); break;
case 0: AutoBandTop1_Preamble(1); break;
case 1: AutoBandTop1_Postamble(0); break;
case 2: AutoBandTop1_Postamble(1); break;
case 3: AutoBandTop1_Preamble(0); is_preamble = 1; break;
case 0: AutoBandTop1_Preamble(1); is_preamble = 1; break;
case 1: AutoBandTop1_Postamble(0); break;
case 2: AutoBandTop1_Postamble(1); break;
}
//AutoBandTop1_Start();
AutoBandTop1_SyncStart();
wk_delay_ms(50);
//AutoBandTop1_Note_On(USE_MIDI.Midi_5, 0x50);
//AutoBandTop1_SetPiecePlayMode(1,0,1920);
//AutoBandTop1_StartWithNotes(midi_note_buff,GetChordNotesByType(KEY_ID_1629,chord_type_index_map[KEY_ID_1629].type,midi_note_buff));
//AutoBandTop1_SetLoopMode(0,1);
/* 音师:前奏起始 = 当前调一级和弦第一把位index 1 + maj再经移调 */
if (is_preamble)
{
KEY_ID_1629 = 1;
chord_type_index_map[1].type = 0;
}
note_cnt = GetChordNotesByType(KEY_ID_1629,chord_type_index_map[KEY_ID_1629].type,midi_note_buff);
for(uint8_t i = 0;i < note_cnt;i++)
{
@ -611,6 +725,17 @@ void Pick_Handle()
{
uint8_t midi = 0;
uint8_t midi_note_buff[4] = {0,};
uint8_t note_cnt = 0;
uint8_t chord_id = KEY_ID_1629;
/* 左手未触发和弦板(或落在拍速/停止键)时:拨片默认发当前调一级大和弦伴奏 */
if (chord_id == 0 || chord_id == 22 || chord_id == 23)
{
KEY_ID_1629 = 1;
chord_type_index_map[1].type = 0;
chord_id = 1;
}
note_cnt = GetChordNotesByType(chord_id, chord_type_index_map[chord_id].type, midi_note_buff);
Return_Light_buff(KEY_ID_1629);
switch(mGuiData[GUI_TAB_INDEX].Current)
@ -625,24 +750,24 @@ void Pick_Handle()
AutoBandTop1_SetLoopMode(0,1);
midi = 0x3C + mGuiData[GUI_TRANSPOSE].Current;
AutoBandTop1_StartWithNote(midi);
AutoBandTop1_StartWithNotes(midi_note_buff,GetChordNotesByType(KEY_ID_1629,chord_type_index_map[KEY_ID_1629].type,midi_note_buff));
AutoBandTop1_StartWithNotes(midi_note_buff, note_cnt);
}
break;
case 1:
StartFlag = 1;
AutoBandTop1_SetPiecePlayMode(1,0,1920);
AutoBandTop1_StartWithNotes(midi_note_buff,GetChordNotesByType(KEY_ID_1629,chord_type_index_map[KEY_ID_1629].type,midi_note_buff));
AutoBandTop1_StartWithNotes(midi_note_buff, note_cnt);
AutoBandTop1_SetLoopMode(0,1);
break;
case 0:
if(PressFlag)
{
AutoBandTop1_SetLoopMode(0,1);
AutoBandTop1_StartWithNotes(midi_note_buff,GetChordNotesByType(KEY_ID_1629,chord_type_index_map[KEY_ID_1629].type,midi_note_buff));
AutoBandTop1_StartWithNotes(midi_note_buff, note_cnt);
}else
{
AutoBandTop1_SetPiecePlayMode(1,0,480);
AutoBandTop1_StartWithNotes(midi_note_buff,GetChordNotesByType(KEY_ID_1629,chord_type_index_map[KEY_ID_1629].type,midi_note_buff));
AutoBandTop1_StartWithNotes(midi_note_buff, note_cnt);
}
StartFlag = 1;
break;
@ -650,33 +775,60 @@ void Pick_Handle()
break;
case 2:
if(StartFlag == 0) //当播放了之后,拨片不再起作用
/* 普通:节奏/本地曲目均用 StartWithNote切库后允许再次拨片起奏 */
if (StartFlag == 0 || mGuiData[GUI_AUTOBAND_SW].Current)
{
StartFlag = 1;
AutoBandTop1_Stop();
AutoBandTop1_SetLoopMode(0,1);
AutoBandTop1_SetRunVar(mGuiData[GUI_PLAY_SECTION].Current);
/* 起调必须用 0x3C+移调;勿用和弦音区 MIDI如 48否则本地曲目起奏异常 */
midi = 0x3C + mGuiData[GUI_TRANSPOSE].Current;
AutoBandTop1_StartWithNote(midi);
AutoBandTop1_StartWithNotes(midi_note_buff,GetChordNotesByType(KEY_ID_1629,chord_type_index_map[KEY_ID_1629].type,midi_note_buff));
AutoBandTop1_StartWithNotes(midi_note_buff, note_cnt);
if (mGuiData[GUI_AUTOBAND_SW].Current)
LOG_I("pick", "local/normal root=%u name=%s", midi,
AutoBandTop1_GetPresetName() ? AutoBandTop1_GetPresetName() : "?");
}
break;
case 1:
case 1:
StartFlag = 1;
AutoBandTop1_SetPiecePlayMode(1,0,1920);
AutoBandTop1_StartWithNotes(midi_note_buff,GetChordNotesByType(KEY_ID_1629,chord_type_index_map[KEY_ID_1629].type,midi_note_buff));
AutoBandTop1_SetLoopMode(0,1);
if (mGuiData[GUI_AUTOBAND_SW].Current)
{
/* 本地曲目与普通模式同一套起奏0x3C 根音 + 和弦音) */
AutoBandTop1_Stop();
AutoBandTop1_SetLoopMode(0,1);
AutoBandTop1_SetRunVar(mGuiData[GUI_PLAY_SECTION].Current);
midi = 0x3C + mGuiData[GUI_TRANSPOSE].Current;
AutoBandTop1_StartWithNote(midi);
AutoBandTop1_StartWithNotes(midi_note_buff, note_cnt);
LOG_I("pick", "local/expert root=%u name=%s sw=%u tab=%u",
midi,
AutoBandTop1_GetPresetName() ? AutoBandTop1_GetPresetName() : "?",
(unsigned)mGuiData[GUI_AUTOBAND_SW].Current,
(unsigned)mGuiData[GUI_TAB_INDEX].Current);
}
else
{
AutoBandTop1_SetPiecePlayMode(1,0,1920);
AutoBandTop1_StartWithNotes(midi_note_buff, note_cnt);
AutoBandTop1_SetLoopMode(0,1);
LOG_I("pick", "expert/rhythm piece name=%s",
AutoBandTop1_GetPresetName() ? AutoBandTop1_GetPresetName() : "?");
}
break;
case 0:
StartFlag = 1;
if(PressFlag)
{
AutoBandTop1_SetPiecePlayMode(1,0,480);
AutoBandTop1_StartWithNotes(midi_note_buff,GetChordNotesByType(KEY_ID_1629,chord_type_index_map[KEY_ID_1629].type,midi_note_buff));
AutoBandTop1_StartWithNotes(midi_note_buff, note_cnt);
AutoBandTop1_SetLoopMode(0,1);
}else
{
AutoBandTop1_SetPiecePlayMode(1,0,480);
AutoBandTop1_StartWithNotes(midi_note_buff,GetChordNotesByType(KEY_ID_1629,chord_type_index_map[KEY_ID_1629].type,midi_note_buff));
AutoBandTop1_StartWithNotes(midi_note_buff, note_cnt);
}
break;
}
@ -864,6 +1016,11 @@ void BT_Chord_offset_map(uint8_t pos_offset,uint8_t chord_offset)
uint8_t GetChordNotesByType(uint8_t MIDI_Index,uint8_t type,uint8_t *buff)
{
uint8_t n = 0;
uint8_t i;
uint8_t root;
buff[0] = buff[1] = buff[2] = buff[3] = 0;
switch(MIDI_Index)
{
case 1:case 2:case 3:
@ -1093,56 +1250,57 @@ uint8_t GetChordNotesByType(uint8_t MIDI_Index,uint8_t type,uint8_t *buff)
break;
}
break;
default:
return 0;
}
if(buff[3]!= 0)
n = (buff[3] != 0) ? 4 : 3;
switch (chord_type_index_map[MIDI_Index].PitchOffset)
{
switch(chord_type_index_map[MIDI_Index].PitchOffset)
{
case 1:
buff[0] += 0;
buff[1] += 0;
buff[2] += 0;
buff[3] += 0;
break;
case 2:
buff[0] += 1;
buff[1] += 1;
buff[2] += 1;
buff[3] += 1;
break;
}
buff[0] += mGuiData[GUI_TRANSPOSE].Current;
buff[1] += mGuiData[GUI_TRANSPOSE].Current;
buff[2] += mGuiData[GUI_TRANSPOSE].Current;
buff[3] += mGuiData[GUI_TRANSPOSE].Current;
return 4;
}else
{
switch(chord_type_index_map[MIDI_Index].PitchOffset)
{
case 1:
buff[0] += 0;
buff[1] += 0;
buff[2] += 0;
break;
case 2:
buff[0] += 1;
buff[1] += 1;
buff[2] += 1;
break;
}
buff[0] += mGuiData[GUI_TRANSPOSE].Current;
buff[1] += mGuiData[GUI_TRANSPOSE].Current;
buff[2] += mGuiData[GUI_TRANSPOSE].Current;
return 3;
case 2: /* # 升:整体 +1 半音 */
for (i = 0; i < n; i++)
buff[i] += 1;
break;
default:
break;
}
for (i = 0; i < n; i++)
buff[i] += mGuiData[GUI_TRANSPOSE].Current;
/* 音师:仅所有调的 #四级(键 10~12 + 升)— 整组低八度,音域压在一个八度内
* = #IV IV */
if (MIDI_Index >= 10 && MIDI_Index <= 12 &&
chord_type_index_map[MIDI_Index].PitchOffset == 2)
{
for (i = 0; i < n; i++)
{
if (buff[i] >= 12)
buff[i] -= 12;
}
root = buff[0];
for (i = 1; i < n; i++)
{
while (buff[i] >= (uint8_t)(root + 12))
buff[i] -= 12;
while (buff[i] < root)
buff[i] += 12;
}
}
return n;
}
void Read_Cur_Measure()
{
uint32_t now = rt_tick_get();
static uint32_t last_tick_i = 0;;
if((mGuiData[GUI_TAB_INDEX].Current == 2 || (mGuiData[GUI_TAB_LAST_INDEX].Current == 2 && mGuiData[GUI_TAB_INDEX].Current == 3)) && StartFlag)
static uint32_t last_tick_i = 0;
uint8_t tab = (uint8_t)mGuiData[GUI_TAB_INDEX].Current;
uint8_t last = (uint8_t)mGuiData[GUI_TAB_LAST_INDEX].Current;
/* 普通(2)与万能(0)均按「和弦走向」同步亮灯;设置页(3)沿用进入前模式 */
uint8_t loop_light_ok =
(tab == 0 || tab == 2) ||
(tab == 3 && (last == 0 || last == 2));
if (loop_light_ok && StartFlag)
{
if(now - last_tick_i >= 10)
{

View File

@ -112,6 +112,7 @@ typedef enum {
GUI_AUTOBAND_SW,
GUI_BL_SW,
GUI_TAB_LAST_INDEX,
GUI_NAV_BAR, /* 0902 底栏Value 0万能 1普通 2专业 3设置 */
}GUIID;
@ -165,6 +166,7 @@ extern uint8_t KEY_ID_1629;
extern bool powon;
void Power_Key_Scan(void);
void AutoPowerOff_Scan(void);
void System_PowerOn(void);
extern uint8_t Led;
extern bool PressFlag;
@ -175,7 +177,7 @@ extern uint8_t key_toggle[4];
extern bool StartFlag;
extern int16_t MIC_VOL_MAP[10];
extern int16_t MIC_VOL_MAP[11];
extern const uint8_t Version[3];
extern uint8_t AutoCloseTime;
extern uint16_t mAutoPowerOffCount;
@ -220,6 +222,8 @@ void Loop_Light_Handle(uint8_t measure);
void BL_Set_led(uint8_t Led, uint8_t chord_type);
uint8_t GetChordNotesByType(uint8_t MIDI_Index,uint8_t type,uint8_t *buff);
/* 伴奏已在播时仅更新和弦音,不 Restart快转调 */
void Accomp_UpdatePlayingChord(void);
void BT_Chord_offset_map(uint8_t pos_offset,uint8_t chord_offset);
void BT_Pitch_offset_map(uint8_t pos_offset,uint8_t pitch_offset);
void Read_Cur_Measure();

View File

@ -13,7 +13,7 @@
#include <stdlib.h>
#include "includes.h"
MidiFifoSeq_t m_MidiSendFifo;
#define PRESET_BUFFER_SIZE (1024*40)
#define PRESET_BUFFER_SIZE (1024*41) /* 2s.res compressed HKTK preset 39760 bytes */
static int m_presetCount = 0;
static uint8_t pStoreBuffer[PRESET_BUFFER_SIZE];
//static uint8_t* pStoreBuffer;
@ -76,9 +76,60 @@ static void Func_CallBack_PitchWheel(int channel,int cc,int value)
mymidififo_InQueue(&m_MidiSendFifo,&midimsg);
}
/* Flash Map 0903对照 ExtFlash_Tone_Addr.h / Doc/.../FLASH_MAP.txt */
static const char *ToneFlashMapBank(uint32_t abs)
{
if (abs >= EXTFLASH_BIN1_RHYTHM_ADDR &&
abs < EXTFLASH_BIN1_RHYTHM_ADDR + EXTFLASH_BIN1_RHYTHM_SIZE)
return "BIN1_RHYTHM";
if (abs >= EXTFLASH_BIN2_SONG_HAITIAN_ADDR &&
abs < EXTFLASH_BIN2_SONG_HAITIAN_ADDR + EXTFLASH_BIN2_SONG_HAITIAN_SIZE)
return "BIN2_SONG_HAITIAN";
if (abs >= EXTFLASH_BIN3_UNIVERSAL_ADDR &&
abs < EXTFLASH_BIN3_UNIVERSAL_ADDR + EXTFLASH_BIN3_UNIVERSAL_SIZE)
return "BIN3_UNIVERSAL";
if (abs >= FLASH_ADDR_AUTOBAND_LEGACY &&
abs < FLASH_ADDR_AUTOBAND_LEGACY + 0x10000UL)
return "LEGACY_AUTOBAND";
return "OUT_OF_MAP";
}
static uint32_t s_flash_rd_last_base = 0xFFFFFFFFu;
static uint16_t s_flash_rd_log_cnt = 0;
static int Func_CallBack_ReadFlash(int address,int length,uint8_t* pOutput)
{
W25Q128_Read(pOutput, (uint32_t)ADDRESS+address, length);
uint32_t base = (uint32_t)ADDRESS;
uint32_t abs = base + (uint32_t)address;
const char *bank;
if (base != s_flash_rd_last_base) {
s_flash_rd_last_base = base;
s_flash_rd_log_cnt = 0;
LOG_I("FLASH_RD", "bank base=0x%08X map=%s (BIN1=0x%08X BIN2=0x%08X BIN3=0x%08X)",
(unsigned)base,
ToneFlashMapBank(base),
(unsigned)EXTFLASH_BIN1_RHYTHM_ADDR,
(unsigned)EXTFLASH_BIN2_SONG_HAITIAN_ADDR,
(unsigned)EXTFLASH_BIN3_UNIVERSAL_ADDR);
}
bank = ToneFlashMapBank(abs);
/* 加载阶段打印前若干次 + 每次 offset==0避免播放期刷屏 */
if (s_flash_rd_log_cnt < 16u || address == 0) {
LOG_I("FLASH_RD", "abs=0x%08X off=%d len=%d map=%s",
(unsigned)abs, address, length, bank);
if (s_flash_rd_log_cnt < 0xFFFFu)
s_flash_rd_log_cnt++;
if (s_flash_rd_log_cnt == 16u)
LOG_I("FLASH_RD", "further reads omitted (same base)");
} else if (bank[0] == 'O') {
/* 读到 Map 外:始终告警 */
LOG_W("FLASH_RD", "OUT_OF_MAP abs=0x%08X off=%d len=%d base=0x%08X",
(unsigned)abs, address, length, (unsigned)base);
}
W25Q128_Read(pOutput, abs, length);
return 0;
}
//
@ -95,11 +146,18 @@ void App_Auto_Init(void)
m_presetCount = AutoBandTop1_GetPresetItemCount();
int ret = AutoBandTop1_LoadPresetItemFromFlash(0);
if(ret != 0)
if (ret != 0)
{
for(;;);
LOG_E("AUTO", "LoadPreset fail ret=%d addr=0x%08X map=%s",
ret, (unsigned)ADDRESS, ToneFlashMapBank((uint32_t)ADDRESS));
}
else
{
LOG_I("AUTO", "LoadPreset ok name=%s addr=0x%08X map=%s",
AutoBandTop1_GetPresetName() ? AutoBandTop1_GetPresetName() : "?",
(unsigned)ADDRESS, ToneFlashMapBank((uint32_t)ADDRESS));
AutoBandTop1_ChangeBPM(mGuiData[1].Current);
}
AutoBandTop1_ChangeBPM(mGuiData[1].Current);
}
//void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

View File

@ -5,7 +5,11 @@ void UI_ExpertMode_Init(void)
mGuiData[GUI_TAB_INDEX].Current = 1;
mGuiData[GUI_TAB_LAST_INDEX].Current = mGuiData[GUI_TAB_INDEX].Current;
//mGuiData[GUI_AUTOBAND_SW].Current = 1;
Show_home_UI();
UI_ReloadTonePreset(); /* 必须在 TAB=专业 之后换库,否则仍是万能 3.bin */
if (CurrUIProcress == UI_SongMode_Process)
Show_home_UI_Diff();
else
Show_home_UI();
pCurrentTouch_Area = Touch_Areas;
}
@ -27,13 +31,7 @@ void UI_ExpertMode_Process(DisplayTaskMessage_Type msg)
}
break;
case MSG_ID_BATTERY_VALUE:
// if(usb_charging_state)
// {
// Draw_Battery_Icon(180, 5, msg.DataU16[1], 1, GREEN, BLACK, GREEN);
// }else
// {
// Draw_Battery_Icon(180, 5, msg.DataU16[1], 1, WHITE, BLACK, WHITE);
// }
Draw_Status_Battery_Icon(percentage);
break;
case MSG_ID_TAP_SPEED:
@ -51,21 +49,8 @@ void UI_ExpertMode_Process(DisplayTaskMessage_Type msg)
break;
case MSG_ID_EC_VOL:
// //LCD_ShowString(200, 0, Num_To_String(msg.DataU16[1],buff,3), RED, WHITE, 16, 0);
// uint8_t vol = msg.DataU16[1];
//// uint8_t level;
// if (vol <= 5) level = 0;
// else if (vol <= 35) level = 1;
// else if (vol <= 65) level = 2;
// else if (vol <= 95) level = 3;
// else if (vol <= 115) level = 4;
// else level = 5;
// Draw_Volume_Bar(5, 5, level, 1, WHITE, GRAY);
// uint8_t mMasterSysExVolume[12] = { 0xF0, 0x41, 0x00, 0x42, 0x12, 0x40, 0x00, 0x04, 0x64, 0x00, 0x00,0xF7};
// memset(mMasterSysExVolume+8,msg.DataU16[1],1);
// SendMidiDataToDreamDSP(mMasterSysExVolume,12);
//
// ResetAutoPowerCount();
Draw_Volume_Bar(UI0902_VOL_X, UI0902_VOL_Y, msg.HiByte, 1, WHITE, GRAY);
ResetAutoPowerCount();
break;
case MSG_ID_TOUCH_LONG_REPEAT:

View File

@ -6,7 +6,11 @@ void UI_FreeMode_Init(void)
mGuiData[GUI_TAB_INDEX].Current = 2;
mGuiData[GUI_TAB_LAST_INDEX].Current = mGuiData[GUI_TAB_INDEX].Current;
//mGuiData[GUI_AUTOBAND_SW].Current = 1;
Show_home_UI();
UI_ReloadTonePreset(); /* TAB=普通 后再加载 1.bin */
if (CurrUIProcress == UI_SongMode_Process)
Show_home_UI_Diff();
else
Show_home_UI();
pCurrentTouch_Area = Touch_Areas;
}
@ -28,13 +32,7 @@ void UI_FreeMode_Process(DisplayTaskMessage_Type msg)
}
break;
case MSG_ID_BATTERY_VALUE:
// if(usb_charging_state)
// {
// Draw_Battery_Icon(180, 5, msg.DataU16[1], 1, GREEN, BLACK, GREEN);
// }else
// {
// Draw_Battery_Icon(180, 5, msg.DataU16[1], 1, WHITE, BLACK, WHITE);
// }
Draw_Status_Battery_Icon(percentage);
break;
case MSG_ID_TAP_SPEED:
@ -53,20 +51,8 @@ void UI_FreeMode_Process(DisplayTaskMessage_Type msg)
break;
case MSG_ID_EC_VOL:
//LCD_ShowString(200, 0, Num_To_String(msg.DataU16[1],buff,3), RED, WHITE, 16, 0);
// uint8_t vol = msg.DataU16[1];
//// uint8_t level;
// if (vol <= 5) level = 0;
// else if (vol <= 35) level = 1;
// else if (vol <= 65) level = 2;
// else if (vol <= 95) level = 3;
// else if (vol <= 115) level = 4;
// else level = 5;
// Draw_Volume_Bar(5, 5, level, 1, WHITE, GRAY);
// uint8_t mMasterSysExVolume[12] = { 0xF0, 0x41, 0x00, 0x42, 0x12, 0x40, 0x00, 0x04, 0x64, 0x00, 0x00,0xF7};
// memset(mMasterSysExVolume+8,msg.DataU16[1],1);
// SendMidiDataToDreamDSP(mMasterSysExVolume,12);
// ResetAutoPowerCount();
Draw_Volume_Bar(UI0902_VOL_X, UI0902_VOL_Y, msg.HiByte, 1, WHITE, GRAY);
ResetAutoPowerCount();
break;
case MSG_ID_TOUCH_LONG_REPEAT:

View File

@ -19,19 +19,37 @@ void RGB_Y_TO_G()
#define UI_MODE_SCREEN_WIDTH 240
#define UI_MODE_SCREEN_HEIGHT 320
/* 模式选择页焦点0=万能 1=普通 2=专业,默认选中万能(与规范一致) */
static uint8_t s_mode_select_focus = 0;
extern bool InModeFlag;
static void UI_ModeSelect_DrawButtons(void);
/* 0902-01行高88、行距92顶边与模式主页移调/速度(CARD_Y=48)对齐,分割线居中 */
#define UI0902_MODE_ROW_X 9
#define UI0902_MODE_ROW_W 222
#define UI0902_MODE_ROW_H 88
#define UI0902_MODE_ROW_Y0 UI0902_CARD_Y /* 48与移调/速度顶对齐 */
#define UI0902_MODE_ROW_DY 92 /* 48 / 140 / 232 */
static void UI_ModeSelect_SetFocus(uint8_t idx)
/* 模式页不显示焦点:三行均用未选中资源;单击直接进入 */
static const uint32_t s_mode_row_addr[3] = {
UI0902_ROW_UNIVERSAL_NOT_ADDR, /* 0 万能 */
UI0902_ROW_NORMAL_NOT_ADDR, /* 1 普通 */
UI0902_ROW_EXPERT_NOT_ADDR, /* 2 专业 */
};
static void UI_ModeSelect_DrawButtons(void)
{
if (idx > 2 || idx == s_mode_select_focus)
return;
s_mode_select_focus = idx;
UI_ModeSelect_DrawButtons();
uint8_t i;
for (i = 0; i < 3; i++) {
uint16_t y = (uint16_t)(UI0902_MODE_ROW_Y0 + i * UI0902_MODE_ROW_DY);
LCD_WR_PIC_FROM_FLASH(UI0902_MODE_ROW_X, y,
UI0902_MODE_ROW_W, UI0902_MODE_ROW_H,
s_mode_row_addr[i]);
/* 万能模式素材顶部有残留近白横线(相对行内 y=7/8盖成行底色 */
if (i == 0) {
LCD_FillByColor(UI0902_MODE_ROW_X, (uint16_t)(y + 7),
(uint16_t)(UI0902_MODE_ROW_X + UI0902_MODE_ROW_W),
(uint16_t)(y + 9), UI0902_ROW_BG);
}
}
}
void UI_ReturnToModeSelect(void)
@ -39,62 +57,26 @@ void UI_ReturnToModeSelect(void)
StartFlag = 0;
InModeFlag = false;
AutoBandTop1_Stop();
s_mode_select_focus = 0;
CallUI_Idle();
UI_DrawModeSelectScreen();
}
/* 0831 美工试用图:图标+MiSans 文字整行位图 */
static void UI_DrawModeSelectButton(uint16_t y, const uint8_t *row, uint8_t focused)
{
const uint16_t btn_w = 220;
const uint16_t btn_h = 87;
const uint16_t btn_r = 10;
const uint16_t btn_x = (240 - btn_w) / 2;
const uint16_t row_x = (uint16_t)(btn_x + (btn_w - UI_MODE0831_ROW_W) / 2);
const uint16_t row_y = (uint16_t)(y + (btn_h - UI_MODE0831_ROW_H) / 2);
if (focused)
{
LCD_FillRoundRectGradient(btn_x, y, btn_w, btn_h, btn_r,
START_COLOR, END_COLOR);
}
else
{
LCD_FillRoundRect(btn_x, y, btn_w, btn_h, btn_r, COLOR_NORMAL_BG);
}
LCD_WR_PIC_Trans(row_x, row_y, UI_MODE0831_ROW_W, UI_MODE0831_ROW_H, row, BLACK);
}
static void UI_ModeSelect_DrawButtons(void)
{
UI_DrawModeSelectButton(40,
gImage_Mode0831_Universal_Row_180_52,
s_mode_select_focus == 0);
UI_DrawModeSelectButton(132,
gImage_Mode0831_Normal_Row_180_52,
s_mode_select_focus == 1);
UI_DrawModeSelectButton(224,
gImage_Mode0831_Expert_Row_180_52,
s_mode_select_focus == 2);
}
void UI_DrawModeSelectScreen(void)
{
UI_ClearFocus();
pCurrentTouch_Area = Touch_ModeSelect_Areas;
LCD_FillByColor(0, 0, 240, 320, BLACK);
LCD_FillByColor(0, 0, 240, 320, UI0902_BG_COLOR);
label_top();
UI_ModeSelect_DrawButtons();
}
/* 设计稿 0902-01模式选择页无底部三栏导航仅三行模式按钮 */
}
const Touch_AreaTypeDef Touch_ModeSelect_Areas[] = {
/* Flag=按钮序号(0万能/1普通/2专业)ID=进入 TAB */
{ 0, 239, 38, 127, 0, 0, 0, NULL },
{ 0, 239, 128, 219, 1, 0, 2, NULL },
{ 0, 239, 220, 311, 2, 0, 1, NULL },
/* Flag=按钮序号(0万能/1普通/2专业)ID=进入 TAB。全宽便于命中Y 与 MODE_ROW_* 一致 */
{ 0, 239, 48, 135, 0, 0, 0, NULL },
{ 0, 239, 140, 227, 1, 0, 2, NULL },
{ 0, 239, 232, 319, 2, 0, 1, NULL },
};
#define TOUCH_AREA_MODE_SELECT_NUM (sizeof(Touch_ModeSelect_Areas)/sizeof(Touch_AreaTypeDef))
@ -104,14 +86,14 @@ extern uint8_t channel;
extern uint8_t level;
extern bool powon;
extern bool InModeFlag;
extern int16_t MIC_VOL_MAP[10];
extern int16_t MIC_VOL_MAP[11];
extern int8_t delta;
extern STRING_MIDI USE_MIDI;
void LoadConfig()
void LoadConfig(void)
{
SendProgramChangeMidiEvent(0,Timbre_index[mGuiData[GUI_TIMBRE_SELECT].Current]);
uint8_t val_127 = (faders[0].val * 127) / 20;
uint8_t val_127 = (faders[0].val * 127) / 10;
SendVolumeChangeMidiEvent(1,val_127);
SendVolumeChangeMidiEvent(2,val_127);
SendVolumeChangeMidiEvent(3,val_127);
@ -128,7 +110,7 @@ void LoadConfig()
SendVolumeChangeMidiEvent(14,val_127);
SendVolumeChangeMidiEvent(15,val_127);
SendVolumeChangeMidiEvent(0,faders[1].val);
SendVolumeChangeMidiEvent(0,(faders[1].val * 127) / 10);
AW816_Set_Volume(MIC_VOL_MAP[faders[2].val]);
@ -138,30 +120,25 @@ void LoadConfig()
void Touch_Mode_Select_Action(int8_t FLAG, uint8_t ID, uint8_t areaIndex)
{
(void)areaIndex;
(void)FLAG;
StartTask();
s_mode_select_focus = (uint8_t)FLAG;
/* ID 为 TAB 索引0=万能(Song) 1=专业(Expert) 2=普通(Free) */
mGuiData[GUI_TAB_INDEX].Current = ID;
InModeFlag = true;
/* 进入子页后抑制残留按下,否则易误触底栏 GUI_TAB_INDEX(id=5)→设置 */
app_touch_suppress(500);
/* DSP 已就绪:再下发音色 + 调音台音量(与关机前 NVM/faders 一致) */
LoadConfig();
switch (ID)
{
case 0: /* 万能 */
if (mGuiData[GUI_AUTOBAND_SW].Current)
ADDRESS = 0x0009EB5F;
else
ADDRESS = 0x0001B8F0;
MenuPage_SongMode_Proc();
case 0: /* 万能 → 3.bin / 本地→2.bin */
MenuPage_SongMode_Proc(); /* Init 设 TAB 并 Reload */
break;
case 1: /* 专业 */
if (mGuiData[GUI_AUTOBAND_SW].Current)
ADDRESS = 0x0009EB5F;
else
ADDRESS = 0x00000000;
case 1: /* 专业 → 1.bin / 本地→2.bin */
MenuPage_ExpertMode_Proc();
break;
case 2: /* 普通 */
ADDRESS = 0x0009598F;
case 2: /* 普通 → 1.bin */
MenuPage_FreeMode_Proc();
break;
default:
@ -177,27 +154,28 @@ void IdleProcess(DisplayTaskMessage_Type msg)
{
case MSG_ID_POWER_ON :
LCD_BLK_Set();
LCD_FillByColor(0, 0, 240, 320, WHITE);
LCD_WR_PIC_FROM_FLASH(40, 80, 168, 155, 0x00000000);
LCD_WR_PIC_FROM_FLASH(0, 0, UI0902_BOOT_LOGO_W, UI0902_BOOT_LOGO_H,
UI0902_BOOT_LOGO_ADDR);
BSP_SelectAdcChannel(6);
/* 让出 CPU避免忙等卡住触摸/主循环线程 */
rt_thread_mdelay(1000);
LoadConfig();
vol = ADC_ReadChannel(ADC_CHANNEL_1)>>5;
if (vol <= 5) level = 0;
else if (vol <= 35) level = 1;
else if (vol <= 65) level = 2;
else if (vol <= 95) level = 3;
else if (vol <= 115) level = 4;
else level = 5;
Send_volume(vol);
s_mode_select_focus = 0;
app_adc_sync_volume(vol);
Send_volume(vol);
UI_DrawModeSelectScreen();
TM1629D_AllLedOn(LED_COLOR_G);
TM1629D_UpdateDisplay(0);
StartTouchTask();
StartScanTask();
/* Dream 上电稍后可能忽略首包 SysEx再发主音量 + 调音台(保持关机前设置) */
rt_thread_mdelay(400);
vol = ADC_ReadChannel(ADC_CHANNEL_1)>>5;
app_adc_sync_volume(vol);
Send_volume(vol);
LoadConfig();
Draw_Volume_Bar(UI0902_VOL_X, UI0902_VOL_Y, level, 1, WHITE, GRAY);
break;
case MSG_ID_POWER_OFF:
@ -212,21 +190,26 @@ void IdleProcess(DisplayTaskMessage_Type msg)
case MSG_ID_TOUCH:
{
static uint32_t s_last_enter_ms;
uint32_t now = rt_tick_get() * 1000U / RT_TICK_PER_SECOND;
uint8_t hit = 0U;
for(uint8_t k=0; k<TOUCH_AREA_MODE_SELECT_NUM; k++)
{
if( msg.HiByte >= Touch_ModeSelect_Areas[k].x_min && msg.HiByte <= Touch_ModeSelect_Areas[k].x_max &&
msg.LoByte >= Touch_ModeSelect_Areas[k].y_min && msg.LoByte <= Touch_ModeSelect_Areas[k].y_max )
{
hit = 1U;
uint8_t row = (uint8_t)Touch_ModeSelect_Areas[k].Flag;
LOG_I("UI", "mode_select hit area=%u row=%u x=%u y=%u",
(unsigned)k, (unsigned)row,
(unsigned)k,
(unsigned)Touch_ModeSelect_Areas[k].Flag,
(unsigned)msg.HiByte, (unsigned)msg.LoByte);
if (row == s_mode_select_focus)
Touch_Mode_Select_Action(Touch_ModeSelect_Areas[k].Flag, Touch_ModeSelect_Areas[k].ID, k);
else
UI_ModeSelect_SetFocus(row);
/* 单击直接进入对应模式主页 */
if (now - s_last_enter_ms < 300U)
break;
s_last_enter_ms = now;
Touch_Mode_Select_Action(Touch_ModeSelect_Areas[k].Flag,
Touch_ModeSelect_Areas[k].ID, k);
break;
}
}
@ -247,41 +230,73 @@ void IdleProcess(DisplayTaskMessage_Type msg)
case MSG_ID_POWOFF_CHARG:
{
static bool flag = 0;
if(flag == 0)
static bool s_charge_ui_drawn = false;
if(!s_charge_ui_drawn)
{
uint8_t peek[4];
BSP_MainPowerEnable(1);
LCD_WR_REG(0x29); //Display on
LCD_WR_REG(0x29); /* Display on */
LCD_WR_PIC_FROM_FLASH(40, 50, 160, 190, 0x0000CB70);
/* 先铺设计底色,避免外置 Flash 未烧充电图时整屏 0xFF 灰底 */
LCD_FillByColor(0, 0, 240, 320, UI0902_BG_COLOR);
W25Q128_Read(peek, UI0902_CHARGE_SCREEN_ADDR, 4);
if (peek[0] != 0xFF || peek[1] != 0xFF)
{
/* 0904 全屏充电画面UI0902 @ CHARGE_SCREEN% 由固件叠画 */
LCD_WR_PIC_FROM_FLASH(0, 0, UI0902_CHARGE_SCREEN_W, UI0902_CHARGE_SCREEN_H,
UI0902_CHARGE_SCREEN_ADDR);
}
else
{
/* 资源未烧录时的兜底:圆环闪电(需稍后 flash ui0902 */
Draw_Charging_Icon(120, 150, 2, 0x3D7F);
LOG_W("UI", "charge flash empty @0x%08lX — flash ui0902",
(unsigned long)UI0902_CHARGE_SCREEN_ADDR);
}
LCD_BLK_Set();
flag = 1;
s_charge_ui_drawn = true;
}
if(usb_charging_state)
{
uint8_t Info[10] = {0,};
sprintf ((char*)Info, "%d%%", msg.ID);
LCD_ShowString_AutoAlign(0,240,250,Info,LCD_ALIGN_CENTER,WHITE,BLACK,0,28);
/* MiSans Semibold 位图:数字与 % 同高对齐,对齐 0904 设计 */
char digits[4];
uint8_t n, i;
uint16_t total_w = g_ChargePctPercent.w;
uint16_t x, y = 266;
uint8_t pct = msg.ID;
if (pct > 100)
pct = 100;
n = (uint8_t)sprintf(digits, "%u", (unsigned)pct);
for (i = 0; i < n; i++)
total_w = (uint16_t)(total_w + g_ChargePctDigits[digits[i] - '0'].w);
LCD_FillByColor(40, 262, 200, 290, UI0902_BG_COLOR);
x = (uint16_t)((240 - total_w) / 2);
for (i = 0; i < n; i++)
{
const ChargePctGlyph *g = &g_ChargePctDigits[digits[i] - '0'];
LCD_WR_PIC_Trans(x, y, g->w, g->h, g->data, BLACK);
x = (uint16_t)(x + g->w);
}
LCD_WR_PIC_Trans(x, y, g_ChargePctPercent.w, g_ChargePctPercent.h,
g_ChargePctPercent.data, BLACK);
}
else
{
/* 关机充电中拔掉:熄屏,允许下次再进充电页 */
LCD_BLK_Clr();
LCD_FillByColor(0, 0, 240, 320, BLACK);
BSP_MainPowerEnable(0);
s_charge_ui_drawn = false;
}
//else
//BSP_MainPowerEnable(0);
}
break;
case MSG_ID_EC_VOL:
{
//LCD_ShowString(200, 0, Num_To_String(msg.DataU16[1],buff,3), RED, WHITE, 16, 0);
uint8_t vol = msg.ID;
if (vol <= 5) level = 0;
else if (vol <= 35) level = 1;
else if (vol <= 65) level = 2;
else if (vol <= 95) level = 3;
else if (vol <= 115) level = 4;
else level = 5;
Draw_Volume_Bar(5, 5, level, 1, WHITE, GRAY);
uint8_t mMasterSysExVolume[12] = { 0xF0, 0x41, 0x00, 0x42, 0x12, 0x40, 0x00, 0x04, 0x64, 0x00, 0x00,0xF7};
memset(mMasterSysExVolume+8,msg.ID,1);
SendMidiDataToDreamDSP(mMasterSysExVolume,12);
{
/* 主音量已在 MainTask 下发;此处只刷新条 */
level = msg.HiByte;
Draw_Volume_Bar(UI0902_VOL_X, UI0902_VOL_Y, level, 1, WHITE, GRAY);
ResetAutoPowerCount();
}
break;

View File

@ -1,154 +1,86 @@
#include "includes.h"
extern const Touch_AreaTypeDef *pCurrentTouch_Area;
static int8_t s_mixer_focus = -1;
// ==================== <20><>ť<EFBFBD><C5A5><EFBFBD><EFBFBD> ====================
#define BTN_Y 275 // <20><>ť<EFBFBD><C5A5>ʼY
#define BTN_H 40 // <20><>ť<EFBFBD>߶<EFBFBD>
#define BTN_W 105 // <20><>ť<EFBFBD><C5A5><EFBFBD>
#define BTN_G 5 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ť<EFBFBD>м<EFBFBD><D0BC><EFBFBD>
// ==================== <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ====================
const Touch_AreaTypeDef Touch_Btn[] = {
{ 0, 50, 0, 50, 0, 0, 0, NULL },
/* 0902-06 调音台:返回 + 标题;无底栏 */
const Touch_AreaTypeDef Touch_Mixer_Areas[] = {
{ 0, 44, 0, 40, 0, 0, GUI_CANCEL, NULL },
};
#define TOUCH_BTN_NUM (sizeof(Touch_Btn)/sizeof(Touch_AreaTypeDef))
#define TOUCH_BTN_NUM (sizeof(Touch_Mixer_Areas)/sizeof(Touch_AreaTypeDef))
/* 左→右 伴奏|弦|麦|麦混响Flash 标签按内容挂接13伴奏/14弦/15麦/16麦混响 */
static const uint32_t s_fader_label[4][3] = { /* addr, w, h */
{ UI0902_TXT_MIXER_BAND_ADDR, UI0902_TXT_MIXER_BAND_W, UI0902_TXT_MIXER_BAND_H },
{ UI0902_TXT_MIXER_GUITAR_ADDR, UI0902_TXT_MIXER_GUITAR_W, UI0902_TXT_MIXER_GUITAR_H },
{ UI0902_TXT_MIXER_MIC_ADDR, UI0902_TXT_MIXER_MIC_W, UI0902_TXT_MIXER_MIC_H },
{ UI0902_TXT_MIXER_VOCALFX_ADDR, UI0902_TXT_MIXER_VOCALFX_W, UI0902_TXT_MIXER_VOCALFX_H },
};
// ============================================================
// 完整绘制推子(首次初始化 / 页面切换时调用)
// ????????????????????? / ?????????????
// ============================================================
void DrawFader(Fader_t *f)
{
uint16_t x = f->x, y = f->y, w = f->w, h = f->h;
// 清除整个推子区域
LCD_FillByColor(x - 10, y, x + w + 10, y + h, BLACK);
// 绘制完整槽背景
DrawFaderGrooveAt(f, y + 5, y + 5 + h);
// 刻度线
for (int i = 0; i < 10; i++) {
uint16_t tick_y = y + 7 + (h * i) / 10;
LCD_DrawLine(x + w / 2 - 3, tick_y, x + w / 2 + 3, tick_y, FADER_TEXT);
}
// 底部文字
LCD_ShowChinese_AutoAlign(x + 10, x + (w / 2) - 8, y + h + 20,
(uint8_t*)f->name, LCD_ALIGN_CENTER, FADER_TEXT, BLACK, 0, 12);
// 画滑块并记录位置
uint16_t slider_y = CalcSliderY(f);
uint16_t cx = f->x + f->w / 2;
uint16_t slider_y;
LCD_FillByColor(cx - 20, f->y, cx + 20, f->y + f->h + 30, UI0902_BG_COLOR);
LCD_WR_PIC_FROM_FLASH(cx - 15, f->y, 31, 215, UI0902_MIXER_TRACK_ADDR);
LCD_WR_PIC_FROM_FLASH_Trans(cx - s_fader_label[f->id][1] / 2, f->y + f->h + 8,
(uint16_t)s_fader_label[f->id][1], (uint16_t)s_fader_label[f->id][2],
s_fader_label[f->id][0]);
slider_y = CalcSliderY(f);
DrawFaderSlider(f, slider_y);
f->prev_slider_y = slider_y;
}
/* 四路推子写入 NVM 参数(仅 RAM落盘由 save 调用方决定) */
static void SyncMixerFadersToNvm(void)
{
NvmParam_Type *nvm = drv_nvm_param_ptr();
nvm->param.BandVol = faders[0].val;
nvm->param.StringVol = faders[1].val;
nvm->param.MIcVol = faders[2].val;
nvm->param.MicRev = faders[3].val;
}
void DrawAllFaders(void)
{
NvmParam_Type * nvm = drv_nvm_param_ptr();
// 鍏堟竻鏁翠釜鎺ㄥ瓙鍖哄煙锛屽交搴曟秷闄ゆ畫锟?
//LCD_FillByColor(0, 35, 240, 320, BLACK);
for (int i = 0; i < 4; i++) {
DrawFader(&faders[i]);
}
if(nvm->param.BandVol != faders[0].val)
{
nvm->param.BandVol = faders[0].val;
}
if(nvm->param.StringVol != faders[1].val)
{
nvm->param.StringVol = faders[1].val;
}
if(nvm->param.MIcVol != faders[2].val)
{
nvm->param.MIcVol = faders[2].val;
}
if(nvm->param.MicRev != faders[3].val)
{
nvm->param.MicRev = faders[3].val;
}
SyncMixerFadersToNvm();
drv_nvm_save_to_flash();
}
// ============================================================
// 绘制推子槽背景局部区域y_start ~ y_end 范围)
// RED/CYAN 用 FillRoundRect_Solid 自带圆角
// GREEN 覆盖 RED 底部圆角YELLOW 覆盖 CYAN 顶部圆角
// ============================================================
static void DrawFaderGrooveAt(Fader_t *f, uint16_t y_start, uint16_t y_end)
{
if (y_start >= y_end) return;
uint16_t x = f->x, y = f->y, w = f->w, h = f->h;
uint16_t groove_top = y + 5;
uint16_t groove_bot = y + 5 + h;
const uint16_t r = 15;
// 裁剪到槽边界
if (y_start < groove_top) y_start = groove_top;
if (y_end > groove_bot) y_end = groove_bot;
if (y_start >= y_end) return;
// 1. 灰色底色(纯矩形)
LCD_FillByColor(x, y_start, x + w, y_end, BLACK);
// 2. 青色段 — FillRoundRect_Solid 自带底部圆角
{ uint16_t s = groove_top + 100, e = groove_top + h;
if (y_start < e && y_end > s) {
FillRoundRect_Solid(x, s, w, e - s, r, 0x3fAE);
} }
// 3. 黄色段 — 纯矩形,覆盖青色顶部圆角
{ uint16_t s = groove_top + 100 - 33, e = groove_top + 100 + 16;
if (y_start < e && y_end > s) {
uint16_t ys = y_start > s ? y_start : s;
uint16_t ye = y_end < e ? y_end : e;
LCD_FillByColor(x, ys, x + w, ye, YELLOW);
} }
// 4. 红色段 — FillRoundRect_Solid 自带顶部圆角
{ uint16_t s = groove_top, e = groove_top + 49;
if (y_start < e && y_end > s) {
FillRoundRect_Solid(x, s, w, e - s, r, RED);
} }
// 5. 绿色段 — 纯矩形,覆盖红色底部圆角
{ uint16_t s = groove_top + 100 - 66, e = groove_top + 100 - 32;
if (y_start < e && y_end > s) {
uint16_t ys = y_start > s ? y_start : s;
uint16_t ye = y_end < e ? y_end : e;
LCD_FillByColor(x, ys, x + w, ye, RGB(21,40,7));
} }
// 6. 脏区域内的刻度线
for (int i = 0; i < 10; i++) {
uint16_t tick_y = y + 7 + (h * i) / 10;
if (tick_y >= y_start && tick_y <= y_end) {
LCD_DrawLine(x + w / 2 - 3, tick_y, x + w / 2 + 3, tick_y, FADER_TEXT);
}
}
}
// ============================================================
// 仅绘制滑块 + 数值文字(用于增量刷新)
// 滑块尺寸和文字位置与原版完全一致
// ============================================================
/* 0902-06实心蓝色圆钮勿用同心空心圆会透出色条 */
#define MIXER_KNOB_R 14
static void DrawFaderSlider(Fader_t *f, uint16_t slider_y)
{
uint16_t x = f->x, w = f->w, slider_h = 20;
uint16_t bg = (s_mixer_focus == (int8_t)f->id) ? COLOR_PRIMARY : COLOR_NORMAL_BG;
uint16_t cx = f->x + f->w / 2;
uint16_t ly = f->y + f->h + 8;
uint16_t cy = (uint16_t)(slider_y + MIXER_KNOB_R);
char buf[8];
LCD_FillRoundRect(x+5, slider_y, w-10, slider_h, 5, bg);
LCD_FillCircle(cx, cy, MIXER_KNOB_R, COLOR_GRAD_MID);
sprintf(buf, "%d", f->val);
LCD_ShowString_AutoAlign(x, x + w, slider_y, (uint8_t*)buf, LCD_ALIGN_CENTER, FADER_TEXT, bg, 0, 15);
LCD_ShowString_AutoAlign((uint16_t)(cx - 8), (uint16_t)(cx + 8),
(uint16_t)(cy - 5),
(uint8_t*)buf, LCD_ALIGN_CENTER, WHITE, COLOR_GRAD_MID, 0, 11);
LCD_FillByColor(cx - 15, ly + 17, cx + 15, ly + 19, UI0902_BG_COLOR);
if (s_mixer_focus == (int8_t)f->id)
LCD_FillByColor(cx - 15, ly + 17, cx + 15, ly + 19, COLOR_GRAD_MID);
}
// ============================================================
// 完整重绘滑块(槽背景 + 刻度线 + 滑块)
// ???????????????????????????????????? Flash ????
// ============================================================
static void UpdateFaderSlider(Fader_t *f)
{
uint16_t x = f->x, y = f->y, w = f->w, h = f->h;
uint16_t cx = f->x + f->w / 2;
uint16_t new_y = CalcSliderY(f);
if (f->prev_slider_y == new_y) return;
// 完整重绘整个推子槽区域
LCD_FillByColor(x - 10, y, x + w + 10, y + h, BLACK);
DrawFaderGrooveAt(f, y + 5, y + 5 + h);
// 刻度线
for (int i = 0; i < 10; i++) {
uint16_t tick_y = y + 7 + (h * i) / 10;
LCD_DrawLine(x + w / 2 - 3, tick_y, x + w / 2 + 3, tick_y, FADER_TEXT);
}
// 画滑块
LCD_WR_PIC_FROM_FLASH(cx - 15, f->y, 31, 215, UI0902_MIXER_TRACK_ADDR);
DrawFaderSlider(f, new_y);
f->prev_slider_y = new_y;
}
@ -168,14 +100,13 @@ void UpdateFaderByTouch(int idx, uint16_t y)
}
uint16_t y_min = f->y;
uint16_t y_max = f->y + f->h;
if (y < y_min + 8) { // 闈犺繎椤堕儴 鈫?鐩存帴10
if (y < y_min + 8) {
f->val = 10;
}
else if (y > y_max - 8) { // 闈犺繎搴曢儴 鈫?鐩存帴0
else if (y > y_max - 8) {
f->val = 0;
}
else {
// 姝e父璁$畻
int32_t val_raw = 10 - ((int32_t)(y - y_min) * 10) / (y_max - y_min);
if(val_raw < 0) val_raw = 0;
if(val_raw > 10) val_raw = 10;
@ -183,10 +114,8 @@ void UpdateFaderByTouch(int idx, uint16_t y)
}
UpdateFaderSlider(f);
DrawFaderSlider(f, f->prev_slider_y);
// 闊抽噺杈撳嚭
switch(idx) {
case 0:
// MIX 閫氶亾
val_127 = (f->val * 127) / 10;
SendVolumeChangeMidiEvent(1,val_127);
SendVolumeChangeMidiEvent(2,val_127);
@ -205,29 +134,26 @@ void UpdateFaderByTouch(int idx, uint16_t y)
SendVolumeChangeMidiEvent(15,val_127);
break;
case 1:
// STR 寮︿箰閫氶亾
STR_val = (f->val * 127) / 10;
SendVolumeChangeMidiEvent(0,STR_val);
break;
case 2:
// MIC 楹﹀厠椋庨€氶亾
AW816_Set_Volume(MIC_VOL_MAP[f->val]);
break;
case 3:
// REV 娣峰搷閫氶亾
// 鍦ㄨ繖閲屽啓娣峰搷鎺у埗
AW816_Set_Reverb(f->val * 10);
break;
}
/* 即时生效同时更新 NVM 镜像;返回/关机时落盘 */
SyncMixerFadersToNvm();
}
// ============================================================
// 计算滑块Y坐标根据val值 0~10
// ??????Y????????val? 0~10??
// ============================================================
static uint16_t CalcSliderY(Fader_t *f)
{
uint16_t slider_h = 16;
uint16_t slider_h = (uint16_t)(MIXER_KNOB_R * 2);
uint16_t fill_h = (f->val * f->h) / 10;
if (fill_h > f->h) fill_h = f->h;
uint16_t slider_y = f->y + f->h - fill_h - (slider_h / 2);
@ -236,39 +162,10 @@ static uint16_t CalcSliderY(Fader_t *f)
return slider_y;
}
// ============================================================
// 绘制实心圆角矩形(用 FillByColor 逐行填充圆弧区域)
// 身体填充比 LCD_FillRoundRect 多延伸 1 像素,消除缝隙
// ============================================================
static void FillRoundRect_Solid(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t r, uint16_t color)
{
if (r > w / 2) r = w / 2;
if (r > h / 2) r = h / 2;
if (r == 0) { LCD_FillByColor(x, y, x + w, y + h, color); return; }
// 身体填充(中间 + 左右两侧直边)
LCD_FillByColor(x + r, y, x + w - r, y + h, color);
LCD_FillByColor(x, y + r, x + r, y + h - r, color);
LCD_FillByColor(x + w - r, y + r, x + w, y + h - r, color);
// 4 个圆弧角:从圆心向边缘逐行填充实心行
for (uint16_t dy = 0; dy < r; dy++) {
// dx = floor(sqrt(r² - (r-dy)²)) = floor(sqrt(2*r*dy - dy²))
uint16_t d = 2 * r * dy - dy * dy;
uint16_t dx = 0;
while ((dx + 1) * (dx + 1) <= d) dx++;
// 填充从 x+r-dx 到 x+r+1+1确保dx=0时覆盖中心像素
LCD_FillByColor(x + r - dx, y + dy, x + r + 1, y + dy + 1, color); // 顶左角
LCD_FillByColor(x + w - r, y + dy, x + w - r + dx + 1, y + dy + 1, color); // 顶右角
LCD_FillByColor(x + r - dx, y + h - 1 - dy, x + r + 1, y + h - dy, color); // 底左角
LCD_FillByColor(x + w - r, y + h - 1 - dy, x + w - r + dx + 1, y + h - dy, color); // 底右角
}
}
int CheckTouchFader(uint16_t x, uint16_t y)
{
for (int i = 0; i < 4; i++) {
Fader_t *f = &faders[i];
// 鎵╁ぇ瑙︽懜鍖哄煙锛屾彁鍗囨嫋鍔ㄤ綋锟?
if (x >= f->x - 10 && x <= f->x + f->w + 10 &&
y >= f->y && y <= f->y + f->h) {
return i;
@ -277,19 +174,18 @@ int CheckTouchFader(uint16_t x, uint16_t y)
return -1;
}
// ==================== <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD> ====================
// ==================== ????? ====================
void UI_Mixer_Init(void)
{
s_mixer_focus = -1;
UI_ClearFocus();
// LCD_WR_REG(0x28); // Display OFF
UI_DrawTop_TiaoYinTai();
LCD_FillByColor(0, 0, 240, 320, UI0902_BG_COLOR);
UI_DrawSubPageHeader((const uint8_t*)"\xB5\xF7\xD2\xF4\xCC\xA8");
DrawAllFaders();
pCurrentTouch_Area = Touch_Btn;
// LCD_WR_REG(0x29); // Display ON/
pCurrentTouch_Area = Touch_Mixer_Areas;
}
// ==================== <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>֣<EFBFBD><EFBFBD><EFBFBD> ====================
// ==================== ???????? ====================
void UI_Mixer_Process(DisplayTaskMessage_Type msg)
{
uint16_t tx,ty;
@ -300,7 +196,7 @@ void UI_Mixer_Process(DisplayTaskMessage_Type msg)
tx = msg.HiByte;
ty = msg.LoByte;
// 1. <EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 1. ?????????
fader_idx = CheckTouchFader(tx, ty);
if (fader_idx >= 0)
{
@ -308,15 +204,15 @@ void UI_Mixer_Process(DisplayTaskMessage_Type msg)
return;
}
// 2. <EFBFBD>ٴ<EFBFBD><EFBFBD><EFBFBD> ȡ<><C8A1> / ȷ<><C8B7> <20><>ť
// 2. 返回 → 设置入口
for(uint8_t i=0; i<TOUCH_BTN_NUM; i++)
{
if( tx >= Touch_Btn[i].x_min && tx <= Touch_Btn[i].x_max &&
ty >= Touch_Btn[i].y_min && ty <= Touch_Btn[i].y_max )
{
// <20><>ť<EFBFBD><C5A5><EFBFBD><EFBFBD>¼<EFBFBD>
if(Touch_Btn[i].ID == 0)
{
if( tx >= Touch_Mixer_Areas[i].x_min && tx <= Touch_Mixer_Areas[i].x_max &&
ty >= Touch_Mixer_Areas[i].y_min && ty <= Touch_Mixer_Areas[i].y_max )
{
if (Touch_Mixer_Areas[i].ID == GUI_CANCEL) {
SyncMixerFadersToNvm();
drv_nvm_save_to_flash();
MenuPage_SystemSetting_Proc();
}
break;
@ -326,21 +222,8 @@ void UI_Mixer_Process(DisplayTaskMessage_Type msg)
break;
case MSG_ID_EC_VOL:
// //LCD_ShowString(200, 0, Num_To_String(msg.DataU16[1],buff,3), RED, WHITE, 16, 0);
// uint8_t vol = msg.DataU16[1];
// uint8_t level;
// if (vol <= 5) level = 0;
// else if (vol <= 35) level = 1;
// else if (vol <= 65) level = 2;
// else if (vol <= 95) level = 3;
// else if (vol <= 115) level = 4;
// else level = 5;
// //Draw_Volume_Bar(5, 5, level, 1, WHITE, GRAY);
// uint8_t mMasterSysExVolume[12] = { 0xF0, 0x41, 0x00, 0x42, 0x12, 0x40, 0x00, 0x04, 0x64, 0x00, 0x00,0xF7};
// memset(mMasterSysExVolume+8,msg.DataU16[1],1);
// SendMidiDataToDreamDSP(mMasterSysExVolume,12);
//
// ResetAutoPowerCount();
Draw_Volume_Bar(UI0902_VOL_X, UI0902_VOL_Y, msg.HiByte, 1, WHITE, GRAY);
ResetAutoPowerCount();
break;
}
}

View File

@ -1,17 +1,12 @@
#ifndef __UI_MIXER_H__
#define __UI_MIXER_H__
static void DrawFaderGrooveAt(Fader_t *f, uint16_t y_start, uint16_t y_end);
static void DrawFaderSlider(Fader_t *f, uint16_t slider_y);
void UpdateFaderByTouch(int idx, uint16_t y);
static uint16_t CalcSliderY(Fader_t *f);
static void FillRoundRect_Solid(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t r, uint16_t color);
int CheckTouchFader(uint16_t x, uint16_t y);
void UI_Mixer_Init(void);
void UI_Mixer_Process(DisplayTaskMessage_Type msg);
#endif
#endif

View File

@ -1,149 +1,82 @@
#include "includes.h"
// ==============================
// 按键界面配置参数
// ==============================
#define BTN_Y_START 115 // 按键Y轴起始坐标
#define BTN_HEIGHT 80 // 按键高度
#define BTN_WIDTH 220 // 按键宽度
#define BTN_GAP 5 // 按键之间的间距
#define BTN_RADIUS 6 // 圆角半径
// 按键颜色配置
#define BTN_COLOR_CANCEL 0x4A4A // 取消按键背景色
#define BTN_COLOR_CONFIRM 0x03B7 // 确认按键背景色
#define BTN_TEXT_COLOR 0xFFFF // 按键字体颜色
#define BTN_TEXT_SIZE 24 // 按键文字字号
/* 0904 / 0902-08<EFBC9A>?+ 标题「恢复出厂设置<E8AEBE>? 竖排 确认(<28>? / 取消(<28>?,无底栏 */
/* 确认/取消用预渲染位图避免字库码点错位显示为「缺哮<E7BCBA>?*/
extern const Touch_AreaTypeDef *pCurrentTouch_Area;
const Touch_AreaTypeDef Touch_Restore_Areas[] =
{
// Xmin, Xmax, Ymin, Ymax, flag, Value, ID, action
{ 0, 50, 0, 50, 0, 0, 0, NULL },
{ 10, 10+BTN_WIDTH, BTN_Y_START, BTN_Y_START+BTN_HEIGHT, 0, 1, 1, NULL },
{ 10, 10+BTN_WIDTH, BTN_Y_START, BTN_Y_START+BTN_HEIGHT, 0, 2, 0, NULL },
{ 0, 44, 0, 40, 0, 0, GUI_CANCEL, NULL },
{ UI0902_RESTORE_BTN_X,
(uint16_t)(UI0902_RESTORE_BTN_X + UI0902_RESTORE_BTN_W - 1),
UI0902_RESTORE_BTN_Y0,
(uint16_t)(UI0902_RESTORE_BTN_Y0 + UI0902_RESTORE_BTN_H - 1),
0, 0, GUI_CONFIRM, NULL },
{ UI0902_RESTORE_BTN_X,
(uint16_t)(UI0902_RESTORE_BTN_X + UI0902_RESTORE_BTN_W - 1),
UI0902_RESTORE_BTN_Y1,
(uint16_t)(UI0902_RESTORE_BTN_Y1 + UI0902_RESTORE_BTN_H - 1),
0, 0, GUI_CANCEL, NULL },
};
#define TOUCH_AREA_SYSTEMSETTING_NUM (sizeof(Touch_Restore_Areas)/sizeof(Touch_AreaTypeDef))
#define TOUCH_AREA_RESTORE_NUM (sizeof(Touch_Restore_Areas)/sizeof(Touch_AreaTypeDef))
void UI_Draw_Buttons(void)
#define RESTORE_TXT_W 50
#define RESTORE_TXT_H 24
static void UI_Restore_DrawButton(uint16_t y, uint16_t bg, const unsigned char *label)
{
// LCD_FillByColor(10, 270, 220, 320, BLACK);
LCD_FillRoundRect(
10,
BTN_Y_START,
BTN_WIDTH,
BTN_HEIGHT,
BTN_RADIUS,
BTN_COLOR_CANCEL
);
LCD_ShowChinese_AutoAlign(
10, 10 + BTN_WIDTH,
BTN_Y_START + (BTN_HEIGHT - BTN_TEXT_SIZE)/2,
(uint8_t*)"\xC8\xB7\xB6\xA8\x00",
LCD_ALIGN_CENTER,
BTN_TEXT_COLOR,
BTN_COLOR_CANCEL,
0,
BTN_TEXT_SIZE
);
LCD_FillRoundRect(
10,
BTN_Y_START+BTN_HEIGHT+BTN_GAP,
BTN_WIDTH,
BTN_HEIGHT,
BTN_RADIUS,
BTN_COLOR_CONFIRM
);
LCD_ShowChinese_AutoAlign(
10, 10 + BTN_WIDTH,
BTN_Y_START + BTN_HEIGHT + (BTN_HEIGHT - BTN_TEXT_SIZE)/2,
(uint8_t*)"\xC8\xB1\xCF\xF8\x00",
LCD_ALIGN_CENTER,
BTN_TEXT_COLOR,
BTN_COLOR_CONFIRM,
0,
BTN_TEXT_SIZE
);
}
#define TOP_TITLE_X1 0
#define TOP_TITLE_X2 240
#define TOP_TITLE_Y1 0
#define TOP_TITLE_Y2 35
#define TOP_TITLE_BG_COLOR BLACK // <20><><EFBFBD><EFBFBD>ɫ
#define TOP_TITLE_TEXT_COLOR WHITE // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
#define TOP_TITLE_FONT_SIZE 13 // 标题字号
#define TOP_TITLE_ALIGN LCD_ALIGN_CENTER // <20><><EFBFBD><EFBFBD>
// ==============================
// <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2A3BA><EFBFBD><EFBFBD>̨
// ==============================
void UI_DrawTop_Restore(void)
{
//const uint16_t btn_color = /*DARKLGRAY*/0x2988; // 深灰<E6B7B1>?????
// <20><>ˢ<EFBFBD><CBA2>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
//LCD_FillByColor(TOP_TITLE_X1, TOP_TITLE_Y1, TOP_TITLE_X2, TOP_TITLE_Y2, TOP_TITLE_BG_COLOR);
LCD_FillByColor(0, 0, 240, 320, TOP_TITLE_BG_COLOR);
//LCD_DrawLine(0, 30, 240, 30, btn_color);
LCD_WR_PIC(10,0 ,40,31,gImage_Return);
// <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD>16<31><36><EFBFBD>֣<EFBFBD>
LCD_ShowChinese_AutoAlign(
TOP_TITLE_X1, TOP_TITLE_X2, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
TOP_TITLE_Y1 + (TOP_TITLE_Y2 - TOP_TITLE_Y1 - TOP_TITLE_FONT_SIZE)/2, // <20><>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD>
(uint8_t*)"\xBB\xD6\xB8\xB4\xB3\xF6\xB3\xA7\xC9\xE8\xD6\xC3", // <20><><EFBFBD><EFBFBD>̨
TOP_TITLE_ALIGN,
TOP_TITLE_TEXT_COLOR,
TOP_TITLE_BG_COLOR,
0,
TOP_TITLE_FONT_SIZE
);
uint16_t tx = (uint16_t)(UI0902_RESTORE_BTN_X + (UI0902_RESTORE_BTN_W - RESTORE_TXT_W) / 2);
uint16_t ty = (uint16_t)(y + (UI0902_RESTORE_BTN_H - RESTORE_TXT_H) / 2);
LCD_FillRoundRect(UI0902_RESTORE_BTN_X, y,
UI0902_RESTORE_BTN_W, UI0902_RESTORE_BTN_H,
UI0902_RADIUS_CARD, bg);
LCD_WR_PIC_Trans(tx, ty, RESTORE_TXT_W, RESTORE_TXT_H, label, BLACK);
}
void UI_Restore_Select_Init(void)
{
// LCD_WR_REG(0x28); // Display OFF
UI_DrawTop_Restore();
UI_Draw_Buttons();
pCurrentTouch_Area = Touch_Restore_Areas;
// LCD_WR_REG(0x29); // Display ON
UI_ClearFocus();
LCD_FillByColor(0, 0, 240, 320, UI0902_BG_COLOR);
UI_DrawSubPageHeader((const uint8_t *)"\xBB\xD6\xB8\xB4\xB3\xF6\xB3\xA7\xC9\xE8\xD6\xC3");
UI_Restore_DrawButton(UI0902_RESTORE_BTN_Y0, UI0902_ROW_BG,
gImage_UI0902_Txt_Confirm_50x24);
UI_Restore_DrawButton(UI0902_RESTORE_BTN_Y1, COLOR_GRAD_MID,
gImage_UI0902_Txt_Cancel_50x24);
pCurrentTouch_Area = Touch_Restore_Areas;
}
void UI_Restore_Select_Process(DisplayTaskMessage_Type msg)
{
switch(msg.MessageType)
{
case MSG_ID_TOUCH :
for(uint8_t k=0; k<TOUCH_AREA_SYSTEMSETTING_NUM; k++)
{
if( msg.HiByte >= pCurrentTouch_Area[k].x_min &&
msg.HiByte <= pCurrentTouch_Area[k].x_max &&
msg.LoByte >= pCurrentTouch_Area[k].y_min &&
msg.LoByte <= pCurrentTouch_Area[k].y_max )
{
switch(pCurrentTouch_Area[k].ID)
{
case 0:
MenuPage_Setting_Proc();
break;
case 1:
RestoreSetting();
MenuPage_Setting_Proc();
break;
case 2:
MenuPage_Setting_Proc();
break;
}
ResetAutoPowerCount();
}
}
break;
}
switch (msg.MessageType)
{
case MSG_ID_TOUCH:
for (uint8_t k = 0; k < TOUCH_AREA_RESTORE_NUM; k++)
{
if (msg.HiByte >= pCurrentTouch_Area[k].x_min &&
msg.HiByte <= pCurrentTouch_Area[k].x_max &&
msg.LoByte >= pCurrentTouch_Area[k].y_min &&
msg.LoByte <= pCurrentTouch_Area[k].y_max)
{
switch (pCurrentTouch_Area[k].ID)
{
case GUI_CANCEL:
MenuPage_Setting_Proc();
break;
case GUI_CONFIRM:
RestoreSetting();
MenuPage_Setting_Proc();
break;
default:
break;
}
ResetAutoPowerCount();
break;
}
}
break;
default:
break;
}
}

View File

@ -1,249 +1,145 @@
#include "includes.h"
// ==============================
// <20><>ť<EFBFBD><C5A5><EFBFBD><EFBFBD>
// ==============================
#define BTN_Y_START 275 // <20><>ť<EFBFBD><C5A5>ʼY
#define BTN_HEIGHT 40 // <20><>ť<EFBFBD>߶<EFBFBD>
#define BTN_WIDTH 105 // <20><>ť<EFBFBD><C5A5><EFBFBD>
#define BTN_GAP 5 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ť<EFBFBD>м<EFBFBD><D0BC><EFBFBD>
#define BTN_RADIUS 6 // Բ<><D4B2>
// <20><>ɫ
#define BTN_COLOR_CANCEL 0x4A4A // <20><>ɫȡ<C9AB><C8A1>
#define BTN_COLOR_CONFIRM 0x03B7 // <20><>ɫȷ<C9AB><C8B7>
#define BTN_TEXT_COLOR 0xFFFF // <20><>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>
#define BTN_TEXT_SIZE 16
/* 0904 / 0902-07 ??????? + ?? + ????????? */
extern const Touch_AreaTypeDef *pCurrentTouch_Area;
const Touch_AreaTypeDef Touch_SystemSetting_Areas[] =
{
// Xmin, Xmax, Ymin, Ymax, flag, Value, ID, action
{ 115, 170, 110, 170, -1, 0, GUI_BLUETOOTH_SW, NULL },
{ 170, 225, 110, 170, 1, 0, GUI_BLUETOOTH_SW, NULL },
{ 115, 170, 175, 235, -1, 0, GUI_AUTOCLOSE, NULL },
{ 170, 225, 175, 235, 1, 0, GUI_AUTOCLOSE, NULL },
{ 115, 170, 240, 300, -1, 0, GUI_RESTORE, NULL },
{ 170, 225, 240, 300, 1, 0, GUI_RESTORE, NULL },
// { 15, 15+BTN_WIDTH, BTN_Y_START, BTN_Y_START+BTN_HEIGHT, 0, 0, GUI_CANCEL, NULL },
// { 15+BTN_WIDTH+BTN_GAP, 15+BTN_WIDTH*2+BTN_GAP, BTN_Y_START, BTN_Y_START+BTN_HEIGHT, 0, 1, GUI_CONFIRM, NULL },
{ 0, 50, 0, 50, 0, 0, 0, NULL },
/* ?? */
{ 0, 44, 0, 40, 0, 0, GUI_CANCEL, NULL },
/* ???? */
{ UI0902_SET_ROW_X, (uint16_t)(UI0902_SET_ROW_X + UI0902_SET_ROW_W / 2 - 1),
(uint16_t)(UI0902_SET_ROW_Y0 + UI0902_SET_ROW_PITCH),
(uint16_t)(UI0902_SET_ROW_Y0 + UI0902_SET_ROW_PITCH + UI0902_SET_ROW_H - 1),
-1, 0, GUI_BLUETOOTH_SW, NULL },
{ (uint16_t)(UI0902_SET_ROW_X + UI0902_SET_ROW_W / 2),
(uint16_t)(UI0902_SET_ROW_X + UI0902_SET_ROW_W - 1),
(uint16_t)(UI0902_SET_ROW_Y0 + UI0902_SET_ROW_PITCH),
(uint16_t)(UI0902_SET_ROW_Y0 + UI0902_SET_ROW_PITCH + UI0902_SET_ROW_H - 1),
1, 0, GUI_BLUETOOTH_SW, NULL },
/* ?????? */
{ UI0902_SET_ROW_X, (uint16_t)(UI0902_SET_ROW_X + UI0902_SET_ROW_W / 2 - 1),
(uint16_t)(UI0902_SET_ROW_Y0 + UI0902_SET_ROW_PITCH * 2),
(uint16_t)(UI0902_SET_ROW_Y0 + UI0902_SET_ROW_PITCH * 2 + UI0902_SET_ROW_H - 1),
-1, 0, GUI_AUTOCLOSE, NULL },
{ (uint16_t)(UI0902_SET_ROW_X + UI0902_SET_ROW_W / 2),
(uint16_t)(UI0902_SET_ROW_X + UI0902_SET_ROW_W - 1),
(uint16_t)(UI0902_SET_ROW_Y0 + UI0902_SET_ROW_PITCH * 2),
(uint16_t)(UI0902_SET_ROW_Y0 + UI0902_SET_ROW_PITCH * 2 + UI0902_SET_ROW_H - 1),
1, 0, GUI_AUTOCLOSE, NULL },
/* ???? */
{ UI0902_SET_ROW_X, (uint16_t)(UI0902_SET_ROW_X + UI0902_SET_ROW_W - 1),
(uint16_t)(UI0902_SET_ROW_Y0 + UI0902_SET_ROW_PITCH * 3),
(uint16_t)(UI0902_SET_ROW_Y0 + UI0902_SET_ROW_PITCH * 3 + UI0902_SET_ROW_H - 1),
0, 0, GUI_RESTORE, NULL },
};
#define TOUCH_AREA_SYSTEMSETTING_NUM (sizeof(Touch_SystemSetting_Areas)/sizeof(Touch_AreaTypeDef))
GUI_SWITCH mGuiData_SystemSETTING[] = {
{ 0, 0, 2, GUI_VERSION}, // 0
{ 0, 0, 1, GUI_BLUETOOTH_SW},
{ 0, 1, 3, GUI_AUTOCLOSE},
{ 0, 0, 2, GUI_VERSION},
{ 1, 0, 1, GUI_BLUETOOTH_SW}, /* 默认开;开机由 NVM BluetoothSW 覆盖 */
/* 手册15/30/45/60 分钟 + 不自动;默认 15 分钟(index 0) */
{ 0, 0, 4, GUI_AUTOCLOSE},
{ 0, 0, 1, GUI_RESTORE},
};
LEBEL_UI SystemSetting[] =
{
{15, 230,35+10,60, (const uint8_t*)"\xB9\xCC\xBC\xFE\xB0\xE6\xB1\xBE", LCD_ALIGN_LEFT, WHITE, BLACK, 13, LCD_ALIGN_CENTER, WHITE, BLACK, 11, GUI_VERSION},
{15, 230,95+10+5,60, (const uint8_t*)"\xC0\xB6\xD1\xC0\xC1\xB4\xBD\xD3", LCD_ALIGN_LEFT, WHITE, BLACK, 13, LCD_ALIGN_CENTER, WHITE, BLACK, 11, GUI_BLUETOOTH_SW},
{15, 230,160+10+5,60,(const uint8_t*)"\xD7\xD4\xB6\xAF\xB9\xD8\xBB\xFA", LCD_ALIGN_LEFT, WHITE, BLACK, 13, LCD_ALIGN_CENTER, WHITE, BLACK, 11, GUI_AUTOCLOSE},
{15, 230,225+10+5,60,(const uint8_t*)"\xBB\xD6\xB8\xB4\xB3\xF6\xB3\xA7\xC9\xE8\xD6\xC3", LCD_ALIGN_LEFT, WHITE, BLACK, 13, LCD_ALIGN_CENTER, WHITE, BLACK, 11, GUI_RESTORE},
{UI0902_SET_ROW_X, UI0902_SET_ROW_W, UI0902_SET_ROW_Y0,
UI0902_SET_ROW_H, (const uint8_t*)"\xB9\xCC\xBC\xFE\xB0\xE6\xB1\xBE",
LCD_ALIGN_LEFT, WHITE, BLACK, UI0902_SET_ROW_FONT,
LCD_ALIGN_CENTER, WHITE, BLACK, UI0902_FONT_LABEL, GUI_VERSION},
{UI0902_SET_ROW_X, UI0902_SET_ROW_W, (uint16_t)(UI0902_SET_ROW_Y0 + UI0902_SET_ROW_PITCH),
UI0902_SET_ROW_H, (const uint8_t*)"\xC0\xB6\xD1\xC0\xC1\xAC\xBD\xD3",
LCD_ALIGN_LEFT, WHITE, BLACK, UI0902_SET_ROW_FONT,
LCD_ALIGN_CENTER, WHITE, BLACK, UI0902_FONT_LABEL, GUI_BLUETOOTH_SW},
{UI0902_SET_ROW_X, UI0902_SET_ROW_W, (uint16_t)(UI0902_SET_ROW_Y0 + UI0902_SET_ROW_PITCH * 2),
UI0902_SET_ROW_H, (const uint8_t*)"\xD7\xD4\xB6\xAF\xB9\xD8\xBB\xFA",
LCD_ALIGN_LEFT, WHITE, BLACK, UI0902_SET_ROW_FONT,
LCD_ALIGN_CENTER, WHITE, BLACK, UI0902_FONT_LABEL, GUI_AUTOCLOSE},
{UI0902_SET_ROW_X, UI0902_SET_ROW_W, (uint16_t)(UI0902_SET_ROW_Y0 + UI0902_SET_ROW_PITCH * 3),
UI0902_SET_ROW_H, (const uint8_t*)"\xBB\xD6\xB8\xB4\xB3\xF6\xB3\xA7\xC9\xE8\xD6\xC3",
LCD_ALIGN_LEFT, WHITE, BLACK, UI0902_SET_ROW_FONT,
LCD_ALIGN_CENTER, WHITE, BLACK, UI0902_FONT_LABEL, GUI_RESTORE},
};
// ==============================
// <20><><EFBFBD>Ƶײ<C6B5><D7B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ť
// ==============================
void UI_Draw_Bottom_Buttons(void)
{
LCD_FillByColor(0, 270, 240, 320, BLACK);
// ȡ<><C8A1><EFBFBD><EFBFBD>ť<EFBFBD><C5A5><EFBFBD><EFBFBD>
LCD_FillRoundRect(
15,
BTN_Y_START,
BTN_WIDTH,
BTN_HEIGHT,
BTN_RADIUS,
BTN_COLOR_CANCEL
);
LCD_ShowChinese_AutoAlign(
15, 15 + BTN_WIDTH,
BTN_Y_START + (BTN_HEIGHT - BTN_TEXT_SIZE)/2,
(uint8_t*)"\xC8\xB1\xCF\xF8\x00",
LCD_ALIGN_CENTER,
BTN_TEXT_COLOR,
BTN_COLOR_CANCEL,
0,
BTN_TEXT_SIZE
);
// ȷ<><C8B7><EFBFBD><EFBFBD>ť<EFBFBD><C5A5><EFBFBD>ң<EFBFBD>
LCD_FillRoundRect(
15 + BTN_WIDTH + BTN_GAP,
BTN_Y_START,
BTN_WIDTH,
BTN_HEIGHT,
BTN_RADIUS,
BTN_COLOR_CONFIRM
);
LCD_ShowChinese_AutoAlign(
15 + BTN_WIDTH + BTN_GAP,
15 + BTN_WIDTH*2 + BTN_GAP,
BTN_Y_START + (BTN_HEIGHT - BTN_TEXT_SIZE)/2,
(uint8_t*)"\xC8\xB7\xB6\xA8\x00",
LCD_ALIGN_CENTER,
BTN_TEXT_COLOR,
BTN_COLOR_CONFIRM,
0,
BTN_TEXT_SIZE
);
}
// ==============================
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򣨹̶<F2A3A8B9><CCB6><EFBFBD>Χ<EFBFBD><CEA7>
// ==============================
#define TOP_TITLE_X1 0
#define TOP_TITLE_X2 240
#define TOP_TITLE_Y1 0
#define TOP_TITLE_Y2 35
#define TOP_TITLE_BG_COLOR BLACK // <20><><EFBFBD><EFBFBD>ɫ
#define TOP_TITLE_TEXT_COLOR WHITE // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
#define TOP_TITLE_FONT_SIZE 16 // <20><><EFBFBD><EFBFBD><EFBFBD>С
#define TOP_TITLE_ALIGN LCD_ALIGN_CENTER // <20><><EFBFBD><EFBFBD>
// ==============================
// <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2A3BA><EFBFBD><EFBFBD>̨
// ==============================
void UI_DrawTop_TiaoYinTai(void)
{
LCD_FillByColor(0, 0, 240, 320, TOP_TITLE_BG_COLOR);
LCD_WR_PIC(10,0 ,40,31,gImage_Return);
// <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD>16<31><36><EFBFBD>֣<EFBFBD>
LCD_ShowChinese_AutoAlign(
TOP_TITLE_X1, TOP_TITLE_X2, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
TOP_TITLE_Y1 + (TOP_TITLE_Y2 - TOP_TITLE_Y1 - TOP_TITLE_FONT_SIZE)/2, // <20><>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD>
(uint8_t*)"\xB5\xF7\xD2\xF4\xCC\xA8", // <20><><EFBFBD><EFBFBD>̨
TOP_TITLE_ALIGN,
TOP_TITLE_TEXT_COLOR,
TOP_TITLE_BG_COLOR,
0,
TOP_TITLE_FONT_SIZE
);
}
// ==============================
// <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⣺ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>
// ==============================
void UI_DrawTop_SystemSetting(void)
{
LCD_FillByColor(0, 0, 240, 320, TOP_TITLE_BG_COLOR);
LCD_WR_PIC(10,0 ,40,31,gImage_Return);
// <20><>ʾ<EFBFBD><CABE>ϵͳ<CFB5><CDB3><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD>С<EFBFBD>16<31><36><EFBFBD>֣<EFBFBD>
LCD_ShowChinese_AutoAlign(
TOP_TITLE_X1, TOP_TITLE_X2,
TOP_TITLE_Y1 + (TOP_TITLE_Y2 - TOP_TITLE_Y1 - TOP_TITLE_FONT_SIZE)/2,
(uint8_t*)"\xCF\xB5\xCD\xB3\xC9\xE8\xD6\xC3", // ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>
TOP_TITLE_ALIGN,
TOP_TITLE_TEXT_COLOR,
TOP_TITLE_BG_COLOR,
0,
TOP_TITLE_FONT_SIZE
);
}
void DrawSystemSetting(void)
{
Draw_System_Item_List(&SystemSetting[GUI_VERSION],&mGuiData_SystemSETTING[GUI_VERSION]);
Draw_System_Item_List(&SystemSetting[GUI_BLUETOOTH_SW],&mGuiData_SystemSETTING[GUI_BLUETOOTH_SW]);
Draw_System_Item_List(&SystemSetting[GUI_AUTOCLOSE],&mGuiData_SystemSETTING[GUI_AUTOCLOSE]);
Draw_System_Item_List(&SystemSetting[GUI_RESTORE],&mGuiData_SystemSETTING[GUI_RESTORE]);
Draw_System_Item_List(&SystemSetting[GUI_VERSION], &mGuiData_SystemSETTING[GUI_VERSION]);
Draw_System_Item_List(&SystemSetting[GUI_BLUETOOTH_SW], &mGuiData_SystemSETTING[GUI_BLUETOOTH_SW]);
Draw_System_Item_List(&SystemSetting[GUI_AUTOCLOSE], &mGuiData_SystemSETTING[GUI_AUTOCLOSE]);
Draw_System_Item_List(&SystemSetting[GUI_RESTORE], &mGuiData_SystemSETTING[GUI_RESTORE]);
}
// ==============================
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ==============================
void Touch_SystemSettingAction(int8_t FLAG, uint8_t ID, uint8_t areaIndex, uint8_t value)
{
uint16_t last_value;
uint16_t last_value;
(void)areaIndex;
(void)value;
if (ID == GUI_CANCEL)
{
MenuPage_SystemSetting_Proc(); /* ? 0902-11 ???? */
return;
}
if(ID == 0)
{
MenuPage_SystemSetting_Proc();
}
last_value = mGuiData_SystemSETTING[ID].Current;
switch (ID)
{
case GUI_BLUETOOTH_SW:
mGuiData_SystemSETTING[ID].Current = !mGuiData_SystemSETTING[ID].Current;
if (!UI_SetFocus(ID))
RefreshSystemSetting(last_value, &SystemSetting[ID], &mGuiData_SystemSETTING[ID]);
break;
// --------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>
// --------------------------
last_value = mGuiData_SystemSETTING[ID].Current;
switch(ID)
{
case GUI_BLUETOOTH_SW:
GUI_Item_AjustValue(&mGuiData_SystemSETTING[ID], FLAG);
if (!UI_SetFocus(ID))
RefreshSystemSetting(last_value, &SystemSetting[ID], &mGuiData_SystemSETTING[ID]);
break;
case GUI_AUTOCLOSE:
GUI_Item_AjustLoopValue(&mGuiData_SystemSETTING[ID], FLAG >= 0 ? 1 : -1);
if (!UI_SetFocus(ID))
RefreshSystemSetting(last_value, &SystemSetting[ID], &mGuiData_SystemSETTING[ID]);
break;
case GUI_AUTOCLOSE:
GUI_Item_AjustLoopValue(&mGuiData_SystemSETTING[ID], FLAG);
if (!UI_SetFocus(ID))
RefreshSystemSetting(last_value, &SystemSetting[ID], &mGuiData_SystemSETTING[ID]);
break;
case GUI_RESTORE:
MenuPage_Restore_Proc();
break;
case GUI_RESTORE:
// GUI_Item_AjustValue(&mGuiData_SystemSETTING[ID], FLAG);
// RefreshSystemSetting(last_value, &SystemSetting[ID], &mGuiData_SystemSETTING[ID]);
MenuPage_Restore_Proc();
break;
}
default:
break;
}
}
void UI_Setting_Init(void)
{
UI_ClearFocus();
// LCD_WR_REG(0x28); // Display OFF
UI_DrawTop_SystemSetting();
DrawSystemSetting();
pCurrentTouch_Area = Touch_SystemSetting_Areas;
// LCD_WR_REG(0x29); // Display ON
LCD_FillByColor(0, 0, 240, 320, UI0902_BG_COLOR);
UI_DrawSubPageHeader((const uint8_t *)"\xCF\xB5\xCD\xB3\xC9\xE8\xD6\xC3");
DrawSystemSetting();
pCurrentTouch_Area = Touch_SystemSetting_Areas;
}
void UI_Setting_Process(DisplayTaskMessage_Type msg)
{
switch(msg.MessageType)
{
case MSG_ID_TOUCH :
for(uint8_t k=0; k<TOUCH_AREA_SYSTEMSETTING_NUM; k++)
{
if( msg.HiByte >= pCurrentTouch_Area[k].x_min && msg.HiByte <= pCurrentTouch_Area[k].x_max &&
msg.LoByte >= pCurrentTouch_Area[k].y_min && msg.LoByte <= pCurrentTouch_Area[k].y_max )
{
Touch_SystemSettingAction(pCurrentTouch_Area[k].Flag,pCurrentTouch_Area[k].ID,k,0);
ResetAutoPowerCount();
}
}
break;
case MSG_ID_EC_VOL:
// //LCD_ShowString(200, 0, Num_To_String(msg.DataU16[1],buff,3), RED, WHITE, 16, 0);
// uint8_t vol = msg.DataU16[1];
// uint8_t level;
// if (vol <= 5) level = 0;
// else if (vol <= 35) level = 1;
// else if (vol <= 65) level = 2;
// else if (vol <= 95) level = 3;
// else if (vol <= 115) level = 4;
// else level = 5;
// //Draw_Volume_Bar(5, 5, level, 1, WHITE, GRAY);
// uint8_t mMasterSysExVolume[12] = { 0xF0, 0x41, 0x00, 0x42, 0x12, 0x40, 0x00, 0x04, 0x64, 0x00, 0x00,0xF7};
// memset(mMasterSysExVolume+8,msg.DataU16[1],1);
// SendMidiDataToDreamDSP(mMasterSysExVolume,12);
//
// ResetAutoPowerCount();
break;
}
uint8_t k;
switch (msg.MessageType)
{
case MSG_ID_TOUCH:
for (k = 0; k < TOUCH_AREA_SYSTEMSETTING_NUM; k++)
{
if (msg.HiByte >= pCurrentTouch_Area[k].x_min &&
msg.HiByte <= pCurrentTouch_Area[k].x_max &&
msg.LoByte >= pCurrentTouch_Area[k].y_min &&
msg.LoByte <= pCurrentTouch_Area[k].y_max)
{
Touch_SystemSettingAction(pCurrentTouch_Area[k].Flag,
pCurrentTouch_Area[k].ID, k,
pCurrentTouch_Area[k].Value);
ResetAutoPowerCount();
break;
}
}
break;
default:
break;
}
}

View File

@ -1,15 +1,10 @@
#ifndef __UI_SETTING_H__
#define __UI_SETTING_H__
extern GUI_SWITCH mGuiData_SystemSETTING[];
extern LEBEL_UI SystemSetting[];
void UI_DrawTop_TiaoYinTai(void);
void UI_Setting_Init(void);
void UI_Setting_Process(DisplayTaskMessage_Type msg);
extern void UI_Draw_Bottom_Buttons(void);
#endif

View File

@ -7,105 +7,56 @@ static uint8_t Speed[6] = {0xF0, 0x51, 0x03, 0x00, 0x00, 0xF7};
void Draw_Tab_Mode_Menu(const LEBEL_UI *UI, GUI_SWITCH *Group)
{
// ===================== TAB 閰嶇疆鍙傛暟 =====================
const uint16_t tab_w = 80; // TAB瀹藉<E780B9>????
const uint16_t tab_h = 20; // TAB楂樺<E6A582>????
const uint8_t tab_r = 5; // 鍦嗚<E98DA6>????
//const uint8_t space = 3; // 闂<>?<3F>
const uint16_t start_x = UI->x; // 璧峰X
const uint16_t start_y = UI->y; // 璧峰Y
const uint16_t text_y = UI->y + 2; // 鏂囧<E98F82>????Y
/* 0819TAB 字号 110902紧凑圆角条选中常亮蓝文字垂直居中 */
const uint16_t tab_w = UI0902_TAB_W;
const uint16_t tab_h = UI0902_TAB_H;
const uint8_t tab_r = UI0902_RADIUS_TAB;
const uint8_t tab_font = UI0902_FONT_LABEL;
const uint16_t start_x = UI0902_MARGIN_X;
const uint16_t start_y = UI->y;
const uint16_t gap = UI0902_TAB_GAP;
const uint16_t text_y = start_y + (tab_h - tab_font) / 2;
const uint16_t inset = 3;
uint16_t color_sel_bg = COLOR_GRAD_MID;
uint16_t color_unsel_bg = UI0902_ROW_BG;
uint16_t color_text = UI->Text_fc;
uint16_t x1 = start_x;
uint16_t x2 = start_x + tab_w + gap;
// ===================== 棰滆壊瀹氫<E780B9>???? =====================
uint16_t color_sel_bg = UI_IsFocused(GUI_MODE_PARAM) ? COLOR_PRIMARY : COLOR_NORMAL_BG;
uint16_t color_unsel_bg = COLOR_NORMAL_BG;
uint16_t color_text = UI->Text_fc; // 鏂囧瓧棰滆<E6A3B0>??
// 鏄剧ず锛氳嚜鍔ㄤ即濂忓紑 / <20>?????
if(Group->Current == 1)
{
LCD_FillRoundRect(start_x,
start_y,
tab_w,
tab_h,
tab_r,
color_unsel_bg);
LCD_FillRoundRect(start_x+tab_w +10,
start_y,
tab_w,
tab_h,
tab_r,
color_sel_bg);
LCD_FillRoundRect(x1, start_y, tab_w, tab_h, tab_r, color_unsel_bg);
LCD_FillRoundRect(x2, start_y, tab_w, tab_h, tab_r, color_sel_bg);
LCD_ShowChinese_AutoAlign(
start_x,
start_x + tab_w,
text_y,
x1 + inset, x1 + tab_w - inset, text_y,
(const uint8_t*)"\xBD\xDA\xD7\xE0\xC0\xE0\xD0\xCD",
UI->Text_Align,
color_text,
color_unsel_bg,
0,
16
);
LCD_ALIGN_CENTER, color_text, color_unsel_bg, 0, tab_font);
LCD_ShowChinese_AutoAlign(
start_x + tab_w + 15,
start_x + tab_w + tab_w,
text_y,
x2 + inset, x2 + tab_w - inset, text_y,
(const uint8_t *)"\xB1\xBE\xB5\xD8\xC7\xFA\xC4\xBF",
UI->Text_Align,
color_text,
color_sel_bg,
0,
16
);
LCD_ALIGN_CENTER, color_text, color_sel_bg, 0, tab_font);
}
else
{
LCD_FillRoundRect(start_x,
start_y,
tab_w,
tab_h,
tab_r,
color_sel_bg);
LCD_FillRoundRect(start_x+tab_w +10,
start_y,
tab_w,
tab_h,
tab_r,
color_unsel_bg);
LCD_FillRoundRect(x1, start_y, tab_w, tab_h, tab_r, color_sel_bg);
LCD_FillRoundRect(x2, start_y, tab_w, tab_h, tab_r, color_unsel_bg);
LCD_ShowChinese_AutoAlign(
start_x,
start_x + tab_w,
text_y,
(const uint8_t*)"\xBD\xDA\xD7\xE0\xC0\xE0\xD0\xCD", //节<>?<3F><EFBFBD>?
UI->Text_Align,
color_text,
color_sel_bg,
0,
16
);
x1 + inset, x1 + tab_w - inset, text_y,
(const uint8_t*)"\xBD\xDA\xD7\xE0\xC0\xE0\xD0\xCD",
LCD_ALIGN_CENTER, color_text, color_sel_bg, 0, tab_font);
LCD_ShowChinese_AutoAlign(
start_x + tab_w + 15,
start_x + tab_w + tab_w,
text_y,
(const uint8_t *)"\xB1\xBE\xB5\xD8\xC7\xFA\xC4\xBF", //<2F>?地曲<E59CB0>?
UI->Text_Align,
color_text,
color_unsel_bg,
0,
16
);
x2 + inset, x2 + tab_w - inset, text_y,
(const uint8_t *)"\xB1\xBE\xB5\xD8\xC7\xFA\xC4\xBF",
LCD_ALIGN_CENTER, color_text, color_unsel_bg, 0, tab_font);
}
}
void Show_home_UI(void)
{
UI_ClearFocus();
LCD_FillByColor(0,0,240,320,BLACK);
LCD_FillByColor(0,0,240,320,UI0902_BG_COLOR);
label_top();
label_Tranzpose_ui(&UI_Label[GUI_TRANSPOSE], &mGuiData[GUI_TRANSPOSE]);
label_Speed_ui(&UI_Label[GUI_SPEED], &mGuiData[GUI_SPEED]);
@ -117,11 +68,25 @@ void Show_home_UI(void)
//LCD_BLK_Set();
}
/* 三模式主页互切:只重绘变化区,避免整屏清导致闪烁 */
void Show_home_UI_Diff(void)
{
const LEBEL_UI *mode = &UI_Label[GUI_MODE_PARAM];
UI_ClearFocus();
/* 清 TAB/标题条,避免万能↔普通/专业互切留下残影 */
LCD_FillByColor(mode->x, mode->y,
(uint16_t)(mode->x + mode->w),
(uint16_t)(mode->y + UI0902_TAB_H + 4),
UI0902_BG_COLOR);
label_ModeSelece_ui(mode, &mGuiData[GUI_MODE_PARAM]);
label_Tab_Select_ui(&UI_Label[GUI_PLAY_SECTION], &mGuiData[GUI_TAB_INDEX]);
}
int8_t delta = 0;
void Touch_Action(int8_t FLAG, uint8_t ID, uint8_t areaIndex,uint8_t value)
{
uint8_t last_value;
uint8_t midi_note_buff[4] = {0,};
NvmParam_Type * nvm = drv_nvm_param_ptr();
if(FLAG == 1 || FLAG == -1)
{
@ -157,25 +122,17 @@ void Touch_Action(int8_t FLAG, uint8_t ID, uint8_t areaIndex,uint8_t value)
{
switch(mGuiData[GUI_TAB_INDEX].Current)
{
case 2:
case 0: /* 万能:和弦走向转调触发 */
{
uint8_t midi = 0x3c;
midi += mGuiData[GUI_TRANSPOSE].Current;
AutoBandTop1_Note_On(midi,0x3c); // AutoBand 模块未加入工程
AutoBandTop1_Note_On(midi,0x3c);
}
break;
case 1:
{
AutoBandTop1_SetPiecePlayMode(1,0,480); // AutoBand 模块未加入工程
AutoBandTop1_StartWithNotes(midi_note_buff,GetChordNotesByType(KEY_ID_1629,chord_type_index_map[KEY_ID_1629].type,midi_note_buff));
AutoBandTop1_SetLoopMode(0,1);
}
break;
case 0:
{
AutoBandTop1_SetPiecePlayMode(1,0,480); // AutoBand 模块未加入工程
AutoBandTop1_StartWithNotes(midi_note_buff,GetChordNotesByType(KEY_ID_1629,chord_type_index_map[KEY_ID_1629].type,midi_note_buff));
}
case 1: /* 专业 */
case 2: /* 普通 */
/* 音师:快转调只换和弦音,伴奏不重头 */
Accomp_UpdatePlayingChord();
break;
}
}
@ -206,48 +163,43 @@ void Touch_Action(int8_t FLAG, uint8_t ID, uint8_t areaIndex,uint8_t value)
case GUI_MODE_PARAM:
{
GUI_SWITCH *pCurData =NULL;
uint8_t tab = (uint8_t)mGuiData[GUI_TAB_INDEX].Current;
if (tab == 0)
pCurData = &ParamGuiData[ALL_MODE_PARAM];
else if (mGuiData[GUI_AUTOBAND_SW].Current)
pCurData = &ParamGuiData[EXPRESS_MODE_PARAM];
else
pCurData = &ParamGuiData[SONG_MODE_PARAM];
switch(mGuiData[GUI_TAB_INDEX].Current)
{
case 0: case 1:
if(mGuiData[GUI_AUTOBAND_SW].Current)
{
pCurData = &ParamGuiData[EXPRESS_MODE_PARAM];
}
else
{
pCurData = &ParamGuiData[SONG_MODE_PARAM];
}
break;
case 2: pCurData = &ParamGuiData[ALL_MODE_PARAM]; break;
}
last_value = pCurData->Current;
GUI_Item_AjustLoopValue(pCurData, FLAG);
if (!UI_SetFocus(GUI_MODE_PARAM))
show_Param(&UI_Label[GUI_MODE_PARAM], pCurData);
switch(mGuiData[GUI_TAB_INDEX].Current)
{
case 0: case 1:
if(mGuiData[GUI_AUTOBAND_SW].Current)
{
AutoBandTop1_LoadPresetItemFromFlash(0);
}
else
{
AutoBandTop1_LoadPresetItemFromFlash(ParamGuiData[SONG_MODE_PARAM].Current);
}
break;
case 2: AutoBandTop1_LoadPresetItemFromFlash(ParamGuiData[ALL_MODE_PARAM].Current); break;
}
switch(mGuiData[GUI_TAB_INDEX].Current)
{
case 0: nvm->param.Param1 = ParamGuiData[SONG_MODE_PARAM].Current; break; // 姝屾<E5A79D>????
case 1: nvm->param.Param2 = ParamGuiData[EXPRESS_MODE_PARAM].Current;
break; // 涓撳<E6B693>????
case 2: nvm->param.Param3 = ParamGuiData[ALL_MODE_PARAM].Current; break; // 涓囪<E6B693>????
}
UI_ApplyToneAddress();
int ret = 0;
if (tab == 0)
ret = AutoBandTop1_LoadPresetItemFromFlash(ParamGuiData[ALL_MODE_PARAM].Current);
else if (mGuiData[GUI_AUTOBAND_SW].Current)
ret = AutoBandTop1_LoadPresetItemFromFlash(ParamGuiData[EXPRESS_MODE_PARAM].Current);
else
ret = AutoBandTop1_LoadPresetItemFromFlash(ParamGuiData[SONG_MODE_PARAM].Current);
if (ret != 0)
LOG_E("tone", "load preset failed tab=%d sw=%d ret=%d addr=0x%08X",
tab, mGuiData[GUI_AUTOBAND_SW].Current, ret, (unsigned)ADDRESS);
else
LOG_I("tone", "load preset ok tab=%d sw=%d name=%s addr=0x%08X",
tab, mGuiData[GUI_AUTOBAND_SW].Current,
AutoBandTop1_GetPresetName() ? AutoBandTop1_GetPresetName() : "?",
(unsigned)ADDRESS);
if (tab == 0)
nvm->param.Param3 = ParamGuiData[ALL_MODE_PARAM].Current;
else if (mGuiData[GUI_AUTOBAND_SW].Current)
nvm->param.Param2 = ParamGuiData[EXPRESS_MODE_PARAM].Current;
else
nvm->param.Param1 = ParamGuiData[SONG_MODE_PARAM].Current;
}
break;
case GUI_TIMBRE_SELECT:
@ -270,15 +222,15 @@ void Touch_Action(int8_t FLAG, uint8_t ID, uint8_t areaIndex,uint8_t value)
if(ID == GUI_AUTOBAND_SW)
{
/* 万能无节奏/本地 TAB忽略该触控 */
if (mGuiData[GUI_TAB_INDEX].Current == 0)
return;
if (mGuiData[ID].Current == value)
return;
mGuiData[ID].Current = value;
if(mGuiData[GUI_AUTOBAND_SW].Current)
{
ADDRESS = 0x0009EB5B;
}else
{
ADDRESS = 0x00000000;
}
StartFlag = 0;
AutoBandTop1_Stop();
UI_ReloadTonePreset();
if (!UI_SetFocus(GUI_MODE_PARAM))
label_ModeSelece_ui(&UI_Label[GUI_MODE_PARAM],&mGuiData[GUI_MODE_PARAM]);
return;
@ -298,6 +250,11 @@ void Touch_Action(int8_t FLAG, uint8_t ID, uint8_t areaIndex,uint8_t value)
Refresh_SectionSelect(last_value, &UI_Label[ID], &mGuiData[ID]);
return;
}
else if(ID == GUI_NAV_BAR)
{
UI_NavBar_Action(value);
return;
}
else if(ID==GUI_TAB_INDEX)
{
if(mGuiData[ID].Current != value)
@ -307,42 +264,28 @@ void Touch_Action(int8_t FLAG, uint8_t ID, uint8_t areaIndex,uint8_t value)
app_tm1629_all_on(LED_COLOR_G);
switch(mGuiData[ID].Current)
{
case 0:
case 0: /* 万能 → 3.bin / 本地→2.bin */
if(mGuiData[GUI_TAB_LAST_INDEX].Current == mGuiData[ID].Current)
break;
StartFlag = 0;
AutoBandTop1_Stop();
if(mGuiData[GUI_AUTOBAND_SW].Current)
{
ADDRESS = 0x0009EB5F;
}
else
{
ADDRESS = 0x00000000;
}
UI_ReloadTonePreset(); /* 切换模式必须换库,避免专业仍播万能数据 */
break;
case 1:
case 1: /* 专业 → 1.bin / 本地→2.bin */
if(mGuiData[GUI_TAB_LAST_INDEX].Current == mGuiData[ID].Current)
break;
StartFlag = 0;
AutoBandTop1_Stop();
if(mGuiData[GUI_AUTOBAND_SW].Current)
{
ADDRESS = 0x0009EB5F;
}
else
{
ADDRESS = 0x00000000;
}
UI_ReloadTonePreset();
break;
case 2:
case 2: /* 普通 → 1.bin */
if(mGuiData[GUI_TAB_LAST_INDEX].Current == mGuiData[ID].Current)
break;
StartFlag = 0;
AutoBandTop1_Stop();
ADDRESS = 0x0009598F;
UI_ReloadTonePreset();
break;
}
Refresh_TabSelect_ui(&UI_Label[ID], &mGuiData[ID]);
@ -364,14 +307,18 @@ void UI_SongMode_Init(void)
//mGuiData[GUI_AUTOBAND_SW].Current = 0;
mGuiData[GUI_TAB_INDEX].Current = 0;
mGuiData[GUI_TAB_LAST_INDEX].Current = mGuiData[GUI_TAB_INDEX].Current;
Show_home_UI();
UI_ReloadTonePreset(); /* TAB=万能 后再加载 3.bin */
/* 已在主页互切用差分;从 Idle/设置进入仍整页 */
if (CurrUIProcress == UI_SongMode_Process)
Show_home_UI_Diff();
else
Show_home_UI();
pCurrentTouch_Area = Touch_Areas;
}
void UI_SongMode_Process(DisplayTaskMessage_Type msg)
{
uint8_t midi_note_buff[4] = {0,};
NvmParam_Type * nvm = drv_nvm_param_ptr();
switch(msg.MessageType)
@ -385,8 +332,9 @@ void UI_SongMode_Process(DisplayTaskMessage_Type msg)
msg.LoByte >= pCurrentTouch_Area[k].y_min && msg.LoByte <= pCurrentTouch_Area[k].y_max )
{
hit = 1U;
LOG_I("UI", "song hit area=%u id=%u x=%u y=%u",
LOG_I("UI", "song hit area=%u id=%u val=%u x=%u y=%u",
(unsigned)k, (unsigned)pCurrentTouch_Area[k].ID,
(unsigned)pCurrentTouch_Area[k].Value,
(unsigned)msg.HiByte, (unsigned)msg.LoByte);
Touch_Action(pCurrentTouch_Area[k].Flag,pCurrentTouch_Area[k].ID,k,pCurrentTouch_Area[k].Value);
ResetAutoPowerCount();
@ -405,8 +353,8 @@ void UI_SongMode_Process(DisplayTaskMessage_Type msg)
break;
case MSG_ID_EC_VOL:
Send_volume(msg.ID);
Draw_Volume_Bar(5, 5, msg.HiByte, 1, WHITE, GRAY);
/* 主音量已在 MainTask 下发;此处只刷新条 */
Draw_Volume_Bar(UI0902_VOL_X, UI0902_VOL_Y, msg.HiByte, 1, WHITE, GRAY);
break;
case MSG_ID_TAP_SPEED:
@ -520,10 +468,8 @@ void UI_SongMode_Process(DisplayTaskMessage_Type msg)
USE_MIDI.Midi_6 += delta;
if(/*KEY_ID_1629 != 0 && */StartFlag && KEY_ID_1629 != 22 && KEY_ID_1629 != 23)
{
AutoBandTop1_SetPiecePlayMode(1,0,480);
AutoBandTop1_StartWithNotes(midi_note_buff,GetChordNotesByType(KEY_ID_1629,chord_type_index_map[KEY_ID_1629].type,midi_note_buff));
AutoBandTop1_SetLoopMode(0,1);
AutoBandTop1_StartWithNotes(midi_note_buff,GetChordNotesByType(KEY_ID_1629,chord_type_index_map[KEY_ID_1629].type,midi_note_buff));
/* 音师:快转调只换和弦音,伴奏不重头 */
Accomp_UpdatePlayingChord();
}
ResetAutoPowerCount();
}

View File

@ -1,287 +1,130 @@
#include "includes.h"
#define UI_MODE_SCREEN_WIDTH 240 // <20><>Ļ<EFBFBD><C4BB>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>LCD<43>޸<EFBFBD>
#define UI_MODE_SCREEN_HEIGHT 250 // <20><>Ļ<EFBFBD>߶ȣ<DFB6><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>LCD<43>޸<EFBFBD>
#define UI_MODE_BG_COLOR 0x1925 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭͼ<D4AD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
#define UI_MODE_LINE_COLOR DARKBLUE // <20>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD>ȱ<EFBFBD><C8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define UI_MODE_TEXT_COLOR 0xFFFF // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD><EFBFBD>ɫ
#define UI_MODE_FONT_SIZE 16 // 模式按钮字号MiSans 16
// ==============================
// <20><><EFBFBD>ɵ<EFBFBD><C9B5><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
// ==============================
#define MODE_AREA_START_Y 25 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ Y
#define MODE_AREA_END_Y 250 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Y
#define MODE_AREA_HEIGHT (MODE_AREA_END_Y - MODE_AREA_START_Y)
/* 0902-11 设置入口:调音台 / 系统设置 两大入口 + 底栏设置高亮 */
const Touch_AreaTypeDef Touch_SetingSelect_Areas[] = {
// Xmin, Xmax, Ymin, Ymax, flag, ID, action
{ 5, 235, 30, 140, 0, 0, GUI_SETING_SELECT1, NULL }, // <20><>һ<EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD>̨
{ 5, 235, 140, 250, 1, 0, GUI_SETING_SELECT3, NULL }, // <20>ڶ<EFBFBD><DAB6>У<EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>
{ 10, 50, 275, 340, 0,2, 5, NULL },
{ 70, 130, 275, 340, 0,0, 5, NULL },
{ 130, 170, 275, 340, 0,1, 5, NULL },
{ 190, 230, 275, 340, 0,3, 5, NULL },
/* 调音台卡片 */
{ UI0902_HUB_CARD_X, (uint16_t)(UI0902_HUB_CARD_X + UI0902_HUB_CARD_W - 1),
UI0902_HUB_CARD_Y0, (uint16_t)(UI0902_HUB_CARD_Y0 + UI0902_HUB_CARD_H - 1),
0, 0, GUI_SETING_SELECT1, NULL },
/* 系统设置卡片 */
{ UI0902_HUB_CARD_X, (uint16_t)(UI0902_HUB_CARD_X + UI0902_HUB_CARD_W - 1),
UI0902_HUB_CARD_Y1, (uint16_t)(UI0902_HUB_CARD_Y1 + UI0902_HUB_CARD_H - 1),
0, 0, GUI_SETING_SELECT3, NULL },
/* 底栏四键 */
{ 0, 69, 280, 319, 0, UI0902_NAV_UNIVERSAL, GUI_NAV_BAR, NULL },
{ 70, 129, 280, 319, 0, UI0902_NAV_NORMAL, GUI_NAV_BAR, NULL },
{ 130, 184, 280, 319, 0, UI0902_NAV_EXPERT, GUI_NAV_BAR, NULL },
{ 185, 239, 280, 319, 0, UI0902_NAV_SETTING, GUI_NAV_BAR, NULL },
};
#define TOUCH_AREA_SETING_SELECT_NUM (sizeof(Touch_SetingSelect_Areas)/sizeof(Touch_AreaTypeDef))
void Touch_Seting_Select_Action(int8_t FLAG, uint8_t ID, uint8_t areaIndex,uint8_t value)
static void UI_Hub_DrawCard(uint16_t y, const uint8_t *icon, uint16_t icon_w, uint16_t icon_h,
const uint8_t *title_gbk)
{
uint8_t last_value;
switch(ID)
{
case 0:
MenuPage_Mixer_Proc();
break;
// case 2: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><D4A4>
// MenuPage_FreeMode_Proc();
// break;
case 2:
MenuPage_Setting_Proc();
break;
case 5:
last_value = mGuiData[GUI_TAB_INDEX].Current;
uint16_t x = UI0902_HUB_CARD_X;
uint16_t w = UI0902_HUB_CARD_W;
uint16_t h = UI0902_HUB_CARD_H;
uint16_t cy = y + h / 2;
uint16_t text_y = y + (h - UI0902_HUB_FONT) / 2;
uint16_t icon_x = x + 22;
uint16_t icon_y = y + (h - icon_h) / 2;
mGuiData[GUI_TAB_INDEX].Current = value;
if(last_value != value)
{
switch(value)
{
case 0:
if(mGuiData[GUI_TAB_LAST_INDEX].Current == mGuiData[GUI_TAB_INDEX].Current)
break;
//AutoBandTop1_Stop(); // AutoBand 模块未加入工程
ADDRESS = 0x00000000;
//AutoBandTop1_LoadPresetItemFromFlash(0); // AutoBand 模块未加入工程
break;
case 1:
if(mGuiData[GUI_TAB_LAST_INDEX].Current == mGuiData[GUI_TAB_INDEX].Current)
break;
//AutoBandTop1_Stop(); // AutoBand 模块未加入工程
ADDRESS = 0x0000EB41;
//AutoBandTop1_LoadPresetItemFromFlash(0); // AutoBand 模块未加入工程
break;
case 2:
if(mGuiData[GUI_TAB_LAST_INDEX].Current == mGuiData[GUI_TAB_INDEX].Current)
break;
//AutoBandTop1_Stop();
ADDRESS = 0x000170EF;
break;
}
}
// switch(value)
// {
// case 0:
//
// MenuPage_SongMode_Proc();
// break;
// case 1:
// MenuPage_ExpertMode_Proc();
// break;
// case 2:
// MenuPage_FreeMode_Proc();
// break;
// }
Refresh_TabSelect_ui(&UI_Label[ID], &mGuiData[ID]);
break;
}
LCD_FillRoundRect(x, y, w, h, UI0902_RADIUS_CARD, UI0902_ROW_BG);
LCD_WR_PIC_Trans(icon_x, icon_y, icon_w, icon_h, icon, BLACK);
/* 标题相对卡片水平居中(略偏右给左侧图标留空) */
LCD_ShowChinese_AutoAlign(
x + 56, x + w - 36, text_y, title_gbk,
LCD_ALIGN_CENTER, WHITE, UI0902_ROW_BG, 0, UI0902_HUB_FONT);
LCD_DrawChevron_Right((uint16_t)(x + w - 24), cy, 6, 2, WHITE);
}
void Touch_Seting_Select_Action(int8_t FLAG, uint8_t ID, uint8_t areaIndex, uint8_t value)
{
(void)FLAG;
(void)areaIndex;
if (ID == GUI_NAV_BAR)
{
if (value == UI0902_NAV_SETTING)
return; /* 已在设置入口 */
UI_NavBar_Action(value);
return;
}
//// 1 = 2<><32><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>0 = 3<><33><EFBFBD><EFBFBD>ʾ
//#define USE_2_LINE_MODE 1
//
//void UI_DrawSysModeSelectScreen(void)
//{
// uint16_t y1, y2;
//
// // 1. <20><><EFBFBD><EFBFBD>
// LCD_FillByColor(0,0,240,320,BLACK);
// LCD_FillRoundRect(5,5,240-5,320-5,10,UI_MODE_BG_COLOR);
//
// // ==============================
// // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> / <20><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
// // ==============================
// #if (USE_2_LINE_MODE == 1)
// // 2<>У<EFBFBD><D0A3><EFBFBD> 25~250 ֮<><D6AE><EFBFBD><EFBFBD><EFBFBD>
// y1 = MODE_AREA_START_Y + (MODE_AREA_HEIGHT / 2);
// LCD_DrawLine(5, y1, UI_MODE_SCREEN_WIDTH-5, y1, UI_MODE_LINE_COLOR);
// #else
// // 3<>У<EFBFBD><D0A3><EFBFBD><EFBFBD>ȷ<EFBFBD>
// y1 = MODE_AREA_START_Y + (MODE_AREA_HEIGHT / 3);
// y2 = MODE_AREA_START_Y + (MODE_AREA_HEIGHT * 2 / 3);
// LCD_DrawLine(5, y1, UI_MODE_SCREEN_WIDTH-5, y1, UI_MODE_LINE_COLOR);
// LCD_DrawLine(5, y2, UI_MODE_SCREEN_WIDTH-5, y2, UI_MODE_LINE_COLOR);
// #endif
//
// uint16_t text_x_pos;
// uint16_t text_y_pos;
//
// // ==============================
// // <20><>һ<EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD><CCA8>3<EFBFBD><33> <20><><EFBFBD>У<EFBFBD>
// // ==============================
// text_x_pos = (UI_MODE_SCREEN_WIDTH - 3 * UI_MODE_FONT_SIZE) / 2;
//
// #if (USE_2_LINE_MODE == 1)
// text_y_pos = MODE_AREA_START_Y + (MODE_AREA_HEIGHT/2/2) - (UI_MODE_FONT_SIZE/2);
// #else
// text_y_pos = MODE_AREA_START_Y + (y1/2/2) - (UI_MODE_FONT_SIZE/2);
// #endif
//
// LCD_ShowChineseString(
// text_x_pos, text_y_pos,
// (uint8_t*)"\xB5\xF7\xD2\xF4\xCC\xA8", // <20><><EFBFBD><EFBFBD>̨
// UI_MODE_TEXT_COLOR, UI_MODE_BG_COLOR, UI_MODE_FONT_SIZE, 0
// );
//
// // ==============================
// // <20>ڶ<EFBFBD><DAB6>У<EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD>ã<EFBFBD>4<EFBFBD><34> <20><><EFBFBD>У<EFBFBD>
// // ==============================
// text_x_pos = (UI_MODE_SCREEN_WIDTH - 4 * UI_MODE_FONT_SIZE) / 2;
//
// #if (USE_2_LINE_MODE == 1)
// text_y_pos = MODE_AREA_START_Y + (MODE_AREA_HEIGHT/2) + (MODE_AREA_HEIGHT/2/2) - (UI_MODE_FONT_SIZE/2);
// #else
// text_y_pos = y1 + ((y2 - y1)/2) - (UI_MODE_FONT_SIZE/2);
// #endif
//
// LCD_ShowChineseString(
// text_x_pos, text_y_pos,
// (uint8_t*)"\xCF\xB5\xCD\xB3\xC9\xE8\xD6\xC3", // ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>
// UI_MODE_TEXT_COLOR, UI_MODE_BG_COLOR, UI_MODE_FONT_SIZE, 0
// );
//
// // ==============================
// // <20><><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBA3A8><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>
// // ==============================
// #if (USE_2_LINE_MODE == 0)
// text_x_pos = (UI_MODE_SCREEN_WIDTH - 4 * UI_MODE_FONT_SIZE) / 2;
// text_y_pos = y2 + ((MODE_AREA_HEIGHT - y2)/2) - (UI_MODE_FONT_SIZE/2);
// LCD_ShowChineseString(
// text_x_pos, text_y_pos,
// (uint8_t*)"\xD7\xD4\xD3\xC9\xC4\xA3\xCA\xBD",
// UI_MODE_TEXT_COLOR, UI_MODE_BG_COLOR, UI_MODE_FONT_SIZE, 0
// );
// #endif
//}
//#define UI_MODE_SCREEN_WIDTH 240 // 屏幕宽度<EFBC8C>??????????你的LCD<43>??????????<3F>??????????
//#define UI_MODE_SCREEN_HEIGHT 320 // 屏幕高度<EFBC8C>??????????你的LCD<43>??????????<3F>??????????
//#define UI_MODE_BG_COLOR 0x1925 // 背景深色近似原图的深蓝<E6B7B1>??????????
//#define UI_MODE_LINE_COLOR 0x0000/*DARKBLUE*/ // 分割线<E589B2>?<3F>比背景稍亮
#define UI_SET_MODE_TEXT_COLOR 0xFFFF // 文字颜色<EFBC8C>??????????
//#define UI_MODE_FONT_SIZE 24 // 字体大小<EFBC8C>??????????你的字库<E5AD97>??????????<3F>??????????
switch (ID)
{
case GUI_SETING_SELECT1:
MenuPage_Mixer_Proc();
break;
case GUI_SETING_SELECT3:
MenuPage_Setting_Proc(); /* 系统设置明细 0902-07 */
break;
default:
break;
}
}
void UI_DrawSysModeSelectScreen(void)
{
LCD_FillByColor(0, 0, 240, 320, UI0902_BG_COLOR);
label_top();
// 1. 渐变背景深灰→黑色<E9BB91>???
// LCD_FillGradient(0, 0, 240, 320, 0x5AEB, 0x0000);
LCD_FillByColor(0, 0, 240, 320, BLACK);
/* 调音台0907 素材 1334x33 推子图标) */
UI_Hub_DrawCard(UI0902_HUB_CARD_Y0, gImage_mixer, 34, 33,
(const uint8_t *)"\xB5\xF7\xD2\xF4\xCC\xA8");
/* 系统设置0907 素材 1433x33 齿轮图标) */
UI_Hub_DrawCard(UI0902_HUB_CARD_Y1, gImage_SystemSetting, 33, 33,
(const uint8_t *)"\xCF\xB5\xCD\xB3\xC9\xE8\xD6\xC3");
label_top();
// 2. 按钮参数<E695B0>??=220 <20>?????=87 圆<>??=10 深灰色背<E889B2>?????
const uint16_t btn_w = 220;
const uint16_t btn_h = 87;
const uint16_t btn_r = 10;
const uint16_t btn_x = (240 - btn_w) / 2; // 10
const uint16_t btn_color = COLOR_NORMAL_BG;
LCD_DrawLine(0, 30, 240, 30, btn_color);
LCD_FillRoundRect(btn_x, 40+20, btn_w, btn_h, btn_r, btn_color);
LCD_DrawChevron_Right(200, 105, 15, 3, WHITE);
uint16_t x1 = LCD_ShowChinese_AutoAlign(
btn_x, btn_x + btn_w,
40 + (btn_h - 24) / 2+20,
(uint8_t*)"\xB5\xF7\xD2\xF4\xCC\xA8",
LCD_ALIGN_CENTER,
UI_SET_MODE_TEXT_COLOR,
btn_color,
0,
24
);
LCD_WR_PIC_Trans(x1-45, 40 + (btn_h - 24) / 2+10,40,40,gImage_mixer, BLACK);
LCD_FillRoundRect(btn_x, 132+20, btn_w, btn_h, btn_r, btn_color);
LCD_DrawChevron_Right(200, 195, 15, 3, WHITE);
uint8_t x2 = LCD_ShowChinese_AutoAlign(
btn_x, btn_x + btn_w,
132 + (btn_h - 24) / 2+20,
(uint8_t*)"\xCF\xB5\xCD\xB3\xC9\xE8\xD6\xC3",
LCD_ALIGN_CENTER,
UI_SET_MODE_TEXT_COLOR,
btn_color,
0,
24
);
LCD_WR_PIC_Trans(x2-45, 132 + (btn_h - 24) / 2+10,40,40,gImage_SystemSetting, BLACK);
Draw_Bottom_Bar(UI0902_NAV_SETTING, 0);
}
void UI_SystemSet_Init(void)
{
UI_ClearFocus();
// LCD_WR_REG(0x28); // Display OFF
pCurrentTouch_Area = Touch_SetingSelect_Areas;
UI_DrawSysModeSelectScreen();
label_top();
label_Tab_Select_ui(&UI_Label[GUI_PLAY_SECTION], &mGuiData[GUI_TAB_INDEX]);
// LCD_WR_REG(0x29); // Display ON
UI_ClearFocus();
pCurrentTouch_Area = Touch_SetingSelect_Areas;
UI_DrawSysModeSelectScreen();
app_log_set_ui_page("SetHub");
LOG_I("UI", "page SettingsHub");
}
void UI_SystemSet_Process(DisplayTaskMessage_Type msg)
{
switch(msg.MessageType)
{
case MSG_ID_TOUCH:
for(uint8_t k=0; k<TOUCH_AREA_SETING_SELECT_NUM; k++)
{
if( msg.HiByte >= pCurrentTouch_Area[k].x_min &&
msg.HiByte <= pCurrentTouch_Area[k].x_max &&
msg.LoByte >= pCurrentTouch_Area[k].y_min &&
msg.LoByte <= pCurrentTouch_Area[k].y_max )
{
Touch_Seting_Select_Action(pCurrentTouch_Area[k].Flag,pCurrentTouch_Area[k].ID,k,pCurrentTouch_Area[k].Value);
break;
}
}
break;
case MSG_ID_EC_VOL:
// //LCD_ShowString(200, 0, Num_To_String(msg.DataU16[1],buff,3), RED, WHITE, 16, 0);
// uint8_t vol = msg.DataU16[1];
//// uint8_t level;
// if (vol <= 5) level = 0;
// else if (vol <= 35) level = 1;
// else if (vol <= 65) level = 2;
// else if (vol <= 95) level = 3;
// else if (vol <= 115) level = 4;
// else level = 5;
// Draw_Volume_Bar(5, 5, level, 1, WHITE, GRAY);
// uint8_t mMasterSysExVolume[12] = { 0xF0, 0x41, 0x00, 0x42, 0x12, 0x40, 0x00, 0x04, 0x64, 0x00, 0x00,0xF7};
// memset(mMasterSysExVolume+8,msg.DataU16[1],1);
// SendMidiDataToDreamDSP(mMasterSysExVolume,12);
//
// ResetAutoPowerCount();
break;
}
static uint32_t s_last_touch_ms;
switch (msg.MessageType)
{
case MSG_ID_TOUCH:
{
uint32_t now = rt_tick_get() * 1000U / RT_TICK_PER_SECOND;
uint8_t k;
if (now - s_last_touch_ms < 250U)
break;
s_last_touch_ms = now;
for (k = 0; k < TOUCH_AREA_SETING_SELECT_NUM; k++)
{
if (msg.HiByte >= pCurrentTouch_Area[k].x_min &&
msg.HiByte <= pCurrentTouch_Area[k].x_max &&
msg.LoByte >= pCurrentTouch_Area[k].y_min &&
msg.LoByte <= pCurrentTouch_Area[k].y_max)
{
Touch_Seting_Select_Action(pCurrentTouch_Area[k].Flag,
pCurrentTouch_Area[k].ID, k,
pCurrentTouch_Area[k].Value);
ResetAutoPowerCount();
break;
}
}
}
break;
case MSG_ID_BATTERY_VALUE:
label_top();
break;
default:
break;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -28,7 +28,165 @@ void CallUI_RestoreSelect(void);
#define UI_STATUS_BAR_H 26
/* 电量组在 Draw_Battery_Icon 内按右对齐重算;此值为允许的最左起点 */
/* 0902-01/02 需求稿:分割线 y=36居中于顶栏图标底与移调/速度控件顶之间 */
#define UI0902_STATUS_SEP_Y 36
/* 顶/底共用偏亮灰蓝2px 厚,保证暗底上可辨 */
#define UI0902_SEP_LINE_COLOR 0x94D5 /* RGB(144,152,168) */
#define UI0902_SEP_LINE_THICK 1
#define UI0902_STATUS_SEP_COLOR UI0902_SEP_LINE_COLOR
/* 0902 设计稿配色与底栏导航 */
#define UI0902_BG_COLOR 0x0042 /* #000813 页面背景 */
#define UI0902_ROW_BG 0x2147 /* #242B3A 列表行背景 */
/* 0902-04 普通模式实测240×320
* y48 h55 w105 gap8 y130 h31 y180 h30 y229 h34 */
#define UI0902_MARGIN_X 12
#define UI0902_CONTENT_W 216
#define UI0902_CARD_GAP_TOP 22
#define UI0902_CARD_Y (UI_STATUS_BAR_H + UI0902_CARD_GAP_TOP) /* 48 */
#define UI0902_CARD_H 55
#define UI0902_CARD_W 105
#define UI0902_CARD_GAP 8
#define UI0902_MODE_Y (UI0902_CARD_Y + UI0902_CARD_H + 5) /* 108TAB 顶 */
#define UI0902_MODE_H 53 /* TAB18 + 间隙4 + 曲目行31 */
#define UI0902_TIMBRE_Y 180
#define UI0902_TIMBRE_H 30
#define UI0902_SECTION_Y 231 /* 0904段落钮顶 ≈231 */
#define UI0902_SECTION_H 34
#define UI0902_FONT_LABEL 11 /* 标注:移调/速度 Medium 11 */
#define UI0902_FONT_BODY 13 /* 曲目/音色正文、演奏段落 */
#define UI0902_FONT_HERO 16 /* 主值 C/88 与稿面大号一致 */
#define UI0902_FONT_SUB 9 /* KEY/BPM */
#define UI0902_FONT_NAV 9
/* ASCII 字宽(须与 Drv LCD_GetAsciiMetrics 一致) */
#define UI0902_ASCII_W(sz) \
((sz) == 8 ? 6 : \
(sz) == 9 ? 8 : \
(sz) == 11 ? 7 : \
(sz) == 12 ? 8 : \
(sz) == 13 || (sz) == 15 ? 11 : \
(sz) == 16 ? 13 : ((sz) / 2 + 1))
/* 移调卡文字(主值加宽+下移 KEY防 Cb/101 底/右裁切) */
#define UI0902_CARD_TEXT_CX_L (UI0902_MARGIN_X + UI0902_CARD_W / 2) /* 64 */
#define UI0902_CARD_TEXT_CX_R (UI0902_MARGIN_X + UI0902_CARD_W + UI0902_CARD_GAP + UI0902_CARD_W / 2) /* 176 */
#define UI0902_CARD_LABEL_SIZE UI0902_FONT_LABEL /* 11 */
#define UI0902_CARD_LABEL_LH 13
#define UI0902_CARD_LABEL_W 22
#define UI0902_CARD_LABEL_H 11
#define UI0902_CARD_LABEL_Y 54
#define UI0902_CARD_VALUE_SIZE UI0902_FONT_HERO /* 16 */
#define UI0902_CARD_VALUE_LH 16
#define UI0902_CARD_VALUE_W 42 /* 3×13101/Cb 完整 */
#define UI0902_CARD_VALUE_H 17
/* mode.png主值≈y7185KEY/BPM≈y89加大与「移调/速度」间距、收紧与 KEY/BPM */
#define UI0902_CARD_VALUE_Y 73
/* 仅主值字母/数字:相对基准右移、上移(三角/±/KEY/BPM 不动) */
#define UI0902_CARD_VALUE_OX 3
#define UI0902_CARD_VALUE_OY (-3)
#define UI0902_CARD_SUB_SIZE UI0902_FONT_SUB /* 9 */
#define UI0902_CARD_SUB_LH 9
#define UI0902_CARD_SUB_W 32
#define UI0902_CARD_SUB_H 9
#define UI0902_CARD_SUB_Y 89
/* 段落钮与底栏分隔线mode.png ≈ y274颜色与顶栏共用 UI0902_SEP_LINE_COLOR */
#define UI0902_SEP_LINE_Y 274
/* 兼容旧相对偏移宏(= 绝对Y - CARD_Y */
#define UI0902_CARD_LABEL_DY (UI0902_CARD_LABEL_Y - UI0902_CARD_Y)
#define UI0902_CARD_VALUE_DY (UI0902_CARD_VALUE_Y - UI0902_CARD_Y)
#define UI0902_CARD_SUB_DY (UI0902_CARD_SUB_Y - UI0902_CARD_Y)
#define UI0902_TAB_H 18
#define UI0902_TAB_W 55
#define UI0902_TAB_GAP 6
#define UI0902_ROW_H 31
#define UI0902_SECTION_BTN_H 34
#define UI0902_SECTION_BTN_W 47
#define UI0902_SECTION_PITCH 57
#define UI0902_RADIUS_CARD 10
#define UI0902_RADIUS_TAB 6
#define UI0902_RADIUS_BTN 6
#define UI0902_BTN_MINUS_W 23
#define UI0902_BTN_MINUS_H 22
#define UI0902_BTN_PLUS_W 23
#define UI0902_BTN_PLUS_H 22
#define UI0902_TRI_L_W 22 /* 0902 控件-11 左三角 */
#define UI0902_TRI_L_H 22
#define UI0902_TRI_R_W 23 /* 0902 控件-12 右三角 */
#define UI0902_TRI_R_H 22
#define UI0902_TAB_BACK_W 30
#define UI0902_TAB_BACK_H 24
/* 0902 状态栏:左音量条 / 中蓝牙 / 右电池+百分比(对齐屏幕参考 0902-01 */
#define UI0902_VOL_X 8
#define UI0902_VOL_Y 3
#define UI0902_BT_W 11
#define UI0902_BT_H 17
#define UI0902_BT_X ((240 - UI0902_BT_W) / 2) /* 居中 */
#define UI0902_BT_Y 5
#define UI0902_BATTERY_W 29
#define UI0902_BATTERY_H 12
/* 与音量/蓝牙大致居中后再下移 2px12px 高 → 顶 y9 */
#define UI0902_BATTERY_Y 9
#define UI0902_BATTERY_RIGHT_MARGIN 6
#define UI0902_BATTERY_TEXT_GAP 2
#define UI0902_BATTERY_TEXT_SIZE 9 /* mode.png 百分比字号 ≈9完整显示 % */
/* 0904 / 0902-11 设置入口:两大卡片 + 底栏「设置」高亮 */
#define UI0902_HUB_CARD_X 10
#define UI0902_HUB_CARD_W 220
#define UI0902_HUB_CARD_H 85
#define UI0902_HUB_CARD_Y0 67
#define UI0902_HUB_CARD_GAP 5
#define UI0902_HUB_CARD_Y1 (UI0902_HUB_CARD_Y0 + UI0902_HUB_CARD_H + UI0902_HUB_CARD_GAP) /* 157 */
#define UI0902_HUB_FONT UI0902_FONT_HERO /* 16与标题级统一 */
/* 0904 / 0902-06·07·08 子页顶栏:返回用 调音台控件-1.png30×24 */
#define UI0902_SUB_BACK_X 8
#define UI0902_SUB_BACK_Y 7
#define UI0902_SUB_BACK_W 30
#define UI0902_SUB_BACK_H 24
#define UI0902_SUB_TITLE_Y 12
#define UI0902_SUB_TITLE_SIZE UI0902_FONT_HERO
#define UI0902_SUB_SEP_Y 38
/* 0904 / 0902-07 系统设置四行(稿面行框 ≈x16 w207 */
#define UI0902_SET_ROW_X 16
#define UI0902_SET_ROW_W 207
#define UI0902_SET_ROW_H 58
#define UI0902_SET_ROW_Y0 51
#define UI0902_SET_ROW_PITCH 63
#define UI0902_SET_ROW_FONT UI0902_FONT_BODY /* 13 */
/* 0904 / 0902-08 恢复出厂:竖排确认(灰)/取消(蓝) */
#define UI0902_RESTORE_BTN_X 10
#define UI0902_RESTORE_BTN_W 220
#define UI0902_RESTORE_BTN_H 68
#define UI0902_RESTORE_BTN_Y0 104
#define UI0902_RESTORE_BTN_Y1 183
#define UI0902_RESTORE_BTN_FONT UI0902_FONT_HERO
#define UI0902_NAV_UNIVERSAL 0 /* 底栏:万能模式 */
#define UI0902_NAV_NORMAL 1 /* 底栏:普通模式 */
#define UI0902_NAV_EXPERT 2 /* 底栏:专业模式 */
#define UI0902_NAV_SETTING 3 /* 底栏:设置 */
#define UI0902_NAV_NONE 0xFF
/* 兼容旧名(已废弃三键:设置|调音台|模式) */
#define UI0902_NAV_MIXER UI0902_NAV_NORMAL
#define UI0902_NAV_MODE UI0902_NAV_EXPERT
/* 底部图标实际内容(生成脚本曾把 万能/普通/专业/设置 误命名为 Setting/Mixer/Mode */
#define gImage_Nav_Universal_Not gImage_UI0902_TabSetting_Sel_36x28 /* 底部-10 白 */
#define gImage_Nav_Universal_Sel gImage_UI0902_TabMode_Sel_36x28 /* 底部-14 蓝 */
#define gImage_Nav_Normal_Not gImage_UI0902_TabSetting_Not_35x28 /* 底部-11 白 */
#define gImage_Nav_Normal_Sel gImage_UI0902_TabMode_Not_35x29 /* 底部-15 蓝 */
#define gImage_Nav_Expert_Not gImage_UI0902_TabMixer_Sel_35x27 /* 底部-12 白 */
#define gImage_Nav_Expert_Sel gImage_UI0902_TabBack_Sel_35x27 /* 底部-16 蓝 */
#define gImage_Nav_Setting_Not gImage_UI0902_TabMixer_Not_18x28 /* 底部-13 白 */
#define gImage_Nav_Setting_Sel gImage_UI0902_TabBack_Not_18x28 /* 底部-17 蓝 */
/* 旧几何电池Draw_Battery_Icon最左起点0902 图电池用 Draw_Status_Battery_Icon */
#define UI_STATUS_BATTERY_X 150
#define UI_STATUS_BATTERY_H 11
#define UI_STATUS_BATTERY_Y ((UI_STATUS_BAR_H - UI_STATUS_BATTERY_H) / 2)
@ -42,13 +200,18 @@ void UI_GetFocusGrad(uint8_t widget_id, uint16_t *c_top, uint16_t *c_bot);
void Draw_Status_Battery_Icon(uint8_t battery_percent);
void Show_Battery_Icon(uint8_t flag);
void UI_DrawStatusSepLine(void);
void Show_BL_Icon(uint8_t value);
void Draw_Tab_Section_Menu(const LEBEL_UI *UI, TAB_SECTION_INDEX select_tab);
void UI_NavBar_Action(uint8_t value);
void Draw_Bottom_Bar(uint8_t sel, uint8_t first_back);
void UI_GotoCurrentModePage(void);
void GET_Num_Str(int16_t NUM, uint8_t ValidLen, char* Str, uint8_t hasSign);
void show_Param(const LEBEL_UI *UI, GUI_SWITCH *Group);
extern void Show_home_UI(void);
extern void Show_home_UI_Diff(void);
extern void Touch_Action(int8_t FLAG, uint8_t ID, uint8_t areaIndex, uint8_t value);
//extern void Refresh_Transpose(uint8_t last_data, const LEBEL_UI *UI, GUI_SWITCH *Group);
extern void Refresh_Transpose(const LEBEL_UI *UI, GUI_SWITCH * Group);
@ -63,6 +226,11 @@ extern void label_Tab_Select_ui(const LEBEL_UI *UI, GUI_SWITCH *Group);
extern void Refresh_SectionSelect(uint16_t last_value, const LEBEL_UI *UI, GUI_SWITCH *Group);
extern void Refresh_TabSelect_ui(const LEBEL_UI *UI, GUI_SWITCH *Group);
extern void RefreshSystemSetting(uint8_t last_data,const LEBEL_UI *UI,GUI_SWITCH * Group);
extern void RestoreSetting();
extern void RestoreSetting(void);
extern void Draw_System_Item_List(const LEBEL_UI *UI, GUI_SWITCH *Group);
/* 子页顶栏:左返回 + 居中标题(调音台/系统设置) */
extern void UI_DrawSubPageHeader(const uint8_t *title_gbk);
/* 节奏类型→1.bin / 本地曲目→2.bin / 万能→3.bin */
extern void UI_ApplyToneAddress(void);
extern void UI_ReloadTonePreset(void);
#endif

View File

@ -12,7 +12,6 @@ extern void UI_DrawModeSelectScreen(void);
extern void UI_ReturnToModeSelect(void);
extern void IdleProcess(DisplayTaskMessage_Type xEvent);
extern void LoadConfig(void);
#endif

View File

@ -9,6 +9,7 @@ static uint8_t LCD_CnFontMetrics(uint8_t sizey, uint8_t *sizex, uint16_t *typefa
switch (sizey)
{
case 8: *sizex = 8; *typeface_num = 8; return 1;
case 9: *sizex = 9; *typeface_num = 18; return 1;
case 11: *sizex = 11; *typeface_num = 22; return 1;
case 12: *sizex = 12; *typeface_num = 24; return 1;
case 13: *sizex = 13; *typeface_num = 26; return 1;
@ -25,6 +26,7 @@ static uint8_t LCD_GetCnFontByte(uint8_t sizey, uint8_t index, uint16_t i)
switch (sizey)
{
case 8: return Chinese_font_8[index][i];
case 9: return Chinese_font_9[index][i];
case 11: return Chinese_font_11[index][i];
case 12: return Chinese_font_12[index][i];
case 13: return Chinese_font_13[index][i];
@ -41,6 +43,7 @@ static uint8_t LCD_GetAsciiFontByte(uint8_t sizey, uint8_t num, uint16_t i)
switch (sizey)
{
case 8: return ascii_84[num][i];
case 9: return ascii_94[num][i];
case 11: return ascii_115[num][i];
case 12: return ascii_126[num][i];
case 13: return ascii_1306[num][i];
@ -57,6 +60,7 @@ static const char (*LCD_GetChsTable(uint8_t sizey))[2]
switch (sizey)
{
case 8: return CHS8Table;
case 9: return CHS9Table;
case 11: return CHS11Table;
case 12: return CHS12Table;
case 13: return CHS13Table;
@ -73,6 +77,7 @@ static uint16_t LCD_GetChsTableSize(uint8_t sizey)
switch (sizey)
{
case 8: return (uint16_t)(sizeof(CHS8Table) / 2);
case 9: return (uint16_t)(sizeof(CHS9Table) / 2);
case 11: return (uint16_t)(sizeof(CHS11Table) / 2);
case 12: return (uint16_t)(sizeof(CHS12Table) / 2);
case 13: return (uint16_t)(sizeof(CHS13Table) / 2);
@ -86,21 +91,34 @@ static uint16_t LCD_GetChsTableSize(uint8_t sizey)
static uint8_t LCD_GetAsciiMetrics(uint8_t size, uint8_t *char_width, uint8_t *char_height)
{
/* 与点阵源一致的字形格宽ShowChar 窗口必须匹配字库) */
*char_height = size;
switch (size)
{
case 8: *char_width = 4; return 1;
case 11: *char_width = 5; return 1;
case 12: *char_width = 6; return 1;
case 13: *char_width = 6; return 1;
case 15: *char_width = 7; return 1;
case 16: *char_width = 8; return 1;
case 8: *char_width = 5; return 1;
case 9: *char_width = 7; return 1;
case 11: *char_width = 6; return 1;
case 12: *char_width = 7; return 1;
case 13: *char_width = 8; return 1;
case 15: *char_width = 8; return 1;
case 16: *char_width = 10; return 1;
case 24: *char_width = 12; return 1;
case 28: *char_width = 14; return 1;
default: return 0;
}
}
/* 显示步进:字形宽 + 字距,和弦数字等更舒展,避免右缘贴死 */
static uint8_t LCD_GetAsciiAdvance(uint8_t size)
{
uint8_t w, h;
if (!LCD_GetAsciiMetrics(size, &w, &h))
return (uint8_t)(size / 2);
if (size >= 13)
return (uint8_t)(w + 3); /* 字距 +3和弦数字更舒展 */
return (uint8_t)(w + 1);
}
//r:0-31 g:0-63 b:0-31
uint16_t RGB(int r,int g,int b)
{
@ -150,7 +168,23 @@ void LCD_WR_PIC(uint16_t x, uint16_t y, uint16_t length, uint16_t width, const u
}
}
/* 跳过近黑色像素(图标导出底色常为 0x0000/0x0001/0x0022非纯 BLACK */
/* 跳过近黑色像素(图标导出底色常为 0x0000/0x0001/0x0022非纯 BLACK
* #242B3A(0x2147) PNG
* */
static uint8_t LCD_PicColorIsTransparent(uint16_t c)
{
uint8_t r5 = (uint8_t)((c >> 11) & 0x1F);
uint8_t g6 = (uint8_t)((c >> 5) & 0x3F);
uint8_t b5 = (uint8_t)(c & 0x1F);
if (r5 <= 1 && g6 <= 2 && b5 <= 2)
return 1;
/* UI0902_ROW_BG 0x2147 ≈ R5=4 G6=10 B5=7含打包抗锯齿邻色 */
if (r5 >= 2 && r5 <= 6 && g6 >= 7 && g6 <= 14 && b5 >= 4 && b5 <= 11)
return 1;
return 0;
}
void LCD_WR_PIC_Trans(uint16_t x, uint16_t y, uint16_t length, uint16_t width,
const uint8_t data[], uint16_t key_color)
{
@ -166,12 +200,8 @@ void LCD_WR_PIC_Trans(uint16_t x, uint16_t y, uint16_t length, uint16_t width,
uint8_t hi = data[i * 2];
uint8_t lo = data[i * 2 + 1];
uint16_t c = (uint16_t)((hi << 8) | lo);
uint8_t r5 = (uint8_t)((c >> 11) & 0x1F);
uint8_t g6 = (uint8_t)((c >> 5) & 0x3F);
uint8_t b5 = (uint8_t)(c & 0x1F);
/* 近黑视为透明,避免图标黑底方块 */
if (r5 <= 1 && g6 <= 2 && b5 <= 2)
if (LCD_PicColorIsTransparent(c))
continue;
LCD_DrawPoint((uint16_t)(x + (i % length)),
@ -221,6 +251,41 @@ void LCD_WR_PIC_FROM_FLASH(uint16_t x, uint16_t y, uint16_t length, uint16_t wid
}
}
/* 只绘制图片左侧 clip_w 列(电池电量按百分比裁剪) */
void LCD_WR_PIC_ClipX(uint16_t x, uint16_t y, uint16_t full_w, uint16_t h,
uint16_t clip_w, const uint8_t data[])
{
uint16_t row;
if (clip_w == 0 || full_w == 0 || h == 0) return;
if (clip_w > full_w) clip_w = full_w;
LCD_SetWindow(x, y, x + clip_w - 1, y + h - 1);
LCD_DC_Set();
for (row = 0; row < h; row++)
{
LCD_SPI_Write(data + (uint32_t)row * full_w * 2, (uint32_t)clip_w * 2);
}
}
/* 从 W25Q128 按行读取并透明显示(跳过近黑 / 行底色像素),复用 pic_batch_buf无大块静态 RAM */
void LCD_WR_PIC_FROM_FLASH_Trans(uint16_t x, uint16_t y, uint16_t length, uint16_t width, uint32_t flash_addr)
{
uint16_t row, col;
uint32_t row_bytes = (uint32_t)length * 2U;
if (length == 0 || width == 0 || row_bytes > PIC_BATCH_SIZE) return;
for (row = 0; row < width; row++)
{
W25Q128_Read(pic_batch_buf, flash_addr + row * row_bytes, (uint16_t)row_bytes);
for (col = 0; col < length; col++)
{
uint16_t c = (uint16_t)((pic_batch_buf[col * 2U] << 8) | pic_batch_buf[col * 2U + 1U]);
if (LCD_PicColorIsTransparent(c))
continue;
LCD_DrawPoint((uint16_t)(x + col), (uint16_t)(y + row), c);
}
}
}
/******************************************************************************
xsta,ysta
@ -516,6 +581,33 @@ void LCD_DrawCircle(uint16_t x0, uint16_t y0, uint8_t r, uint16_t color)
}
}
/******************************************************************************
线
******************************************************************************/
void LCD_FillCircle(uint16_t x0, uint16_t y0, uint8_t r, uint16_t color)
{
int16_t y;
int32_t r2;
if (r == 0)
{
LCD_DrawPoint(x0, y0, color);
return;
}
r2 = (int32_t)r * (int32_t)r;
for (y = -(int16_t)r; y <= (int16_t)r; y++)
{
int32_t xx = r2 - (int32_t)y * (int32_t)y;
int16_t dx = 0;
int16_t x;
/* 整数平方根dx = floor(sqrt(xx)) */
while ((int32_t)(dx + 1) * (dx + 1) <= xx)
dx++;
x = (int16_t)(x0 - dx);
LCD_FillByColor((uint16_t)x, (uint16_t)(y0 + y),
(uint16_t)(x0 + dx + 1), (uint16_t)(y0 + y + 1), color);
}
}
/******************************************************************************
@ -903,11 +995,16 @@ void LCD_DrawRect(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t c
******************************************************************************/
void LCD_ShowString(uint16_t x, uint16_t y, const uint8_t *p, uint16_t fc, uint16_t bc, uint8_t sizey, uint8_t mode)
{
{
uint8_t cw, ch;
uint8_t adv;
if (!LCD_GetAsciiMetrics(sizey, &cw, &ch))
return;
adv = LCD_GetAsciiAdvance(sizey);
while(*p != '\0')
{
{
LCD_ShowChar(x, y, *p, fc, bc, sizey, mode);
x += sizey / 2;
x += adv;
p++;
}
}
@ -995,7 +1092,7 @@ static uint16_t LCD_GetMixedStringWidth(uint8_t *str, uint8_t sizey)
{
uint16_t width = 0;
uint8_t xStepCn = sizey;
uint8_t xStepAscii = sizey / 2;
uint8_t xStepAscii = LCD_GetAsciiAdvance(sizey);
while(*str != '\0')
{
@ -1030,7 +1127,7 @@ uint16_t LCD_ShowMixedString(uint16_t x1, uint16_t x2, uint16_t y, uint8_t *str,
{
const char (*codeTab)[2] = NULL;
uint8_t xStepCn = sizey;
uint8_t xStepAscii = sizey / 2;
uint8_t xStepAscii = LCD_GetAsciiAdvance(sizey);
uint16_t draw_x;
codeTab = LCD_GetChsTable(sizey);
@ -1103,11 +1200,12 @@ uint16_t LCD_ShowMixedString(uint16_t x1, uint16_t x2, uint16_t y, uint8_t *str,
******************************************************************************/
void LCD_ClearString(uint16_t x, uint16_t y, const uint8_t *p, uint16_t bc, uint8_t sizey, uint8_t mode)
{
uint8_t adv = LCD_GetAsciiAdvance(sizey);
while (*p != '\0')
{
// 用背景色bc作为“前景色”显示空格字符覆盖原字符
LCD_ShowChar(x, y, ' ', bc, bc, sizey, mode); // 前景色=背景色=bc相当于清除
x += sizey / 2; // 与原显示函数x步长一致
x += adv;
p++;
}
}
@ -1309,9 +1407,11 @@ uint16_t LCD_ShowString_AutoAlign(uint16_t x1, uint16_t x2, uint16_t y, const ui
uint8_t align, uint16_t fc, uint16_t bc, uint8_t mode, uint8_t size)
{
uint8_t CHAR_WIDTH, CHAR_HEIGHT;
uint8_t CHAR_ADV;
if (!LCD_GetAsciiMetrics(size, &CHAR_WIDTH, &CHAR_HEIGHT))
return 0;
CHAR_ADV = LCD_GetAsciiAdvance(size);
uint16_t str_len = 0;
uint16_t str_total_width;
@ -1324,8 +1424,8 @@ uint16_t LCD_ShowString_AutoAlign(uint16_t x1, uint16_t x2, uint16_t y, const ui
str_len++;
}
// 计算字符串总宽度
str_total_width = str_len * CHAR_WIDTH;
// 计算字符串总宽度(含字距)
str_total_width = str_len * CHAR_ADV;
// 根据对齐方式计算起始 X 坐标
switch (align)
@ -1351,7 +1451,7 @@ uint16_t LCD_ShowString_AutoAlign(uint16_t x1, uint16_t x2, uint16_t y, const ui
while (*p != '\0')
{
LCD_ShowChar(curr_x, y, *p, fc, bc, CHAR_HEIGHT, mode);
curr_x += CHAR_WIDTH;
curr_x += CHAR_ADV;
p++;
}
return curr_x;
@ -1493,9 +1593,11 @@ uint16_t LCD_ShowString_AutoAlign_Gradient(uint16_t x1, uint16_t x2, uint16_t y,
uint16_t color_top, uint16_t color_bottom, uint8_t size)
{
uint8_t CHAR_WIDTH, CHAR_HEIGHT;
uint8_t CHAR_ADV;
if (!LCD_GetAsciiMetrics(size, &CHAR_WIDTH, &CHAR_HEIGHT))
return 0;
CHAR_ADV = LCD_GetAsciiAdvance(size);
uint16_t str_len = 0;
uint16_t str_total_width;
@ -1505,7 +1607,7 @@ uint16_t LCD_ShowString_AutoAlign_Gradient(uint16_t x1, uint16_t x2, uint16_t y,
while (p[str_len] != '\0') str_len++;
if (str_len == 0) return 0;
str_total_width = str_len * CHAR_WIDTH;
str_total_width = str_len * CHAR_ADV;
switch (align)
{
@ -1521,7 +1623,7 @@ uint16_t LCD_ShowString_AutoAlign_Gradient(uint16_t x1, uint16_t x2, uint16_t y,
break;
}
// 1. 画垂直渐变背景
// 1. 画垂直渐变背景(覆盖字形+字距)
LCD_FillGradient(curr_x, y, curr_x + str_total_width, y + CHAR_HEIGHT, color_top, color_bottom);
// 2. 叠加模式显示文字mode=1
@ -1593,6 +1695,17 @@ void LCD_DrawChevron_Right(uint16_t x, uint16_t y, uint8_t size, uint8_t thick,
}
}
/* LCD_DrawChevron_Right 的左向镜像x,y 为尖角处坐标 */
void LCD_DrawChevron_Left(uint16_t x, uint16_t y, uint8_t size, uint8_t thick, uint16_t color)
{
for (uint8_t i = 0; i < thick; i++) {
LCD_DrawLine(x, y - size + i, x - size + i, y, color);
}
for (uint8_t i = 0; i < thick; i++) {
LCD_DrawLine(x, y + size - i, x - size + i, y, color);
}
}
/******************************************************************************
+ +
@ -1742,7 +1855,7 @@ void Draw_Volume_Bar(uint16_t x, uint16_t y, uint8_t volume_level,uint8_t scale,
}
clear_w = (uint16_t)(w + gap) * bar_count - gap;
LCD_FillByColor(x, y, x + clear_w, y + max_h * scale, BLACK);
LCD_FillByColor(x, y, x + clear_w, y + max_h * scale, UI0902_BG_COLOR);
if(volume_level == 0)
{

View File

@ -29,10 +29,17 @@ extern void LCD_WR_PIC(uint16_t x, uint16_t y, uint16_t length, uint16_t width,
extern void LCD_WR_PIC_Trans(uint16_t x, uint16_t y, uint16_t length, uint16_t width,
const uint8_t data[], uint16_t key_color);
extern void LCD_WR_PIC_FROM_FLASH(uint16_t x, uint16_t y, uint16_t length, uint16_t width, uint32_t flash_addr);
extern void LCD_WR_PIC_ClipX(uint16_t x, uint16_t y, uint16_t full_w, uint16_t h,
uint16_t clip_w, const uint8_t data[]);
extern void LCD_WR_PIC_FROM_FLASH_Trans(uint16_t x, uint16_t y, uint16_t length, uint16_t width, uint32_t flash_addr);
extern void LCD_WR_PIC_ClipX(uint16_t x, uint16_t y, uint16_t full_w, uint16_t h,
uint16_t clip_w, const uint8_t data[]);
extern void LCD_WR_PIC_FROM_FLASH_Trans(uint16_t x, uint16_t y, uint16_t length, uint16_t width, uint32_t flash_addr);
extern void LCD_DrawPoint(uint16_t x, uint16_t y, uint16_t color); //在指定位置画一个点
extern void LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color); //在指定位置画一条线
extern void LCD_DrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color); //在指定位置画一个矩形
extern void LCD_DrawCircle(uint16_t x0, uint16_t y0, uint8_t r, uint16_t color); //在指定位置画一个圆
extern void LCD_FillCircle(uint16_t x0, uint16_t y0, uint8_t r, uint16_t color); //实心圆
extern void LCD_ShowChar(uint16_t x, uint16_t y, uint8_t num, uint16_t fc, uint16_t bc, uint8_t sizey, uint8_t mode);
//extern void LCD_ShowChinese(uint16_t x, uint16_t y, uint8_t *str, uint16_t fc, uint16_t bc, uint8_t sizey, uint8_t mode);

File diff suppressed because it is too large Load Diff

View File

@ -190,6 +190,11 @@ static uint8_t LCD_Dump_CommandPending(void)
unsigned read_len;
unsigned i;
/* 烧录外部 UI 资源时占用 RTT0 down禁止此处吞字节 */
if (app_log_flash_busy()) {
return 0U;
}
read_len = SEGGER_RTT_Read(LCD_DUMP_RTT_DOWN_CH, rx, sizeof(rx));
if (read_len == 0U) {
return 0U;
@ -206,6 +211,38 @@ static uint8_t LCD_Dump_CommandPending(void)
s_cmd_buf[0] = '\0';
continue;
}
/* TAP [x y]:缺省 120,80换行后解析避免坐标未收齐就触发 */
if (strncmp(s_cmd_buf, LCD_DUMP_TAP_CMD, 3) == 0) {
unsigned tx = 120U;
unsigned ty = 80U;
if (s_cmd_buf[3] == ' ' || s_cmd_buf[3] == '\t') {
char *p1 = s_cmd_buf + 4;
char *p2;
tx = (unsigned)strtoul(p1, &p2, 10);
if (p2 != p1) {
while (*p2 == ' ' || *p2 == '\t') p2++;
ty = (unsigned)strtoul(p2, NULL, 10);
}
}
if (tx > 239U) tx = 239U;
if (ty > 319U) ty = 319U;
MainTask_Sendmsg(MSG_ID_TOUCH, 1, (uint16_t)tx, (uint16_t)ty);
SEGGER_RTT_WriteString(0, "TAP inject\n");
s_cmd_len = 0U;
s_cmd_buf[0] = '\0';
continue;
}
if (strcmp(s_cmd_buf, LCD_DUMP_RESET_CMD) == 0) {
(void)app_log_try_command(LCD_DUMP_RESET_CMD);
s_cmd_len = 0U;
s_cmd_buf[0] = '\0';
continue;
}
if (strcmp(s_cmd_buf, LCD_DUMP_CMD) == 0) {
s_cmd_len = 0U;
s_cmd_buf[0] = '\0';
return 1U;
}
}
s_cmd_len = 0U;
s_cmd_buf[0] = '\0';
@ -218,23 +255,7 @@ static uint8_t LCD_Dump_CommandPending(void)
s_cmd_buf[s_cmd_len++] = c;
s_cmd_buf[s_cmd_len] = '\0';
/* 合成点击:验证 UI 命中路径(点万能按钮中心) */
if (strstr(s_cmd_buf, LCD_DUMP_TAP_CMD) != NULL) {
s_cmd_len = 0U;
s_cmd_buf[0] = '\0';
MainTask_Sendmsg(MSG_ID_TOUCH, 1, 120, 80);
SEGGER_RTT_WriteString(0, "TAP inject 120,80\n");
continue;
}
if (strstr(s_cmd_buf, LCD_DUMP_RESET_CMD) != NULL) {
s_cmd_len = 0U;
s_cmd_buf[0] = '\0';
(void)app_log_try_command(LCD_DUMP_RESET_CMD);
continue;
}
if (c == 0x01 || strstr(s_cmd_buf, LCD_DUMP_CMD) != NULL) {
if (c == 0x01) {
s_cmd_len = 0U;
s_cmd_buf[0] = '\0';
return 1U;

View File

@ -4,7 +4,7 @@
#include "includes.h"
#ifndef DEBUG_LCD_DUMP
#define DEBUG_LCD_DUMP 1
#define DEBUG_LCD_DUMP 0
#endif
#if DEBUG_LCD_DUMP

File diff suppressed because it is too large Load Diff

View File

@ -476,412 +476,290 @@ const unsigned char gImage_Restore[800] = { /* 0X10,0X10,0X00,0X14,0X00,0X14,0X0
};
const unsigned char gImage_mixer[3200] = { /* 0X10,0X10,0X00,0X28,0X00,0X28,0X01,0X1B, */
0X21,0X47,0X21,0X47,0X21,0X47,0X42,0X4A,0X4A,0X8B,0X42,0X4B,0X21,0X67,0X21,0X47,
0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,
0X21,0X47,0X21,0X47,0X21,0X67,0X42,0X6B,0X4A,0X6B,0X3A,0X2A,0X21,0X47,0X21,0X47,
0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,
0X21,0X47,0X21,0X26,0X31,0XC9,0X4A,0X6B,0X4A,0X6B,0X31,0XA8,0X21,0X26,0X21,0X47,
0X21,0X47,0X19,0X06,0X4A,0X6B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X5B,0X0D,0X10,0XE5,
0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,
0X21,0X47,0X10,0XC5,0X73,0XB0,0XFF,0XFF,0XFF,0XFF,0XFF,0XDF,0X3A,0X09,0X19,0X06,
0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,
0X21,0X47,0X19,0X06,0XCE,0X59,0XFF,0XFF,0XFF,0XFF,0XB5,0XB7,0X10,0XE5,0X21,0X47,
0X21,0X47,0X10,0XE5,0X52,0XAC,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X63,0X4E,0X10,0XC5,
0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,
0X21,0X47,0X10,0XC5,0X7C,0X11,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X42,0X2A,0X19,0X06,
0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,
0X21,0X47,0X19,0X06,0XD6,0X9A,0XFF,0XFF,0XFF,0XFF,0XBE,0X18,0X10,0XE5,0X21,0X47,
0X21,0X47,0X10,0XE5,0X4A,0XAC,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X63,0X2E,0X10,0XC5,
0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,
0X21,0X47,0X10,0XA5,0X84,0X31,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X42,0X2A,0X19,0X06,
0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,
0X21,0X46,0X19,0X06,0XCE,0X7A,0XFF,0XFF,0XFF,0XFF,0XBD,0XF8,0X10,0XE5,0X21,0X47,
0X21,0X47,0X10,0XE5,0X4A,0XAC,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X63,0X2E,0X10,0XC5,
0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,
0X21,0X47,0X10,0XE5,0X52,0XED,0XD6,0XBB,0XDE,0XDB,0XC6,0X39,0X29,0XA8,0X19,0X26,
0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,
0X21,0X46,0X19,0X06,0XCE,0X7A,0XFF,0XFF,0XFF,0XFF,0XBD,0XF8,0X10,0XE5,0X21,0X47,
0X21,0X47,0X10,0XE5,0X4A,0XAC,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X63,0X2E,0X10,0XC5,
0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,
0X10,0XE5,0X10,0XC5,0X08,0XA4,0X08,0XA4,0X08,0XA4,0X08,0X84,0X08,0XA4,0X10,0XC5,
0X19,0X06,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,
0X21,0X46,0X19,0X06,0XCE,0X7A,0XFF,0XFF,0XFF,0XFF,0XBD,0XF8,0X10,0XE5,0X21,0X47,
0X21,0X46,0X10,0XE5,0X52,0XAC,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X63,0X2E,0X10,0XC5,
0X21,0X46,0X21,0X46,0X21,0X46,0X21,0X46,0X21,0X46,0X21,0X46,0X21,0X26,0X19,0X26,
0X52,0XED,0X6B,0X8F,0X6B,0X8F,0X6B,0X6F,0X6B,0X6F,0X6B,0X6F,0X6B,0X8F,0X6B,0X8F,
0X3A,0X09,0X19,0X06,0X21,0X46,0X21,0X46,0X21,0X46,0X21,0X46,0X21,0X46,0X21,0X46,
0X21,0X26,0X19,0X06,0XCE,0X7A,0XFF,0XFF,0XFF,0XFF,0XBD,0XF8,0X10,0XC5,0X21,0X46,
0X21,0X46,0X10,0XE5,0X42,0X4A,0XFF,0XDF,0XFF,0XFF,0XFF,0XFF,0X52,0XCC,0X10,0XE5,
0X21,0X46,0X21,0X46,0X21,0X46,0X21,0X46,0X21,0X46,0X21,0X46,0X19,0X06,0X29,0X88,
0XF7,0XBF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0X9C,0XF4,0X08,0XA4,0X21,0X46,0X21,0X46,0X21,0X46,0X21,0X46,0X21,0X46,0X21,0X46,
0X21,0X26,0X19,0X06,0XCE,0X7A,0XFF,0XFF,0XFF,0XFF,0XBD,0XF8,0X10,0XC5,0X21,0X46,
0X19,0X26,0X19,0X06,0X19,0X06,0X31,0XE9,0X3A,0X09,0X39,0XE9,0X19,0X06,0X19,0X06,
0X19,0X26,0X21,0X47,0X21,0X46,0X21,0X46,0X21,0X46,0X21,0X46,0X19,0X06,0X31,0XA8,
0XF7,0X9E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0X9D,0X14,0X08,0XA4,0X21,0X46,0X21,0X46,0X21,0X46,0X21,0X46,0X21,0X46,0X21,0X46,
0X21,0X26,0X19,0X06,0XCE,0X7A,0XFF,0XFF,0XFF,0XFF,0XBD,0XF8,0X10,0XC5,0X21,0X46,
0X21,0X67,0X39,0XE9,0X39,0XE9,0X31,0XA8,0X29,0XA8,0X29,0XA8,0X31,0XE9,0X39,0XE9,
0X21,0X67,0X19,0X26,0X21,0X26,0X21,0X26,0X21,0X26,0X21,0X26,0X19,0X06,0X29,0XA8,
0XF7,0X9E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0X9C,0XF4,0X08,0XA4,0X21,0X26,0X21,0X26,0X21,0X26,0X21,0X26,0X21,0X26,0X21,0X26,
0X19,0X26,0X19,0X05,0XCE,0X7A,0XFF,0XFF,0XFF,0XFF,0XBD,0XF8,0X10,0XC5,0X19,0X26,
0XAD,0X76,0XFF,0XDF,0XFF,0XDF,0XFF,0XDF,0XFF,0XDF,0XFF,0XDF,0XFF,0XDF,0XFF,0XDF,
0XB5,0X97,0X10,0XE5,0X19,0X26,0X21,0X26,0X21,0X26,0X21,0X26,0X19,0X06,0X29,0XA8,
0XF7,0X9E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0X9C,0XF4,0X08,0XA4,0X21,0X26,0X21,0X26,0X21,0X26,0X21,0X26,0X21,0X26,0X21,0X26,
0X19,0X26,0X19,0X05,0XCE,0X7A,0XFF,0XFF,0XFF,0XFF,0XBD,0XF8,0X10,0XC5,0X19,0X26,
0XCE,0X7A,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XCE,0X7A,0X10,0XE5,0X19,0X26,0X21,0X26,0X21,0X26,0X21,0X26,0X19,0X06,0X29,0XA8,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XA5,0X15,0X08,0XA4,0X21,0X26,0X21,0X26,0X21,0X26,0X21,0X26,0X21,0X26,0X21,0X26,
0X19,0X26,0X19,0X05,0XCE,0X7A,0XFF,0XFF,0XFF,0XFF,0XBD,0XF8,0X10,0XC5,0X19,0X26,
0XC6,0X39,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XC6,0X59,0X10,0XE5,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,
0X6B,0X8F,0X84,0X52,0X84,0X52,0X84,0X52,0X84,0X52,0X84,0X52,0X84,0X52,0X84,0X52,
0X42,0X4A,0X18,0XE5,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,
0X19,0X26,0X10,0XE5,0XCE,0X7A,0XFF,0XFF,0XFF,0XFF,0XBD,0XF8,0X10,0XC5,0X19,0X26,
0XC6,0X39,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XC6,0X59,0X10,0XE5,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,
0X10,0XA4,0X08,0XA4,0X00,0X63,0X00,0X43,0X00,0X43,0X00,0X23,0X08,0X84,0X08,0XA4,
0X10,0XE5,0X21,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,
0X19,0X26,0X10,0XE5,0XCE,0X7A,0XFF,0XFF,0XFF,0XFF,0XBD,0XF8,0X10,0XC5,0X19,0X26,
0XCE,0X9A,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XD6,0X9A,0X10,0XE5,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,
0X19,0X26,0X10,0XE5,0X4A,0X8B,0XBD,0XF8,0XC6,0X18,0XAD,0X76,0X21,0X67,0X19,0X06,
0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,
0X19,0X26,0X10,0XE5,0XCE,0X7A,0XFF,0XFF,0XFF,0XFF,0XBD,0XF8,0X10,0XC5,0X19,0X26,
0X84,0X31,0XC6,0X39,0XC6,0X39,0XC6,0X39,0XC6,0X39,0XC6,0X39,0XC6,0X39,0XC6,0X39,
0X84,0X52,0X10,0XE5,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,
0X19,0X26,0X08,0XA4,0X7C,0X11,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3A,0X2A,0X10,0XE5,
0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,
0X19,0X26,0X10,0XE5,0XD6,0XBB,0XFF,0XFF,0XFF,0XFF,0XC6,0X39,0X10,0XC5,0X19,0X26,
0X10,0XC5,0X10,0XE5,0X10,0XC5,0X00,0X43,0X00,0X43,0X00,0X43,0X10,0XC5,0X10,0XE5,
0X10,0XC5,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,
0X19,0X26,0X08,0XA4,0X73,0XD0,0XFF,0XFF,0XFF,0XFF,0XFF,0XDF,0X3A,0X09,0X10,0XE5,
0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,
0X19,0X26,0X10,0XC5,0XAD,0X76,0XEF,0X7D,0XEF,0X7D,0X9C,0XF4,0X10,0XA5,0X19,0X26,
0X19,0X26,0X19,0X06,0X21,0X47,0X73,0XD0,0X7C,0X11,0X7B,0XF0,0X29,0X87,0X19,0X05,
0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,
0X19,0X26,0X08,0XA4,0X73,0XD0,0XFF,0XFF,0XFF,0XFF,0XFF,0XDF,0X3A,0X09,0X10,0XE5,
0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X06,
0X10,0XC5,0X10,0XA4,0X10,0XC5,0X19,0X26,0X19,0X26,0X10,0XC4,0X10,0XC4,0X10,0XC5,
0X19,0X26,0X10,0XC5,0X4A,0X8B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X5B,0X0D,0X10,0XA4,
0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,
0X19,0X26,0X08,0XA4,0X73,0XD0,0XFF,0XFF,0XFF,0XFF,0XFF,0XDF,0X3A,0X09,0X10,0XE5,
0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X06,0X21,0X47,
0X4A,0XAB,0X52,0XAC,0X4A,0XAB,0X4A,0X8B,0X4A,0X8B,0X52,0XAC,0X52,0XAC,0X4A,0X6B,
0X19,0X26,0X10,0XC5,0X4A,0X8B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X5B,0X0D,0X08,0XA4,
0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,
0X19,0X26,0X08,0XA4,0X73,0XD0,0XFF,0XFF,0XFF,0XFF,0XFF,0XDF,0X3A,0X09,0X10,0XE5,
0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X08,0XA4,0X6B,0X8F,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0X19,0X26,0X10,0XC5,0X4A,0X8B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X5B,0X0D,0X08,0XA4,
0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,
0X19,0X26,0X08,0X84,0X73,0XD0,0XFF,0XFF,0XFF,0XFF,0XFF,0XDF,0X3A,0X09,0X10,0XE5,
0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X08,0X84,0X7B,0XF0,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0X19,0X26,0X10,0XC4,0X4A,0X8B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X5B,0X0D,0X08,0XA4,
0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,
0X19,0X26,0X08,0X84,0X73,0XD0,0XFF,0XFF,0XFF,0XFF,0XFF,0XDF,0X3A,0X09,0X10,0XE5,
0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X08,0X84,0X73,0XD0,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0X19,0X26,0X10,0XC4,0X4A,0X8B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X5B,0X0D,0X08,0XA4,
0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,
0X19,0X26,0X08,0X84,0X73,0XD0,0XFF,0XFF,0XFF,0XFF,0XFF,0XDF,0X3A,0X09,0X10,0XE5,
0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X08,0X84,0X73,0XD0,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0X19,0X06,0X10,0XC4,0X4A,0X8B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X5B,0X0D,0X08,0XA4,
0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,
0X19,0X06,0X08,0X84,0X73,0XD0,0XFF,0XFF,0XFF,0XFF,0XFF,0XDF,0X3A,0X09,0X10,0XC5,
0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X08,0X84,0X7B,0XF0,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0X19,0X06,0X10,0XC4,0X4A,0X8B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X5B,0X0D,0X08,0XA4,
0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,
0X19,0X06,0X08,0X84,0X73,0XD0,0XFF,0XFF,0XFF,0XFF,0XFF,0XDF,0X3A,0X09,0X10,0XC5,
0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X10,0XE5,0X3A,0X09,
0XA5,0X35,0XA5,0X55,0XA5,0X55,0XA5,0X55,0XA5,0X55,0XA5,0X55,0XA5,0X55,0X9C,0XF4,
0X19,0X06,0X10,0XC4,0X4A,0X8B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X5B,0X0D,0X08,0XA4,
0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,
0X19,0X06,0X08,0X84,0X7B,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3A,0X09,0X10,0XC5,
0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X26,0X10,0XE5,
0X08,0X84,0X08,0X84,0X00,0X22,0X00,0X02,0X00,0X02,0X00,0X22,0X08,0X84,0X08,0X84,
0X19,0X06,0X08,0XA4,0X4A,0X6B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X5B,0X0D,0X08,0XA4,
0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,
0X19,0X06,0X08,0X84,0X63,0X4E,0XFF,0XDF,0XFF,0XFF,0XEF,0X7D,0X29,0XA8,0X10,0XE5,
0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,
0X19,0X06,0X10,0XC5,0X6B,0X8F,0XA5,0X55,0XA5,0X35,0X63,0X2D,0X10,0XC5,0X19,0X06,
0X19,0X06,0X08,0XA4,0X4A,0X6B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X5B,0X0D,0X08,0XA4,
0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,
0X10,0XE5,0X10,0XC4,0X10,0XC5,0X29,0XA8,0X31,0XC8,0X21,0X67,0X10,0XA4,0X10,0XC5,
0X19,0X05,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,
0X19,0X05,0X10,0XC5,0XD6,0XDB,0XFF,0XFF,0XFF,0XFF,0XC6,0X39,0X08,0X84,0X19,0X06,
0X19,0X06,0X08,0XA4,0X4A,0X6B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X5B,0X0D,0X08,0XA4,
0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X18,0XE5,
0X29,0X87,0X3A,0X09,0X31,0XE9,0X31,0XA8,0X31,0XA8,0X31,0XC8,0X39,0XE9,0X39,0XE9,
0X19,0X26,0X19,0X05,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,
0X19,0X05,0X10,0XC5,0XCE,0X7A,0XFF,0XFF,0XFF,0XFF,0XBD,0XD8,0X08,0XA4,0X19,0X06,
0X19,0X05,0X08,0XA4,0X4A,0X6B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X5A,0XED,0X08,0X84,
0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X10,0XE5,0X21,0X46,
0XDE,0XFC,0XFF,0XDF,0XFF,0XDF,0XFF,0XDF,0XFF,0XDF,0XFF,0XDF,0XFF,0XDF,0XFF,0XDF,
0X84,0X52,0X08,0X84,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,
0X19,0X05,0X10,0XC5,0XCE,0X7A,0XFF,0XFF,0XFF,0XFF,0XBD,0XD7,0X08,0X84,0X19,0X05,
0X19,0X05,0X08,0XA4,0X4A,0X6B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X5A,0XED,0X08,0X84,
0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X10,0XC5,0X29,0X87,
0XF7,0XBE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0X9C,0XF4,0X00,0X63,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,
0X19,0X05,0X10,0XC5,0XCE,0X7A,0XFF,0XFF,0XFF,0XFF,0XBD,0XD7,0X08,0X84,0X19,0X05,
0X19,0X05,0X08,0XA4,0X4A,0X6B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X5A,0XED,0X08,0X84,
0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X10,0XC5,0X29,0X87,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XA5,0X15,0X00,0X63,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,
0X19,0X05,0X10,0XC5,0XCE,0X7A,0XFF,0XFF,0XFF,0XFF,0XBD,0XD7,0X08,0X84,0X19,0X05,
0X19,0X05,0X08,0XA4,0X4A,0X6B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X5A,0XED,0X08,0X84,
0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X18,0XE5,0X19,0X05,
0X94,0XB3,0XB5,0XB7,0XB5,0XB7,0XB5,0XB7,0XB5,0XB7,0XB5,0XB7,0XB5,0XB7,0XB5,0X97,
0X5A,0XEC,0X08,0XA4,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,
0X19,0X05,0X10,0XC4,0XCE,0X79,0XFF,0XFF,0XFF,0XFF,0XBD,0XD7,0X08,0X84,0X19,0X05,
0X19,0X05,0X08,0XA4,0X4A,0X6B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X5A,0XED,0X08,0X84,
0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X18,0XE5,
0X08,0X84,0X08,0X84,0X00,0X63,0X00,0X01,0X00,0X01,0X00,0X02,0X08,0X83,0X08,0X84,
0X10,0XA4,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,
0X10,0XE5,0X10,0XC4,0XCE,0X79,0XFF,0XFF,0XFF,0XFF,0XBD,0XD7,0X08,0X84,0X18,0XE5,
0X19,0X05,0X08,0XA4,0X4A,0X6B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X5A,0XED,0X08,0X84,
0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,
0X19,0X05,0X10,0XC5,0X31,0XC8,0X8C,0X92,0X94,0XB3,0X7C,0X11,0X19,0X06,0X10,0XE5,
0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,
0X10,0XE5,0X10,0XC4,0XCE,0X79,0XFF,0XFF,0XFF,0XFF,0XBD,0XD7,0X08,0X84,0X18,0XE5,
0X19,0X05,0X08,0XA4,0X4A,0X6B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X5A,0XED,0X08,0X84,
0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,
0X19,0X05,0X00,0X63,0X7B,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X31,0XE9,0X10,0XA4,
0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,
0X10,0XE5,0X10,0XC4,0XCE,0X79,0XFF,0XFF,0XFF,0XFF,0XBD,0XD7,0X08,0X84,0X18,0XE5,
0X18,0XE5,0X08,0X84,0X42,0X6B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X5A,0XED,0X08,0X83,
0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,
0X18,0XE5,0X00,0X63,0X73,0XD0,0XFF,0XFF,0XFF,0XFF,0XFF,0XDF,0X31,0XE9,0X08,0XA4,
0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,
0X10,0XE5,0X10,0XA4,0XCE,0X79,0XFF,0XFF,0XFF,0XFF,0XBD,0XD7,0X08,0X84,0X10,0XE5,
0X18,0XE5,0X08,0X84,0X42,0X6B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X5A,0XED,0X08,0X83,
0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,
0X18,0XE5,0X00,0X63,0X73,0XD0,0XFF,0XFF,0XFF,0XFF,0XFF,0XDF,0X31,0XE9,0X08,0XA4,
0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,
0X10,0XE5,0X10,0XA4,0XCE,0X79,0XFF,0XFF,0XFF,0XFF,0XBD,0XD7,0X08,0X84,0X10,0XE5,
0X18,0XE5,0X08,0X84,0X4A,0X8B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X5B,0X0D,0X08,0X83,
0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,
0X18,0XE5,0X00,0X63,0X7B,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X39,0XE9,0X08,0XA4,
0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,
0X10,0XE5,0X10,0XA4,0XD6,0XBA,0XFF,0XFF,0XFF,0XFF,0XC6,0X18,0X08,0X83,0X10,0XE5,
0X10,0XE5,0X10,0XA4,0X29,0XA8,0XD6,0XBB,0XE7,0X3D,0XDE,0XFB,0X3A,0X09,0X08,0XA4,
0X10,0XE5,0X10,0XE5,0X10,0XE5,0X10,0XE5,0X10,0XE5,0X10,0XE5,0X10,0XE5,0X10,0XE5,
0X10,0XE5,0X08,0X84,0X4A,0XAB,0XE7,0X1C,0XE7,0X3D,0XCE,0X59,0X21,0X46,0X10,0XC5,
0X10,0XE5,0X10,0XE5,0X10,0XE5,0X10,0XE5,0X10,0XE5,0X10,0XE5,0X10,0XE5,0X10,0XE5,
0X10,0XE5,0X08,0X84,0X9C,0XF4,0XE7,0X3C,0XE7,0X3C,0X84,0X52,0X08,0X83,0X10,0XE5,
const unsigned char gImage_mixer[2244] = { /* 34x33 RGB565 BE */
0x00,0x00,0x00,0x00,0x00,0x00,0xD6,0x9A,0xFF,0xFF,0xD6,0x9A,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xD6,0x9A,0xFF,0xFF,0xD6,0x9A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF7,0x9E,0xFF,0xFF,0xA5,0x14,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x08,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x42,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x92,0xC6,0x18,
0x94,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x42,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xF7,0x9E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0x9E,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x08,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x8A,
0x84,0x10,0x52,0x8A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x42,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x42,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x08,
0x42,0x08,0x42,0x08,0x42,0x08,0x42,0x08,0x42,0x08,0x31,0x86,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x42,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x42,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x08,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x42,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xF7,0x9E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xD6,0x9A,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x08,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x42,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x42,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x42,0x08,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB5,0x96,0xC6,0x18,
0x94,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x42,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0xB5,0x96,0xC6,0x18,0xC6,0x18,0xC6,0x18,0xC6,0x18,0xC6,0x18,0x94,0x92,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB5,0x96,
0xC6,0x18,0x94,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF7,0x9E,
0xFF,0xFF,0xD6,0x9A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x31,0x86,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xD6,0x9A,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x42,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x08,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x31,0x86,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xD6,0x9A,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xF7,0x9E,0xFF,0xFF,0xD6,0x9A,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB5,0x96,
0xC6,0x18,0x94,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x42,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xB5,0x96,0xC6,0x18,0xC6,0x18,0xC6,0x18,
0xC6,0x18,0xC6,0x18,0x94,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x42,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x08,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x08,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x08,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xB5,0x96,0xC6,0x18,0xC6,0x18,0xC6,0x18,0xC6,0x18,0xC6,0x18,
0x94,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x42,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x42,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xF7,0x9E,0xFF,0xFF,0xF7,0x9E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x08,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x42,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x42,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x8E,0x84,0x10,0x73,0x8E,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x73,0x8E,0x84,0x10,0x73,0x8E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x8E,0x84,0x10,0x52,0x8A,
0x00,0x00,0x00,0x00,
};
const unsigned char gImage_SystemSetting[3200] = { /* 0X10,0X10,0X00,0X28,0X00,0X28,0X01,0X1B, */
0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,
0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X19,0X26,
0X21,0X67,0X42,0X4B,0X52,0XCC,0X5B,0X0D,0X5A,0XED,0X52,0XAC,0X42,0X2A,0X19,0X26,
0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,
0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,
0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,
0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X19,0X26,0X21,0X67,
0XD6,0XBB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X9C,0XD4,
0X10,0XC5,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,
0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,
0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,
0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X10,0XA5,0X7B,0XF0,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDF,
0X31,0XE9,0X19,0X06,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,
0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,
0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,
0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X19,0X26,0X19,0X26,0XDE,0XFB,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0X94,0XB3,0X08,0XA4,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,
0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,
0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X19,0X06,0X10,0XE5,
0X19,0X26,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X08,0X84,0X6B,0X8F,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XEF,0X7D,0X29,0X88,0X18,0XE5,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X46,0X19,0X06,
0X10,0XE5,0X19,0X26,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,
0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X10,0XC5,0X42,0X4A,0X52,0XAC,
0X29,0X67,0X10,0XC5,0X08,0XA4,0X10,0XC5,0X08,0X84,0X39,0XE9,0XE7,0X3D,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XB5,0XB7,0X10,0XE5,0X08,0XA4,0X10,0XC5,0X08,0XA4,0X10,0XE5,0X31,0XC9,
0X5A,0XED,0X29,0XA8,0X10,0XE5,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,0X21,0X47,
0X21,0X46,0X21,0X46,0X21,0X46,0X21,0X47,0X08,0XA4,0X63,0X4E,0XFF,0XDF,0XFF,0XFF,
0XE7,0X3C,0XB5,0XB7,0X84,0X31,0X6B,0X6E,0X8C,0X93,0XEF,0X7D,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XCE,0X7A,0X7B,0XF0,0X6B,0X8F,0X94,0XB3,0XC6,0X39,0XF7,0X9E,
0XFF,0XFF,0XD6,0XDB,0X31,0XA8,0X10,0XE5,0X21,0X47,0X21,0X46,0X21,0X46,0X21,0X46,
0X21,0X46,0X21,0X46,0X21,0X47,0X10,0XA4,0X52,0XCC,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XD6,0XBB,0X21,0X47,0X19,0X06,0X21,0X46,0X21,0X46,0X21,0X46,
0X21,0X46,0X21,0X46,0X10,0XE5,0X31,0XC9,0XEF,0X7E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBD,0XD8,0X10,0XC5,0X19,0X26,0X21,0X46,0X21,0X46,
0X21,0X26,0X19,0X26,0X10,0XE5,0XC6,0X59,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7C,0X11,0X08,0XA4,0X21,0X46,0X21,0X26,
0X21,0X26,0X10,0XC5,0X73,0XD0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XBE,0X31,0XE9,0X19,0X05,0X21,0X26,
0X21,0X26,0X08,0XA4,0X8C,0X93,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X4A,0X6B,0X10,0XE5,0X21,0X26,
0X19,0X26,0X18,0XE5,0X31,0XC9,0XF7,0X9E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XEF,0X7E,0XC6,0X39,0XAD,0X76,0XB5,0XB7,0XD6,0X9A,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBD,0XF8,0X10,0XC5,0X19,0X26,0X19,0X26,
0X19,0X26,0X19,0X26,0X08,0X84,0X94,0XB3,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0X3D,
0X73,0XD0,0X29,0X88,0X10,0XC5,0X08,0XA4,0X08,0XA4,0X10,0XE5,0X3A,0X09,0X94,0XD4,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X4A,0X8B,0X10,0XC5,0X19,0X26,0X19,0X26,
0X19,0X26,0X19,0X26,0X10,0XE5,0X31,0XC8,0XF7,0X9E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC6,0X18,0X29,0X87,
0X08,0X84,0X19,0X05,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X10,0XE5,0X08,0X84,
0X4A,0X8B,0XEF,0X5D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBD,0XF8,0X10,0XA4,0X19,0X26,0X19,0X26,0X19,0X26,
0X19,0X26,0X19,0X26,0X19,0X26,0X08,0XA4,0XB5,0X97,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XCE,0X59,0X18,0XE5,0X10,0XC5,
0X21,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,
0X08,0X84,0X42,0X2A,0XF7,0X9E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X63,0X4E,0X08,0XA4,0X19,0X26,0X19,0X26,0X19,0X26,
0X19,0X26,0X19,0X26,0X19,0X26,0X08,0X84,0X8C,0X93,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0X9E,0X31,0XC9,0X10,0XC5,0X19,0X26,
0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,
0X19,0X26,0X00,0X63,0X7B,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X42,0X6B,0X10,0XC5,0X19,0X26,0X19,0X26,0X19,0X26,
0X19,0X26,0X19,0X26,0X19,0X06,0X08,0X84,0XBE,0X18,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X94,0XB3,0X08,0X63,0X19,0X26,0X19,0X26,
0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,
0X19,0X26,0X19,0X06,0X19,0X06,0XDF,0X1C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X73,0XAF,0X00,0X63,0X19,0X26,0X19,0X26,0X19,0X26,
0X19,0X26,0X19,0X06,0X00,0X63,0X73,0XB0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X42,0X4A,0X10,0XC5,0X19,0X26,0X19,0X26,
0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,
0X19,0X26,0X19,0X26,0X08,0X84,0X94,0XD4,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0X3C,0X31,0XC8,0X08,0X84,0X19,0X26,0X19,0X26,
0X10,0XE5,0X08,0XA4,0X84,0X31,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0X5D,0X21,0X47,0X19,0X05,0X19,0X26,0X19,0X26,
0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,
0X19,0X26,0X19,0X26,0X08,0XA4,0X6B,0X6E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0X5D,0X4A,0X8B,0X00,0X63,0X19,0X06,
0X19,0X26,0XB5,0XB7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDE,0XDB,0X19,0X06,0X19,0X06,0X19,0X26,0X19,0X26,
0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,
0X19,0X26,0X19,0X26,0X08,0XA4,0X5A,0XED,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDF,0X7B,0XF1,0X10,0XC5,
0XCE,0X7A,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0X3C,0X21,0X26,0X19,0X05,0X19,0X26,0X19,0X26,
0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,0X19,0X26,
0X19,0X26,0X19,0X26,0X08,0XA4,0X63,0X4E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8C,0X93,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDF,0X3A,0X09,0X10,0XC5,0X19,0X06,0X19,0X06,
0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,
0X19,0X06,0X19,0X26,0X08,0X84,0X8C,0X72,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XB5,0XD7,
0XEF,0X5D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7C,0X11,0X00,0X63,0X19,0X26,0X19,0X06,
0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,
0X19,0X06,0X19,0X06,0X10,0XC5,0XCE,0X9A,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X94,0XD3,
0XB5,0XB7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0X1C,0X19,0X06,0X10,0XE5,0X19,0X06,
0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,
0X19,0X26,0X08,0X83,0X5A,0XED,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X63,0X2E,
0X7B,0XF0,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XA5,0X35,0X00,0X63,0X18,0XE5,
0X19,0X26,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X26,
0X08,0XA4,0X21,0X46,0XDE,0XFC,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X39,0XE9,
0X42,0X4A,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X94,0XB3,0X08,0XA4,
0X08,0XA4,0X19,0X05,0X19,0X06,0X19,0X06,0X19,0X06,0X19,0X06,0X18,0XE5,0X00,0X63,
0X21,0X47,0XCE,0X59,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0X1C,0X18,0XE5,
0X10,0XE5,0XE7,0X3C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBE,0X18,
0X42,0X4A,0X10,0XA4,0X00,0X63,0X08,0X83,0X08,0X83,0X08,0X63,0X10,0XE5,0X63,0X2D,
0XE7,0X1C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X94,0XD4,0X08,0X83,
0X10,0XC4,0X4A,0X8B,0XAD,0X76,0XD6,0XBB,0XF7,0XBE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XCE,0X59,0X94,0XD3,0X7B,0XF0,0X7C,0X11,0X9D,0X14,0XDE,0XDB,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0X3D,0XC6,0X39,0X94,0XB3,0X21,0X46,0X10,0XE5,
0X19,0X06,0X08,0XA4,0X08,0X84,0X10,0XE5,0X29,0XA8,0X5A,0XED,0XBD,0XF8,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XDF,0X8C,0X93,0X42,0X4A,0X21,0X26,0X08,0XA4,0X08,0X83,0X10,0XE5,0X19,0X06,
0X19,0X05,0X19,0X05,0X19,0X05,0X18,0XE5,0X10,0XC5,0X08,0X83,0X00,0X63,0X9D,0X14,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDF,
0X5A,0XED,0X00,0X22,0X08,0XA4,0X10,0XE5,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,
0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X10,0XC4,0X21,0X47,
0XEF,0X7E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XB5,0XB7,
0X00,0X63,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,
0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X08,0XA4,
0XC6,0X59,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X84,0X31,
0X00,0X63,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,
0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X18,0XE5,0X08,0XA4,
0XC6,0X39,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X84,0X31,
0X00,0X63,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,
0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X10,0XE5,0X10,0XC5,
0XD6,0X9A,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X84,0X31,
0X00,0X63,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,
0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X10,0XE5,0X19,0X06,
0XE7,0X3C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8C,0X72,
0X00,0X63,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,0X19,0X05,
0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X10,0XE5,0X08,0XA4,
0XC6,0X39,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XBD,0XF8,0X7B,0XF0,0X8C,0X72,0XDE,0XFB,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X73,0XB0,
0X00,0X63,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,
0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X10,0XC4,
0X29,0X87,0XB5,0X96,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XDF,0X6B,0X6E,0X00,0X63,0X00,0X43,0X00,0X43,0X18,0XE5,0XA5,0X35,0XFF,0XFF,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0X9E,0X84,0X31,0X10,0XE5,
0X10,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,
0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X19,0X05,
0X08,0XA4,0X08,0X83,0X4A,0X8B,0XBD,0XD7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0X3C,
0X42,0X4A,0X00,0X43,0X10,0XE5,0X18,0XE5,0X19,0X05,0X10,0XC4,0X00,0X63,0X7B,0XF0,
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XEF,0X7E,0X94,0XD4,0X29,0XA8,0X00,0X63,0X10,0XE5,
0X19,0X05,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,0X18,0XE5,
0X10,0XE5,0X10,0XE5,0X10,0XE5,0X10,0XE5,0X10,0XE5,0X10,0XE5,0X10,0XE5,0X10,0XE5,
0X18,0XE5,0X10,0XE5,0X08,0X83,0X08,0X83,0X31,0XC8,0X84,0X52,0X94,0XD4,0X21,0X67,
0X00,0X63,0X18,0XE5,0X10,0XE5,0X10,0XE5,0X10,0XE5,0X18,0XE5,0X10,0XE5,0X00,0X43,
0X4A,0X8B,0X9C,0XF4,0X6B,0X6E,0X21,0X46,0X00,0X63,0X08,0XA4,0X18,0XE5,0X10,0XE5,
0X10,0XE5,0X10,0XE5,0X10,0XE5,0X10,0XE5,0X10,0XE5,0X10,0XE5,0X10,0XE5,0X10,0XE5,
const unsigned char gImage_SystemSetting[2178] = { /* 33x33 RGB565 BE */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x08,0x63,0x0C,
0x84,0x10,0x52,0x8A,0x42,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD6,0x9A,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC6,0x18,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x08,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x42,0x08,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC6,0x18,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC6,0x18,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x0C,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x63,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x63,0x0C,0xF7,0x9E,0xFF,0xFF,0xE7,0x1C,0xA5,0x14,0x84,0x10,0xA5,0x14,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xA5,0x14,0x84,0x10,0xA5,0x14,0xE7,0x1C,0xFF,0xFF,
0xFF,0xFF,0x63,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x42,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x31,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xF7,0x9E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0x9E,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xB5,0x96,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xA5,0x14,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xC6,0x18,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC6,0x18,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA5,0x14,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xC6,0x18,0xC6,0x18,0xC6,0x18,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x84,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x84,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x10,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xF7,0x9E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA5,0x14,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0x9E,
0x31,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x31,0x86,0xF7,0x9E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xA5,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x52,0x8A,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x42,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x42,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x42,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x84,0x10,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xA5,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC6,0x18,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x63,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x31,0x86,0xF7,0x9E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x52,0x8A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x0C,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0x9E,0x31,0x86,0x00,0x00,0x00,0x00,
0x00,0x00,0x63,0x0C,0xF7,0x9E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x86,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0x9E,0x52,0x8A,
0x00,0x00,0x73,0x8E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x94,0x92,0xE7,0x1C,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x31,0x86,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x42,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x84,0x10,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x94,0x92,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0x9E,0xC6,0x18,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0x9E,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xF7,0x9E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC6,0x18,0x94,0x92,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xD6,0x9A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xD6,0x9A,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x84,0x10,0x42,0x08,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xD6,0x9A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xD6,0x9A,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x31,0x86,0x00,0x00,
0x94,0x92,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xB5,0x96,0x84,0x10,0x42,0x08,
0x84,0x10,0xB5,0x96,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x63,0x0C,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x08,0x73,0x8E,0xE7,0x1C,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xD6,0x9A,0x63,0x0C,0x31,0x86,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD6,0x9A,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC6,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x52,0x8A,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x52,0x8A,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x42,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x42,0x08,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x42,0x08,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x42,0x08,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x86,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x42,0x08,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC6,0x18,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x94,0x92,0x52,0x8A,0xA5,0x14,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0x9E,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x86,0xC6,0x18,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0x9E,0x31,0x86,0x00,0x00,0x00,0x00,
0x00,0x00,0x42,0x08,0xF7,0x9E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC6,0x18,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x42,0x08,0xA5,0x14,0xFF,0xFF,0xB5,0x96,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x86,0xB5,0x96,0xF7,0x9E,0xA5,0x14,0x42,0x08,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,
};

View File

@ -0,0 +1,419 @@
#include "Drv_ILI9341_Lcd_Image_ChargePct.h"
/* Auto-generated by tools/gen_charge_pct_glyphs.py — MiSans Semibold, shared baseline */
const unsigned char gImage_Charge_Digit0_14x20[560] = { /* 14x20 RGB565 BE */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
const unsigned char gImage_Charge_Digit1_9x20[360] = { /* 9x20 RGB565 BE */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
const unsigned char gImage_Charge_Digit2_13x20[520] = { /* 13x20 RGB565 BE */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
const unsigned char gImage_Charge_Digit3_13x20[520] = { /* 13x20 RGB565 BE */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
const unsigned char gImage_Charge_Digit4_14x20[560] = { /* 14x20 RGB565 BE */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
const unsigned char gImage_Charge_Digit5_13x20[520] = { /* 13x20 RGB565 BE */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
const unsigned char gImage_Charge_Digit6_13x20[520] = { /* 13x20 RGB565 BE */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
const unsigned char gImage_Charge_Digit7_12x20[480] = { /* 12x20 RGB565 BE */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
const unsigned char gImage_Charge_Digit8_14x20[560] = { /* 14x20 RGB565 BE */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
const unsigned char gImage_Charge_Digit9_13x20[520] = { /* 13x20 RGB565 BE */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
const unsigned char gImage_Charge_Pct_18x20[720] = { /* 18x20 RGB565 BE */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,
0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
const ChargePctGlyph g_ChargePctDigits[10] = {
{ gImage_Charge_Digit0_14x20, 14, 20 },
{ gImage_Charge_Digit1_9x20, 9, 20 },
{ gImage_Charge_Digit2_13x20, 13, 20 },
{ gImage_Charge_Digit3_13x20, 13, 20 },
{ gImage_Charge_Digit4_14x20, 14, 20 },
{ gImage_Charge_Digit5_13x20, 13, 20 },
{ gImage_Charge_Digit6_13x20, 13, 20 },
{ gImage_Charge_Digit7_12x20, 12, 20 },
{ gImage_Charge_Digit8_14x20, 14, 20 },
{ gImage_Charge_Digit9_13x20, 13, 20 },
};
const ChargePctGlyph g_ChargePctPercent = { gImage_Charge_Pct_18x20, 18, 20 };

View File

@ -0,0 +1,61 @@
#ifndef __DRV_ILI9341_LCD_IMAGE_CHARGE_PCT_H
#define __DRV_ILI9341_LCD_IMAGE_CHARGE_PCT_H
#include "stdint.h"
#define CHARGE_PCT_GLYPH_H 20
#define CHARGE_DIGIT0_W 14
#define CHARGE_DIGIT0_H 20
extern const unsigned char gImage_Charge_Digit0_14x20[560];
#define CHARGE_DIGIT1_W 9
#define CHARGE_DIGIT1_H 20
extern const unsigned char gImage_Charge_Digit1_9x20[360];
#define CHARGE_DIGIT2_W 13
#define CHARGE_DIGIT2_H 20
extern const unsigned char gImage_Charge_Digit2_13x20[520];
#define CHARGE_DIGIT3_W 13
#define CHARGE_DIGIT3_H 20
extern const unsigned char gImage_Charge_Digit3_13x20[520];
#define CHARGE_DIGIT4_W 14
#define CHARGE_DIGIT4_H 20
extern const unsigned char gImage_Charge_Digit4_14x20[560];
#define CHARGE_DIGIT5_W 13
#define CHARGE_DIGIT5_H 20
extern const unsigned char gImage_Charge_Digit5_13x20[520];
#define CHARGE_DIGIT6_W 13
#define CHARGE_DIGIT6_H 20
extern const unsigned char gImage_Charge_Digit6_13x20[520];
#define CHARGE_DIGIT7_W 12
#define CHARGE_DIGIT7_H 20
extern const unsigned char gImage_Charge_Digit7_12x20[480];
#define CHARGE_DIGIT8_W 14
#define CHARGE_DIGIT8_H 20
extern const unsigned char gImage_Charge_Digit8_14x20[560];
#define CHARGE_DIGIT9_W 13
#define CHARGE_DIGIT9_H 20
extern const unsigned char gImage_Charge_Digit9_13x20[520];
#define CHARGE_PCT_W 18
#define CHARGE_PCT_H 20
extern const unsigned char gImage_Charge_Pct_18x20[720];
typedef struct {
const unsigned char *data;
uint8_t w;
uint8_t h;
} ChargePctGlyph;
extern const ChargePctGlyph g_ChargePctDigits[10];
extern const ChargePctGlyph g_ChargePctPercent;
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,29 @@
#ifndef __DRV_ILI9341_LCD_IMAGE_UI0902_H
#define __DRV_ILI9341_LCD_IMAGE_UI0902_H
#include "stdint.h"
extern const unsigned char gImage_UI0902_BatteryOutline_29x12[];
extern const unsigned char gImage_UI0902_Volume_20x15[600];
extern const unsigned char gImage_UI0902_Bluetooth_11x17[374];
extern const unsigned char gImage_UI0902_BatteryFill_22x9[396];
extern const unsigned char gImage_UI0902_TabSetting_Sel_36x28[2016];
extern const unsigned char gImage_UI0902_TabSetting_Not_35x28[1960];
extern const unsigned char gImage_UI0902_TabMixer_Sel_35x27[1890];
extern const unsigned char gImage_UI0902_TabMixer_Not_18x28[1008];
extern const unsigned char gImage_UI0902_TabMixer_Not_35x28[1960];
extern const unsigned char gImage_UI0902_TabMode_Sel_36x28[2016];
extern const unsigned char gImage_UI0902_TabMode_Not_35x29[2030];
extern const unsigned char gImage_UI0902_TabBack_Sel_35x27[1890];
extern const unsigned char gImage_UI0902_TabBack_Not_18x28[1008];
extern const unsigned char gImage_UI0902_BtnMinus_23x22[1012];
extern const unsigned char gImage_UI0902_BtnPlus_23x22[1012];
extern const unsigned char gImage_UI0902_TabBack_30x24[1440];
extern const unsigned char gImage_UI0902_TriLeft_22x22[968];
extern const unsigned char gImage_UI0902_TriRight_23x22[1012];
extern const unsigned char gImage_UI0902_Txt_Confirm_50x24[2400];
extern const unsigned char gImage_UI0902_Txt_Cancel_50x24[2400];
#endif

View File

@ -203,9 +203,7 @@ void LCD_Init(void)
LCD_WR_DATA8(0x0F);
// LCD_WR_REG(0x29); //Display on
LCD_FillByColor(0, 0, 240, 320, BLACK); // 初始全屏白色
LCD_FillByColor(0, 0, 240, 320, BLACK);
LCD_WR_REG(0x29); //Display on
// LCD_BLK_Set();
LCD_BLK_Set();
}

View File

@ -101,6 +101,7 @@ extern void LCD_SetWindow(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);
extern void LCD_Init(void); //LCD初始化
extern void LCD_SPI_DMA_Send(const uint8_t *data, uint32_t len); //SPI2 DMA批量发送
extern void LCD_DrawChevron_Right(uint16_t x, uint16_t y, uint8_t size, uint8_t thick, uint16_t color); //向右空心尖括号
extern void LCD_DrawChevron_Left(uint16_t x, uint16_t y, uint8_t size, uint8_t thick, uint16_t color); //向左空心尖括号
// 渐变背景文字显示(先画垂直渐变底,再叠加文字笔画)
extern uint32_t LCD_ShowChinese_AutoAlign_Gradient(uint16_t x1, uint16_t x2, uint16_t y,

View File

@ -20,9 +20,9 @@ void XPT2046_Init(void)
gpio_init_struct.gpio_pins = TP_CLK_PIN | TP_DIN_PIN | TP_CS_PIN;
gpio_init(GPIOC, &gpio_init_struct);
// 输入引脚OUT上拉、IRQ上拉
// DOUT浮空输入内部上拉易把空闲读成满量程
gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
gpio_init_struct.gpio_pull = GPIO_PULL_UP;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init_struct.gpio_pins = TP_OUT_PIN;
gpio_init(TP_OUT_PORT, &gpio_init_struct);
@ -92,13 +92,12 @@ void TP_Write_Byte(uint8_t data)
//从触摸屏IC读取adc值
//CMD:指令
//返回值:读到的数据
uint16_t TP_Read_AD(uint8_t cmd)
/* 在 CS 已拉低时写命令并读与量产一致16 时钟取高 12bit */
static uint16_t TP_Read_AD_CSHeld(uint8_t cmd)
{
uint8_t i;
uint16_t adc_val = 0;
TP_CS_Clr();
Delay_us(2);
TP_Write_Byte(cmd);
Delay_us(6);
@ -113,89 +112,92 @@ uint16_t TP_Read_AD(uint8_t cmd)
adc_val |= 0x01;
}
return (uint16_t)(adc_val >> 4);
}
uint16_t TP_Read_AD(uint8_t cmd)
{
uint16_t v;
TP_CS_Clr();
Delay_us(2);
v = TP_Read_AD_CSHeld(cmd);
TP_CS_Set();
return adc_val >> 4;
return v;
}
uint8_t TP_CheckPressed(uint8_t n)
#define TP_ADC_PRESS_MIN 120u
#define TP_ADC_PRESS_MAX 4095u
#define TP_PRESSURE_MIN 80u
/* 本板 IRQ 无效;压力仅作弱参考,不过度拦截(真触摸 z 也常偏大) */
#define TP_PRESSURE_MAX 5000u
static uint16_t TP_Median5(uint16_t *a)
{
uint8_t count = 0;
uint8_t i, j;
uint16_t t;
for (i = 0; i < 4; i++) {
for (j = (uint8_t)(i + 1U); j < 5U; j++) {
if (a[j] < a[i]) {
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
return a[2];
}
static void TP_SampleXY(uint16_t *out_x, uint16_t *out_y)
{
uint16_t xs[5], ys[5];
uint8_t i;
for (i = 0; i < n; i++)
{
if (TP_IRQ_Read() == 0)
count++;
Delay_us(100);
for (i = 0; i < 5; i++) {
xs[i] = TP_Read_AD(XPT2046_READ_X);
Delay_us(15);
ys[i] = TP_Read_AD(XPT2046_READ_Y);
Delay_us(15);
}
return (count >= (n / 2)) ? 1 : 0;
*out_x = TP_Median5(xs);
*out_y = TP_Median5(ys);
}
static uint16_t TP_SampleAxis(uint8_t cmd)
static uint16_t TP_ReadPressure(void)
{
(void)TP_Read_AD(cmd);
uint16_t z1, z2;
z1 = TP_Read_AD(XPT2046_READ_Z1);
Delay_us(15);
return TP_Read_AD(cmd);
z2 = TP_Read_AD(XPT2046_READ_Z2);
return (z1 > z2) ? (uint16_t)(z1 - z2) : 0U;
}
TP_Point TP_ReadRaw(void)
static uint8_t TP_AdcCoordValid(uint16_t x, uint16_t y)
{
TP_Point p = {0, 0, 0};
uint32_t x_sum = 0, y_sum = 0;
uint8_t i;
static uint8_t s_raw_logged;
if (!TP_CheckPressed(3)) {
s_raw_logged = 0U;
return p;
}
for (i = 0; i < 5; i++)
{
x_sum += TP_SampleAxis(XPT2046_READ_X);
Delay_us(15);
y_sum += TP_SampleAxis(XPT2046_READ_Y);
Delay_us(15);
}
p.x = (uint16_t)(x_sum / 5);
p.y = (uint16_t)(y_sum / 5);
/* Y 通道常为 0 时,交换 X/Y 命令再采一次 */
if (p.y < 80u && p.x > 80u)
{
uint32_t sx = 0, sy = 0;
for (i = 0; i < 3; i++)
{
sx += TP_SampleAxis(XPT2046_READ_Y);
Delay_us(15);
sy += TP_SampleAxis(XPT2046_READ_X);
Delay_us(15);
}
if (sy / 3u > p.y)
{
p.x = (uint16_t)(sx / 3);
p.y = (uint16_t)(sy / 3);
}
}
p.pressed = 1;
if (!s_raw_logged) {
LOG_TP("raw x=%u y=%u irq=%u", (unsigned)p.x, (unsigned)p.y,
(unsigned)(TP_IRQ_Read() == 0U));
s_raw_logged = 1U;
}
return p;
/* 仅排除明显无效双高在本板上也可能是真触摸Y 常贴高,垂直靠 raw.x */
if (x < TP_ADC_PRESS_MIN && y < TP_ADC_PRESS_MIN)
return 0U;
if (x > 4000u && y > 4000u)
return 0U;
return (x <= TP_ADC_PRESS_MAX && y <= TP_ADC_PRESS_MAX) ? 1U : 0U;
}
#define CALIB_X_MIN 200
#define CALIB_X_MAX 3800
#define CALIB_Y_MIN 200
#define CALIB_Y_MAX 3800
#define CALIB_Y_MAX 3950
/* 竖屏:多数 ILI9341+XPT2046 板级需 XY 对调X 镜像与历史 240-tp.x 一致 */
#define TP_SWAP_XY 1
/*
* 线raw.xXraw.yY
* X TP_MIRROR_X
* TP_MIRROR_Y=1 Y
* DOUT(PA15) raw.y ADC 退
*/
#define TP_SWAP_XY 0
#define TP_MIRROR_X 1
#define TP_MIRROR_Y 0
@ -221,32 +223,120 @@ static uint16_t TP_MapAxis(uint16_t adc, uint16_t adc_min, uint16_t adc_max, uin
return (uint16_t)px;
}
TP_Point TP_Read(void)
static void TP_RawToScreen(uint16_t raw_x, uint16_t raw_y, uint16_t *sx, uint16_t *sy)
{
TP_Point raw = TP_ReadRaw();
TP_Point calib = {0, 0, raw.pressed};
uint16_t ax, ay;
if (!raw.pressed)
return calib;
#if TP_SWAP_XY
ax = TP_MapAxis(raw.y, CALIB_Y_MIN, CALIB_Y_MAX, (uint16_t)(LCD_W - 1));
ay = TP_MapAxis(raw.x, CALIB_X_MIN, CALIB_X_MAX, (uint16_t)(LCD_H - 1));
ax = TP_MapAxis(raw_y, CALIB_Y_MIN, CALIB_Y_MAX, (uint16_t)(LCD_W - 1));
ay = TP_MapAxis(raw_x, CALIB_X_MIN, CALIB_X_MAX, (uint16_t)(LCD_H - 1));
#else
ax = TP_MapAxis(raw.x, CALIB_X_MIN, CALIB_X_MAX, (uint16_t)(LCD_W - 1));
ay = TP_MapAxis(raw.y, CALIB_Y_MIN, CALIB_Y_MAX, (uint16_t)(LCD_H - 1));
ax = TP_MapAxis(raw_x, CALIB_X_MIN, CALIB_X_MAX, (uint16_t)(LCD_W - 1));
ay = TP_MapAxis(raw_y, CALIB_Y_MIN, CALIB_Y_MAX, (uint16_t)(LCD_H - 1));
#endif
#if TP_MIRROR_X
ax = (uint16_t)(LCD_W - 1 - ax);
#endif
#if TP_MIRROR_Y
ay = (uint16_t)(LCD_H - 1 - ay);
#endif
*sx = ax;
*sy = ay;
}
calib.x = ax;
calib.y = ay;
void TP_LogStatus(void)
{
uint16_t x, y, z;
uint16_t sx, sy;
z = TP_ReadPressure();
TP_SampleXY(&x, &y);
TP_RawToScreen(x, y, &sx, &sy);
LOG_TPI("status irq=%u z=%u raw=%u,%u cal=%u,%u",
(unsigned)(TP_IRQ_Read() == 0U),
(unsigned)z,
(unsigned)x, (unsigned)y,
(unsigned)sx, (unsigned)sy);
}
static uint8_t s_tp_live;
void TP_SetLiveMode(uint8_t on)
{
s_tp_live = on ? 1U : 0U;
LOG_TPI("live %s (events only)", s_tp_live ? "on" : "off");
}
/* 不再空闲刷屏;按下事件仍由 touch task 的 scan/press/release 打印 */
void TP_LivePoll(void)
{
(void)s_tp_live;
}
uint8_t TP_CheckPressed(uint8_t n)
{
uint8_t count = 0;
uint8_t i;
for (i = 0; i < n; i++)
{
if (TP_IRQ_Read() == 0)
count++;
Delay_us(100);
}
return (count >= ((n + 1U) / 2U)) ? 1U : 0U;
}
TP_Point TP_ReadRaw(void)
{
TP_Point p = {0, 0, 0};
uint8_t irq_pressed;
static uint8_t s_raw_logged;
uint16_t rx, ry;
irq_pressed = TP_CheckPressed(3);
if (!irq_pressed) {
/*
* ADC y=4095
* IRQ IRQ
*/
s_raw_logged = 0U;
return p;
}
TP_SampleXY(&rx, &ry);
if (!TP_AdcCoordValid(rx, ry)) {
s_raw_logged = 0U;
return p;
}
p.x = rx;
p.y = ry;
p.pressed = 1;
if (!s_raw_logged) {
LOG_TPI("raw x=%u y=%u irq=1", (unsigned)p.x, (unsigned)p.y);
s_raw_logged = 1U;
}
return p;
}
TP_Point TP_Read(void)
{
TP_Point raw = TP_ReadRaw();
TP_Point calib = {0, 0, raw.pressed};
static uint8_t s_cal_logged;
if (!raw.pressed) {
s_cal_logged = 0U;
return calib;
}
TP_RawToScreen(raw.x, raw.y, &calib.x, &calib.y);
if (!s_cal_logged) {
LOG_TPI("cal x=%u y=%u (raw %u,%u)", (unsigned)calib.x, (unsigned)calib.y,
(unsigned)raw.x, (unsigned)raw.y);
s_cal_logged = 1U;
}
return calib;
}

View File

@ -33,7 +33,7 @@
#define TP_DIN_Clr() gpio_bits_reset(TP_DIN_PORT, TP_DIN_PIN) // DIN输出低MCU→XPT2046
#define TP_DIN_Set() gpio_bits_set(TP_DIN_PORT, TP_DIN_PIN) // DIN输出高MCU→XPT2046
// XPT2046命令与 BOOT 工程一致)
/* 与量产/BOOT 一致PD1:PD0=00转换后掉电时序用 16clk>>4 */
#define XPT2046_READ_X 0xD0
#define XPT2046_READ_Y 0x90
#define XPT2046_READ_Z1 0xB0
@ -64,6 +64,9 @@ extern uint16_t TP_Read_AD(uint8_t CMD); // 从触摸屏IC读取adc值
extern uint8_t TP_CheckPressed(uint8_t n); // 简单去抖动读取连续n次相同状态视为有效
extern TP_Point TP_ReadRaw(void); // 读取原始坐标(未校准)
extern TP_Point TP_Read(void); // 校准后获取LCD坐标
extern void TP_LogStatus(void); // 打印 IRQ/ADC 诊断RTT tp status
extern void TP_SetLiveMode(uint8_t on); // 实时采样日志开关RTT tp live / tp live off
extern void TP_LivePoll(void); // live 模式下周期性打印 raw/cal
extern void EXTI15_10_IRQHandler(void); // EXTI15_10中断服务函数处理TP_IRQ触发
//extern void HAL_EXTI_Callback(EXTI_HandleTypeDef *hexti); // 中断回调函数(触摸触发时执行)

View File

@ -205,12 +205,13 @@ void drv_nvm_load_default_calibration_static_value(NvmParam_Type * pData, uint8
pData->param.StringVol = 7;
pData->param.MIcVol = 7;
pData->param.MicRev = 7;
/* 手册0=15 / 1=30 / 2=45 / 3=60 / 4=不自动;默认 15 分钟 */
pData->param.AutoCloseTime = 0;
pData->param.Transpose = 0;
pData->param.BluetoothSW = 1; /* 出厂默认蓝牙开 */
pData->param.Param1 = 0;
pData->param.Param2 = 0;
pData->param.Param3 = 0;
//pData->param.Language = 0;
}
mGuiData[GUI_SPEED].Current = pData->param.BPM;
mGuiData[GUI_TIMBRE_SELECT].Current = pData->param.Timbre;
@ -219,7 +220,27 @@ void drv_nvm_load_default_calibration_static_value(NvmParam_Type * pData, uint8
faders[1].val = pData->param.StringVol;
faders[2].val = pData->param.MIcVol;
faders[3].val = pData->param.MicRev;
//mGuiData_SystemSETTING[GUI_AUTOCLOSE].Current = pData->param.AutoCloseTime;
if (pData->param.AutoCloseTime > 4)
pData->param.AutoCloseTime = 0;
mGuiData_SystemSETTING[GUI_AUTOCLOSE].Current = pData->param.AutoCloseTime;
/* 旧固件 Language 槽可能为 0xFF非法值按默认开处理 */
if (pData->param.BluetoothSW > 1)
pData->param.BluetoothSW = 1;
mGuiData_SystemSETTING[GUI_BLUETOOTH_SW].Current = pData->param.BluetoothSW;
mGuiData[GUI_BL_SW].Current = pData->param.BluetoothSW;
/* 开机/出厂:同步自动关机运行时秒表(手册 15/30/45/60/不自动) */
AutoCloseFlag = true;
switch (pData->param.AutoCloseTime)
{
case 0: AutoCloseTime = 15; break;
case 1: AutoCloseTime = 30; break;
case 2: AutoCloseTime = 45; break;
case 3: AutoCloseTime = 60; break;
case 4: AutoCloseTime = 0; AutoCloseFlag = false; break;
default: AutoCloseTime = 15; break;
}
if (AutoCloseFlag && AutoCloseTime)
mAutoPowerOffCount = (uint16_t)(AutoCloseTime * 60);
ParamGuiData[SONG_MODE_PARAM].Current = pData->param.Param1;
ParamGuiData[EXPRESS_MODE_PARAM].Current = pData->param.Param2;
ParamGuiData[ALL_MODE_PARAM].Current = pData->param.Param3;

View File

@ -19,7 +19,7 @@ typedef struct {
uint8_t MicRev;
uint8_t AutoCloseTime;
uint8_t Transpose;
uint8_t Language;
uint8_t BluetoothSW; /* 0=关 1=开;复用原 Language 槽位,布局不变 */
uint8_t Param1;
uint8_t Param2;
uint8_t Param3;

View File

@ -21,7 +21,7 @@ define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFED
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
initialize by copy { readwrite };
initialize by copy with packing = none { readwrite };
do not initialize { section .noinit };
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };

View File

@ -2085,10 +2085,16 @@
<name>$PROJ_DIR$\..\..\device\LCD_ILI9341\Drv_ILI9341_Lcd_Image.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\..\device\LCD_ILI9341\Drv_ILI9341_Lcd_Image_ModeSelect0831.c</name>
<name>$PROJ_DIR$\..\..\device\LCD_ILI9341\Drv_ILI9341_Lcd_Image_UI0902.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\..\device\LCD_ILI9341\Drv_ILI9341_Lcd_Image_ModeSelect0831.h</name>
<name>$PROJ_DIR$\..\..\device\LCD_ILI9341\Drv_ILI9341_Lcd_Image_UI0902.h</name>
</file>
<file>
<name>$PROJ_DIR$\..\..\device\LCD_ILI9341\Drv_ILI9341_Lcd_Image_ChargePct.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\..\device\LCD_ILI9341\Drv_ILI9341_Lcd_Image_ChargePct.h</name>
</file>
<file>
<name>$PROJ_DIR$\..\..\device\LCD_ILI9341\Drv_ILI9341_Lcd_Image.h</name>

View File

@ -0,0 +1,42 @@
#ifndef __EXTFLASH_TONE_ADDR_H
#define __EXTFLASH_TONE_ADDR_H
/* Auto-generated by tools/pack_extflash_tone_0903.py — do not hand-edit. */
/* W25Q128 absolute offsets. Boot logo display uses UI0902_BOOT_LOGO_ADDR. */
/* Tone resource pack has no in-bin version field; release tag = EXTFLASH_TONE_RES_VER. */
#define EXTFLASH_TONE_RES_VER "0903"
#define EXTFLASH_TONE_RES_VER_MAJOR 0
#define EXTFLASH_TONE_RES_VER_MINOR 9
#define EXTFLASH_TONE_RES_VER_PATCH 3
#define EXTFLASH_LOGO_ADDR 0x00000000UL
#define EXTFLASH_LOGO_SIZE 52080UL
#define EXTFLASH_CHARGING_ADDR 0x0000CB70UL
#define EXTFLASH_CHARGING_SIZE 60800UL
#define EXTFLASH_CHARGING_W 160
#define EXTFLASH_CHARGING_H 190
#define EXTFLASH_BIN1_RHYTHM_ADDR 0x0001B8F0UL
#define EXTFLASH_BIN1_RHYTHM_SIZE 530317UL
#define EXTFLASH_BIN2_SONG_HAITIAN_ADDR 0x0009D07DUL
#define EXTFLASH_BIN2_SONG_HAITIAN_SIZE 41040UL
#define EXTFLASH_BIN3_UNIVERSAL_ADDR 0x000A70CDUL
#define EXTFLASH_BIN3_UNIVERSAL_SIZE 31854UL
/* Convenience aliases used by UI ADDRESS */
#define FLASH_ADDR_MODE_NORMAL EXTFLASH_BIN1_RHYTHM_ADDR /* 普通 */
#define FLASH_ADDR_MODE_EXPERT EXTFLASH_BIN1_RHYTHM_ADDR /* 专业 */
#define FLASH_ADDR_SONG_HAITIAN EXTFLASH_BIN2_SONG_HAITIAN_ADDR
#define FLASH_ADDR_MODE_UNIVERSAL EXTFLASH_BIN3_UNIVERSAL_ADDR /* 万能 */
/* Legacy AutoBand bank — not repacked in 0903; left unchanged in firmware */
#define FLASH_ADDR_AUTOBAND_LEGACY 0x0009EB5FUL
#define EXTFLASH_TONE_PACK_END 0x000AED3BUL
#define EXTFLASH_TONE_PACK_SIZE 716091UL
#define UI0902_RES_BASE_SAFE_GAP (0x00100000UL - EXTFLASH_TONE_PACK_END)
#endif

View File

@ -0,0 +1,17 @@
#ifndef __LOCAL_SONG_NAMES_H
#define __LOCAL_SONG_NAMES_H
/* Auto-generated by tools/gen_local_song_names.py from local_songs.csv — do not hand-edit. */
/* Display names are GBK for LCD_ShowMixedString; codes match 2.bin preset ASCII (e.g. HKTK). */
#define LOCAL_SONG_COUNT 1
static const char * const LocalSongNameGbk[LOCAL_SONG_COUNT] = {
"\xBA\xA3\xC0\xAB\xCC\xEC\xBF\xD5", /* 0: 海阔天空 */
};
static const char * const LocalSongCode[LOCAL_SONG_COUNT] = {
"HKTK", /* 0 */
};
#endif /* __LOCAL_SONG_NAMES_H */

View File

@ -0,0 +1,295 @@
#ifndef __UI0902_RES_ADDR_H
#define __UI0902_RES_ADDR_H
/* Auto-generated by tools/gen_ui0902_assets.py. W25Q128 resource map. */
#define UI0902_RES_BASE 0x00100000UL
#define UI0902_ROW_UNIVERSAL_NOT_ADDR (UI0902_RES_BASE + 0x000000UL) /* 39072 bytes */
#define UI0902_ROW_UNIVERSAL_NOT_W 222
#define UI0902_ROW_UNIVERSAL_NOT_H 88
#define UI0902_ROW_UNIVERSAL_SEL_ADDR (UI0902_RES_BASE + 0x00A000UL) /* 39072 bytes */
#define UI0902_ROW_UNIVERSAL_SEL_W 222
#define UI0902_ROW_UNIVERSAL_SEL_H 88
#define UI0902_ROW_NORMAL_NOT_ADDR (UI0902_RES_BASE + 0x014000UL) /* 39072 bytes */
#define UI0902_ROW_NORMAL_NOT_W 222
#define UI0902_ROW_NORMAL_NOT_H 88
#define UI0902_ROW_NORMAL_SEL_ADDR (UI0902_RES_BASE + 0x01E000UL) /* 39072 bytes */
#define UI0902_ROW_NORMAL_SEL_W 222
#define UI0902_ROW_NORMAL_SEL_H 88
#define UI0902_ROW_EXPERT_NOT_ADDR (UI0902_RES_BASE + 0x028000UL) /* 39072 bytes */
#define UI0902_ROW_EXPERT_NOT_W 222
#define UI0902_ROW_EXPERT_NOT_H 88
#define UI0902_ROW_EXPERT_SEL_ADDR (UI0902_RES_BASE + 0x032000UL) /* 39072 bytes */
#define UI0902_ROW_EXPERT_SEL_W 222
#define UI0902_ROW_EXPERT_SEL_H 88
#define UI0902_ICON_UNIVERSAL_SEL_ADDR (UI0902_RES_BASE + 0x03C000UL) /* 2730 bytes */
#define UI0902_ICON_UNIVERSAL_SEL_W 39
#define UI0902_ICON_UNIVERSAL_SEL_H 35
#define UI0902_ICON_UNIVERSAL_NOT_ADDR (UI0902_RES_BASE + 0x03D000UL) /* 2736 bytes */
#define UI0902_ICON_UNIVERSAL_NOT_W 38
#define UI0902_ICON_UNIVERSAL_NOT_H 36
#define UI0902_ICON_NORMAL_SEL_ADDR (UI0902_RES_BASE + 0x03E000UL) /* 3200 bytes */
#define UI0902_ICON_NORMAL_SEL_W 40
#define UI0902_ICON_NORMAL_SEL_H 40
#define UI0902_ICON_NORMAL_NOT_ADDR (UI0902_RES_BASE + 0x03F000UL) /* 3280 bytes */
#define UI0902_ICON_NORMAL_NOT_W 41
#define UI0902_ICON_NORMAL_NOT_H 40
#define UI0902_ICON_EXPERT_SEL_ADDR (UI0902_RES_BASE + 0x040000UL) /* 2760 bytes */
#define UI0902_ICON_EXPERT_SEL_W 46
#define UI0902_ICON_EXPERT_SEL_H 30
#define UI0902_ICON_EXPERT_NOT_ADDR (UI0902_RES_BASE + 0x041000UL) /* 2760 bytes */
#define UI0902_ICON_EXPERT_NOT_W 46
#define UI0902_ICON_EXPERT_NOT_H 30
#define UI0902_TXT_MODE_UNIVERSAL_NOT_ADDR (UI0902_RES_BASE + 0x042000UL) /* 3360 bytes */
#define UI0902_TXT_MODE_UNIVERSAL_NOT_W 80
#define UI0902_TXT_MODE_UNIVERSAL_NOT_H 21
#define UI0902_TXT_MODE_UNIVERSAL_SEL_ADDR (UI0902_RES_BASE + 0x043000UL) /* 3318 bytes */
#define UI0902_TXT_MODE_UNIVERSAL_SEL_W 79
#define UI0902_TXT_MODE_UNIVERSAL_SEL_H 21
#define UI0902_TXT_MODE_NORMAL_NOT_ADDR (UI0902_RES_BASE + 0x044000UL) /* 3318 bytes */
#define UI0902_TXT_MODE_NORMAL_NOT_W 79
#define UI0902_TXT_MODE_NORMAL_NOT_H 21
#define UI0902_TXT_MODE_NORMAL_SEL_ADDR (UI0902_RES_BASE + 0x045000UL) /* 3360 bytes */
#define UI0902_TXT_MODE_NORMAL_SEL_W 80
#define UI0902_TXT_MODE_NORMAL_SEL_H 21
#define UI0902_TXT_MODE_EXPERT_NOT_ADDR (UI0902_RES_BASE + 0x046000UL) /* 3360 bytes */
#define UI0902_TXT_MODE_EXPERT_NOT_W 80
#define UI0902_TXT_MODE_EXPERT_NOT_H 21
#define UI0902_TXT_MODE_EXPERT_SEL_ADDR (UI0902_RES_BASE + 0x047000UL) /* 3360 bytes */
#define UI0902_TXT_MODE_EXPERT_SEL_W 80
#define UI0902_TXT_MODE_EXPERT_SEL_H 21
#define UI0902_ICON_SET_BLUETOOTH_ADDR (UI0902_RES_BASE + 0x048000UL) /* 546 bytes */
#define UI0902_ICON_SET_BLUETOOTH_W 13
#define UI0902_ICON_SET_BLUETOOTH_H 21
#define UI0902_ICON_SET_GEAR_ADDR (UI0902_RES_BASE + 0x049000UL) /* 2244 bytes */
#define UI0902_ICON_SET_GEAR_W 33
#define UI0902_ICON_SET_GEAR_H 34
#define UI0902_ICON_CHEVRON_ADDR (UI0902_RES_BASE + 0x04A000UL) /* 360 bytes */
#define UI0902_ICON_CHEVRON_W 10
#define UI0902_ICON_CHEVRON_H 18
#define UI0902_ROW_SET_BLUETOOTH_ADDR (UI0902_RES_BASE + 0x04B000UL) /* 11484 bytes */
#define UI0902_ROW_SET_BLUETOOTH_W 174
#define UI0902_ROW_SET_BLUETOOTH_H 33
#define UI0902_ROW_SET_SYSTEM_ADDR (UI0902_RES_BASE + 0x04E000UL) /* 11484 bytes */
#define UI0902_ROW_SET_SYSTEM_W 174
#define UI0902_ROW_SET_SYSTEM_H 33
#define UI0902_ICON_SYS_LANG_ADDR (UI0902_RES_BASE + 0x051000UL) /* 760 bytes */
#define UI0902_ICON_SYS_LANG_W 20
#define UI0902_ICON_SYS_LANG_H 19
#define UI0902_ICON_SYS_RESTORE_ADDR (UI0902_RES_BASE + 0x052000UL) /* 684 bytes */
#define UI0902_ICON_SYS_RESTORE_W 19
#define UI0902_ICON_SYS_RESTORE_H 18
#define UI0902_ICON_SYS_ABOUT_ADDR (UI0902_RES_BASE + 0x053000UL) /* 756 bytes */
#define UI0902_ICON_SYS_ABOUT_W 18
#define UI0902_ICON_SYS_ABOUT_H 21
#define UI0902_ICON_SYS_VERSION_ADDR (UI0902_RES_BASE + 0x054000UL) /* 760 bytes */
#define UI0902_ICON_SYS_VERSION_W 20
#define UI0902_ICON_SYS_VERSION_H 19
#define UI0902_TXT_SET_LANG_ADDR (UI0902_RES_BASE + 0x055000UL) /* 1326 bytes */
#define UI0902_TXT_SET_LANG_W 51
#define UI0902_TXT_SET_LANG_H 13
#define UI0902_TXT_SET_RESTORE_ADDR (UI0902_RES_BASE + 0x056000UL) /* 1326 bytes */
#define UI0902_TXT_SET_RESTORE_W 51
#define UI0902_TXT_SET_RESTORE_H 13
#define UI0902_TXT_SET_ABOUT_ADDR (UI0902_RES_BASE + 0x057000UL) /* 1300 bytes */
#define UI0902_TXT_SET_ABOUT_W 50
#define UI0902_TXT_SET_ABOUT_H 13
#define UI0902_TXT_SET_VERSION_ADDR (UI0902_RES_BASE + 0x058000UL) /* 2156 bytes */
#define UI0902_TXT_SET_VERSION_W 77
#define UI0902_TXT_SET_VERSION_H 14
#define UI0902_TXT_SET2_A_ADDR (UI0902_RES_BASE + 0x059000UL) /* 3822 bytes */
#define UI0902_TXT_SET2_A_W 91
#define UI0902_TXT_SET2_A_H 21
#define UI0902_TXT_SET2_B_ADDR (UI0902_RES_BASE + 0x05A000UL) /* 440 bytes */
#define UI0902_TXT_SET2_B_W 22
#define UI0902_TXT_SET2_B_H 10
#define UI0902_TXT_SET2_C_ADDR (UI0902_RES_BASE + 0x05B000UL) /* 220 bytes */
#define UI0902_TXT_SET2_C_W 11
#define UI0902_TXT_SET2_C_H 10
#define UI0902_TXT_SET2_D_ADDR (UI0902_RES_BASE + 0x05C000UL) /* 768 bytes */
#define UI0902_TXT_SET2_D_W 32
#define UI0902_TXT_SET2_D_H 12
#define UI0902_BTN_TYPE_ACOUSTIC_SEL_ADDR (UI0902_RES_BASE + 0x05D000UL) /* 2166 bytes */
#define UI0902_BTN_TYPE_ACOUSTIC_SEL_W 57
#define UI0902_BTN_TYPE_ACOUSTIC_SEL_H 19
#define UI0902_BTN_TYPE_SING_NOT_ADDR (UI0902_RES_BASE + 0x05E000UL) /* 2166 bytes */
#define UI0902_BTN_TYPE_SING_NOT_W 57
#define UI0902_BTN_TYPE_SING_NOT_H 19
#define UI0902_BTN_TYPE_FINGER_NOT_ADDR (UI0902_RES_BASE + 0x05F000UL) /* 2166 bytes */
#define UI0902_BTN_TYPE_FINGER_NOT_W 57
#define UI0902_BTN_TYPE_FINGER_NOT_H 19
#define UI0902_BTN_TYPE_STRUM_NOT_ADDR (UI0902_RES_BASE + 0x060000UL) /* 2166 bytes */
#define UI0902_BTN_TYPE_STRUM_NOT_W 57
#define UI0902_BTN_TYPE_STRUM_NOT_H 19
#define UI0902_BTN_MINUS_BLUE_ADDR (UI0902_RES_BASE + 0x061000UL) /* 968 bytes */
#define UI0902_BTN_MINUS_BLUE_W 22
#define UI0902_BTN_MINUS_BLUE_H 22
#define UI0902_BTN_PLUS_BLUE_ADDR (UI0902_RES_BASE + 0x062000UL) /* 1012 bytes */
#define UI0902_BTN_PLUS_BLUE_W 23
#define UI0902_BTN_PLUS_BLUE_H 22
#define UI0902_BTN_MINUS_GRAY_ADDR (UI0902_RES_BASE + 0x063000UL) /* 968 bytes */
#define UI0902_BTN_MINUS_GRAY_W 22
#define UI0902_BTN_MINUS_GRAY_H 22
#define UI0902_BTN_PLUS_GRAY_ADDR (UI0902_RES_BASE + 0x064000UL) /* 968 bytes */
#define UI0902_BTN_PLUS_GRAY_W 22
#define UI0902_BTN_PLUS_GRAY_H 22
#define UI0902_SLIDER_WIDGET_ADDR (UI0902_RES_BASE + 0x065000UL) /* 14016 bytes */
#define UI0902_SLIDER_WIDGET_W 219
#define UI0902_SLIDER_WIDGET_H 32
#define UI0902_BTN_LANG_SEL_ADDR (UI0902_RES_BASE + 0x069000UL) /* 3332 bytes */
#define UI0902_BTN_LANG_SEL_W 49
#define UI0902_BTN_LANG_SEL_H 34
#define UI0902_BTN_LANG_CN1_ADDR (UI0902_RES_BASE + 0x06A000UL) /* 3264 bytes */
#define UI0902_BTN_LANG_CN1_W 48
#define UI0902_BTN_LANG_CN1_H 34
#define UI0902_BTN_LANG_CN2_ADDR (UI0902_RES_BASE + 0x06B000UL) /* 3332 bytes */
#define UI0902_BTN_LANG_CN2_W 49
#define UI0902_BTN_LANG_CN2_H 34
#define UI0902_BTN_LANG_EN_ADDR (UI0902_RES_BASE + 0x06C000UL) /* 3332 bytes */
#define UI0902_BTN_LANG_EN_W 49
#define UI0902_BTN_LANG_EN_H 34
#define UI0902_BTN_CANCEL_SM_ADDR (UI0902_RES_BASE + 0x06D000UL) /* 3430 bytes */
#define UI0902_BTN_CANCEL_SM_W 49
#define UI0902_BTN_CANCEL_SM_H 35
#define UI0902_BTN_CONFIRM_SM_ADDR (UI0902_RES_BASE + 0x06E000UL) /* 3360 bytes */
#define UI0902_BTN_CONFIRM_SM_W 48
#define UI0902_BTN_CONFIRM_SM_H 35
#define UI0902_BTN_CANCEL_SM2_ADDR (UI0902_RES_BASE + 0x06F000UL) /* 3430 bytes */
#define UI0902_BTN_CANCEL_SM2_W 49
#define UI0902_BTN_CANCEL_SM2_H 35
#define UI0902_BTN_CONFIRM_SM2_ADDR (UI0902_RES_BASE + 0x070000UL) /* 3430 bytes */
#define UI0902_BTN_CONFIRM_SM2_W 49
#define UI0902_BTN_CONFIRM_SM2_H 35
#define UI0902_BTN_CONFIRM_BIG_ADDR (UI0902_RES_BASE + 0x071000UL) /* 11872 bytes */
#define UI0902_BTN_CONFIRM_BIG_W 106
#define UI0902_BTN_CONFIRM_BIG_H 56
#define UI0902_MIXER_KNOB_ADDR (UI0902_RES_BASE + 0x074000UL) /* 1440 bytes */
#define UI0902_MIXER_KNOB_W 30
#define UI0902_MIXER_KNOB_H 24
#define UI0902_MIXER_KNOB2_ADDR (UI0902_RES_BASE + 0x075000UL) /* 1104 bytes */
#define UI0902_MIXER_KNOB2_W 24
#define UI0902_MIXER_KNOB2_H 23
#define UI0902_MIXER_TRACK_ADDR (UI0902_RES_BASE + 0x076000UL) /* 13330 bytes */
#define UI0902_MIXER_TRACK_W 31
#define UI0902_MIXER_TRACK_H 215
#define UI0902_TXT_MIXER_BAND_ADDR (UI0902_RES_BASE + 0x07A000UL) /* 700 bytes */
#define UI0902_TXT_MIXER_BAND_W 25
#define UI0902_TXT_MIXER_BAND_H 14
#define UI0902_TXT_MIXER_GUITAR_ADDR (UI0902_RES_BASE + 0x07B000UL) /* 336 bytes */
#define UI0902_TXT_MIXER_GUITAR_W 12
#define UI0902_TXT_MIXER_GUITAR_H 14
#define UI0902_TXT_MIXER_MIC_ADDR (UI0902_RES_BASE + 0x07C000UL) /* 338 bytes */
#define UI0902_TXT_MIXER_MIC_W 13
#define UI0902_TXT_MIXER_MIC_H 13
#define UI0902_TXT_MIXER_VOCALFX_ADDR (UI0902_RES_BASE + 0x07D000UL) /* 1036 bytes */
#define UI0902_TXT_MIXER_VOCALFX_W 37
#define UI0902_TXT_MIXER_VOCALFX_H 14
#define UI0902_TXT_MIXER_GUITARFX_ADDR (UI0902_RES_BASE + 0x07E000UL) /* 962 bytes */
#define UI0902_TXT_MIXER_GUITARFX_W 37
#define UI0902_TXT_MIXER_GUITARFX_H 13
#define UI0902_TXT_EFFECT_AMOUNT_ADDR (UI0902_RES_BASE + 0x07F000UL) /* 576 bytes */
#define UI0902_TXT_EFFECT_AMOUNT_W 32
#define UI0902_TXT_EFFECT_AMOUNT_H 9
#define UI0902_TXT_BAND_VOLUME_ADDR (UI0902_RES_BASE + 0x080000UL) /* 702 bytes */
#define UI0902_TXT_BAND_VOLUME_W 39
#define UI0902_TXT_BAND_VOLUME_H 9
#define UI0902_TXT_MIC_VOLUME_ADDR (UI0902_RES_BASE + 0x081000UL) /* 576 bytes */
#define UI0902_TXT_MIC_VOLUME_W 32
#define UI0902_TXT_MIC_VOLUME_H 9
#define UI0902_TXT_RESTORE_V1_ADDR (UI0902_RES_BASE + 0x082000UL) /* 1680 bytes */
#define UI0902_TXT_RESTORE_V1_W 21
#define UI0902_TXT_RESTORE_V1_H 40
#define UI0902_TXT_RESTORE_V2_ADDR (UI0902_RES_BASE + 0x083000UL) /* 1680 bytes */
#define UI0902_TXT_RESTORE_V2_W 21
#define UI0902_TXT_RESTORE_V2_H 40
#define UI0902_TXT_RESTORE_H_ADDR (UI0902_RES_BASE + 0x084000UL) /* 1128 bytes */
#define UI0902_TXT_RESTORE_H_W 47
#define UI0902_TXT_RESTORE_H_H 12
#define UI0902_TXT_RESTORE_CONFIRM_ADDR (UI0902_RES_BASE + 0x085000UL) /* 1988 bytes */
#define UI0902_TXT_RESTORE_CONFIRM_W 71
#define UI0902_TXT_RESTORE_CONFIRM_H 14
#define UI0902_BOOT_LOGO_ADDR (UI0902_RES_BASE + 0x086000UL) /* 153600 bytes */
#define UI0902_BOOT_LOGO_W 240
#define UI0902_BOOT_LOGO_H 320
#define UI0902_CHARGE_SCREEN_ADDR (UI0902_RES_BASE + 0x0AC000UL) /* 153600 bytes */
#define UI0902_CHARGE_SCREEN_W 240
#define UI0902_CHARGE_SCREEN_H 320
#define UI0902_FLASH_MODE_ADDR (UI0902_RES_BASE + 0x0D2000UL) /* 153600 bytes */
#define UI0902_FLASH_MODE_W 240
#define UI0902_FLASH_MODE_H 320
#define UI0902_BTN_CANCEL_BIG_ADDR (UI0902_RES_BASE + 0x0F8000UL) /* 11872 bytes */
#define UI0902_BTN_CANCEL_BIG_W 106
#define UI0902_BTN_CANCEL_BIG_H 56
#endif

View File

@ -35,7 +35,11 @@
#include "Drv_ILI9341_Lcd_Init.h"
#include "Drv_ILI9341_Lcd_App.h"
#include "Drv_ILI9341_Lcd_Image.h"
#include "Drv_ILI9341_Lcd_Image_ModeSelect0831.h"
#include "Drv_ILI9341_Lcd_Image_UI0902.h"
#include "Drv_ILI9341_Lcd_Image_ChargePct.h"
#include "UI0902_Res_Addr.h"
#include "ExtFlash_Tone_Addr.h"
#include "LocalSongNames.h"
#include "Drv_ILI9341_Lcd_Dump.h"
#include "Drv_XPT2046_Touch.h"

View File

@ -81,6 +81,7 @@ int main(void)
/* add user code begin 2 */
bsp_init();
BSP_MainPowerEnable(1);
LCD_Init();
LCD_Dump_Init();
app_log_init();
@ -103,9 +104,11 @@ int main(void)
}
/* add user code begin 3 */
Power_Key_Scan();
AutoPowerOff_Scan();
LCD_Dump_Poll();
#if !DEBUG_LCD_DUMP
app_log_poll();
TP_LivePoll();
#endif
rt_thread_delay(1);
@ -139,6 +142,7 @@ void bsp_init(void)
/* init spi1 function. */
wk_spi1_init();
W25Q128_Init();
/* init adc1 function. */
wk_adc1_init();

View File

@ -17,7 +17,7 @@
* Please modify RT_HEAP_SIZE if you enable RT_USING_HEAP
* the RT_HEAP_SIZE max value = (sram size - ZI size), 1024 means 1024 bytes
*/
#define RT_HEAP_SIZE (20*1024)
#define RT_HEAP_SIZE (19*1024) /* 20KB-1KB to fit 41KB preset buffer in 96KB RAM */
static rt_uint8_t rt_heap[RT_HEAP_SIZE];
RT_WEAK void *rt_heap_begin_get(void)

View File

@ -9,7 +9,7 @@ static struct rt_thread TaskBTRecvThread;
static struct rt_thread TaskAutobandThread;
ALIGN(RT_ALIGN_SIZE) static rt_uint8_t TaskScanThread_Stack[512];
ALIGN(RT_ALIGN_SIZE) static rt_uint8_t TaskUIThread_Stack[1024];
ALIGN(RT_ALIGN_SIZE) static rt_uint8_t TaskUIThread_Stack[2048];
ALIGN(RT_ALIGN_SIZE) static rt_uint8_t TaskTouchThread_Stack[1536];
ALIGN(RT_ALIGN_SIZE) static rt_uint8_t TaskMainThread_Stack[512];
ALIGN(RT_ALIGN_SIZE) static rt_uint8_t TaskBTTHandlehread_Stack[512];
@ -45,15 +45,21 @@ void TaskUIThread_entry(void* parameter)
void TaskTouchThread_entry(void* parameter)
{
static uint8_t s_last_pressed = 0;
LOG_TPI("touch task running");
while(1)
{
TP_Point tp = TP_Read(); /* 已含轴交换/镜像,直接进手势 */
if (tp.pressed && !s_last_pressed)
{
LOG_TP("down cal x=%u y=%u", (unsigned)tp.x, (unsigned)tp.y);
if (tp.pressed) {
if (!s_last_pressed) {
LOG_TPI("scan down x=%u y=%u", (unsigned)tp.x, (unsigned)tp.y);
}
} else if (s_last_pressed) {
LOG_TPI("scan up");
}
s_last_pressed = tp.pressed;
app_touch_process(tp.x, tp.y, tp.pressed);
TP_LivePoll();
app_log_poll();
Read_Cur_Measure();
rt_thread_mdelay(8);
}
@ -75,9 +81,13 @@ void TaskMainThread_entry(void* parameter)
case MSG_ID_LOOP_LIGHT : Loop_Light_Handle(xEvent.ID); break;
case MSG_ID_TM1629_KEY : break;
case MSG_ID_TM1617_KEY : break;
case MSG_ID_EC_VOL:
/* 任意页面都先下发主音量,避免 UI 未处理导致屏显与实际脱节 */
Send_volume((uint8_t)xEvent.ID);
UITask_Sendmsg(xEvent.MessageType, xEvent.ID, xEvent.HiByte, xEvent.LoByte);
break;
case MSG_ID_TOUCH:
case MSG_ID_CHARG:
case MSG_ID_EC_VOL:
case MSG_ID_TAP_SPEED:
case MSG_ID_BP_TRANSPOSE:
case MSG_ID_POWOFF_CHARG:
@ -275,6 +285,10 @@ void StartTouchTask(void)
{
rt_uint8_t st = (rt_uint8_t)(TaskTouchThread.stat & RT_THREAD_STAT_MASK);
XPT2046_Init();
app_touch_reset();
LOG_TPI("gpio reinit before touch task");
if (st == RT_THREAD_CLOSE)
{
rt_thread_init(&TaskTouchThread,
@ -287,8 +301,10 @@ void StartTouchTask(void)
20);
st = RT_THREAD_INIT;
}
if (st == RT_THREAD_INIT)
if (st == RT_THREAD_INIT) {
rt_thread_startup(&TaskTouchThread);
LOG_TPI("touch task started stat=%u", (unsigned)TaskTouchThread.stat);
}
}
void StartScanTask(void)

View File

@ -0,0 +1,60 @@
import subprocess, shutil, os, time
base = os.path.join(r"C:\Users\qjyu\Documents\SoundWalker", "一诺国际吉他",
r"Code\YNGJ-GT1-M - AT32F403ARCT7")
stage = r"C:\Temp\k1flash"
os.makedirs(stage, exist_ok=True)
out_src = os.path.join(base, r"project\IAR_V7.4\YNGJ-GT1-M\Exe\YNGJ-GT1-M.out")
out_dst = os.path.join(stage, "YNGJ-GT1-M.out")
with open(out_src, "rb") as a, open(out_dst, "wb") as b:
shutil.copyfileobj(a, b)
print("copied", os.path.getsize(out_dst), flush=True)
gen_src = os.path.join(base, r"project\IAR_V7.4\settings\YNGJ-GT1-M.YNGJ-GT1-M.general.xcl")
drv_src = os.path.join(base, r"project\IAR_V7.4\settings\YNGJ-GT1-M.YNGJ-GT1-M.driver.xcl")
lines = open(gen_src, encoding="utf-8", errors="replace").read().splitlines()
new = []
for ln in lines:
new.append(f'"{out_dst}" ' if (".out" in ln and "YNGJ" in ln) else ln)
open(os.path.join(stage, "general.xcl"), "w", encoding="utf-8", newline="\n").write("\n".join(new) + "\n")
shutil.copy2(drv_src, os.path.join(stage, "driver.xcl"))
for n in ("cspybat.exe", "CSpyBat.exe", "JLink.exe", "IarIdePm.exe",
"JLinkGUIServer.exe", "JLinkRTTClient.exe", "JFlash.exe"):
subprocess.run(["taskkill", "/F", "/IM", n], capture_output=True)
time.sleep(1.5)
# Force Artery AT32F403ACx (RCT7) — avoid Cortex-M4 / wrong-chip popup
drv_path = os.path.join(stage, "driver.xcl")
drv_lines = open(drv_path, encoding="utf-8", errors="replace").read().splitlines()
forced = []
for ln in drv_lines:
if ln.strip().startswith("--jlink_device"):
continue
forced.append(ln)
forced.append('--jlink_device=AT32F403AC')
open(drv_path, "w", encoding="utf-8", newline="\n").write("\n".join(forced) + "\n")
print("driver device forced: AT32F403AC", flush=True)
cspy = r"C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.3\common\bin\cspybat.exe"
cmd = [cspy, "-f", os.path.join(stage, "general.xcl"),
f"--debug_file={out_dst}", "--download_only", "--backend",
"-f", drv_path]
logp = os.path.join(stage, "cspy.log")
print("cspybat start (AT32F403AC / FlashAT32F403ARCT7)", flush=True)
with open(logp, "w", encoding="utf-8", errors="replace") as log:
r = subprocess.run(cmd, stdout=log, stderr=subprocess.STDOUT, timeout=180)
print("cspy exit", r.returncode, flush=True)
print(open(logp, encoding="utf-8", errors="replace").read()[-2000:])
if r.returncode != 0:
raise SystemExit(r.returncode)
jlink = r"C:\Program Files\SEGGER\JLink_V818\JLink.exe"
reset = os.path.join(base, r"tools\reset_run.jlink")
print("reset AT32F403AC", flush=True)
subprocess.run([jlink, "-Device", "AT32F403AC", "-If", "SWD",
"-Speed", "4000", "-AutoConnect", "1",
"-CommandFile", reset], capture_output=True, timeout=30)
time.sleep(3)
print("Done", flush=True)

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 357 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 520 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 416 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 365 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 902 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 982 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 607 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 648 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 516 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 746 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 496 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 557 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 445 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 644 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 915 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 893 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Some files were not shown because too many files have changed in this diff Show More