Browse Source
See demos/3rdparty/notepad-2/readme.txt for more details.remotes/origin_old/ugfx_release_2.6
10 changed files with 1354 additions and 0 deletions
@ -0,0 +1,58 @@ |
|||
/*
|
|||
* This file has a different license to the rest of the GFX system. |
|||
* You can copy, modify and distribute this file as you see fit. |
|||
* You do not need to publish your source modifications to this file. |
|||
* The only thing you are not permitted to do is to relicense it |
|||
* under a different license. |
|||
*/ |
|||
|
|||
#ifndef _GFXCONF_H |
|||
#define _GFXCONF_H |
|||
|
|||
/* GFX sub-systems to turn on */ |
|||
#define GFX_USE_GDISP TRUE |
|||
#define GFX_USE_GWIN TRUE |
|||
#define GFX_USE_GEVENT TRUE |
|||
#define GFX_USE_GTIMER TRUE |
|||
#define GFX_USE_GINPUT TRUE |
|||
|
|||
/* Features for the GDISP sub-system. */ |
|||
#define GDISP_NEED_VALIDATION TRUE |
|||
#define GDISP_NEED_CLIP TRUE |
|||
#define GDISP_NEED_TEXT TRUE |
|||
#define GDISP_NEED_CIRCLE TRUE |
|||
#define GDISP_NEED_ELLIPSE FALSE |
|||
#define GDISP_NEED_ARC FALSE |
|||
#define GDISP_NEED_CONVEX_POLYGON FALSE |
|||
#define GDISP_NEED_SCROLL FALSE |
|||
#define GDISP_NEED_PIXELREAD FALSE |
|||
#define GDISP_NEED_CONTROL TRUE |
|||
#define GDISP_NEED_IMAGE TRUE |
|||
#define GDISP_NEED_MULTITHREAD TRUE |
|||
#define GDISP_NEED_ASYNC FALSE |
|||
#define GDISP_NEED_MSGAPI FALSE |
|||
|
|||
/* Builtin Fonts */ |
|||
#define GDISP_INCLUDE_FONT_SMALL FALSE |
|||
#define GDISP_INCLUDE_FONT_LARGER FALSE |
|||
#define GDISP_INCLUDE_FONT_UI1 FALSE |
|||
#define GDISP_INCLUDE_FONT_UI2 TRUE |
|||
#define GDISP_INCLUDE_FONT_LARGENUMBERS FALSE |
|||
|
|||
/* GDISP image decoders */ |
|||
#define GDISP_NEED_IMAGE_NATIVE FALSE |
|||
#define GDISP_NEED_IMAGE_GIF TRUE |
|||
#define GDISP_NEED_IMAGE_BMP FALSE |
|||
#define GDISP_NEED_IMAGE_JPG FALSE |
|||
#define GDISP_NEED_IMAGE_PNG FALSE |
|||
|
|||
/* Features for the GWIN sub-system. */ |
|||
#define GWIN_NEED_BUTTON TRUE |
|||
#define GWIN_NEED_CONSOLE TRUE |
|||
#define GWIN_NEED_SLIDER TRUE |
|||
|
|||
/* Features for the GINPUT sub-system. */ |
|||
#define GINPUT_NEED_MOUSE TRUE |
|||
#define GINPUT_NEED_DIAL FALSE |
|||
|
|||
#endif /* _GFXCONF_H */ |
@ -0,0 +1,108 @@ |
|||
/*
|
|||
* File: main.c |
|||
* |
|||
* This file is a part of the Notepad demo application for ChibiOS/GFX |
|||
* Copyright © 2013, Kumar Abhishek [abhishek.kakkar@edaboard.com]. |
|||
* All rights reserved. |
|||
* |
|||
* Redistribution and use in source and binary forms, with or without |
|||
* modification, are permitted provided that the following conditions are met: |
|||
* |
|||
* * Redistributions of source code must retain the above copyright |
|||
* notice, this list of conditions and the following disclaimer. |
|||
* * Redistributions in binary form must reproduce the above copyright |
|||
* notice, this list of conditions and the following disclaimer in the |
|||
* documentation and/or other materials provided with the distribution. |
|||
* * The name of 'Kumar Abhishek' may not be used to endorse or promote |
|||
* products derived from this software without specific prior |
|||
* written permission. |
|||
* |
|||
* DISCLAIMER OF WARRANTY: |
|||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
|||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
|||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
|||
* DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY |
|||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
|||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
|||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
|||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
|||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|||
*/ |
|||
|
|||
#include "ch.h" |
|||
#include "hal.h" |
|||
#include "gfx.h" |
|||
|
|||
#include "notepadApp.h" |
|||
|
|||
const NColorScheme schemeDefault = { |
|||
.titleBarColor = HTML2COLOR(0x3064D8), |
|||
.titleTextColor = White, |
|||
|
|||
.winBgColor = HTML2COLOR(0xFFECB0), |
|||
.drawingWinBorder = HTML2COLOR(0xCEBA77), |
|||
|
|||
.toolbarSeparator = HTML2COLOR(0xC09028), |
|||
.toolbarBgUnsel = HTML2COLOR(0xF0D484), |
|||
.toolbarBgActive = HTML2COLOR(0xC8B060), |
|||
.toolbarBgSel = HTML2COLOR(0xDCC06C), |
|||
|
|||
.statusBarText = HTML2COLOR(0x000000) |
|||
}; |
|||
|
|||
const NColorScheme schemeDefault2 = { |
|||
.titleBarColor = HTML2COLOR(0x3064D8), |
|||
.titleTextColor = White, |
|||
|
|||
.winBgColor = HTML2COLOR(0xC8D8F8), |
|||
.drawingWinBorder = HTML2COLOR(0x8098E0), |
|||
|
|||
.toolbarSeparator = HTML2COLOR(0x5078F0), |
|||
.toolbarBgUnsel = HTML2COLOR(0xA0B8F0), |
|||
.toolbarBgActive = HTML2COLOR(0x6084F0), |
|||
.toolbarBgSel = HTML2COLOR(0x88A8F8), |
|||
|
|||
.statusBarText = HTML2COLOR(0x000000) |
|||
}; |
|||
|
|||
const char *tsCalibRead(uint16_t instance) { |
|||
// This will perform a on-spot calibration
|
|||
// Unless you read and add the co-efficients here
|
|||
return NULL; |
|||
} |
|||
|
|||
int main(void) { |
|||
|
|||
font_t font = gdispOpenFont("UI2"); |
|||
|
|||
/* initialize the hardware and the OS */ |
|||
halInit(); |
|||
chSysInit(); |
|||
|
|||
/* initialize the LCD */ |
|||
gdispInit(); |
|||
gdispClear(Black); |
|||
|
|||
/* Calibrate the touchscreen */ |
|||
ginputSetMouseCalibrationRoutines(0, NULL, tsCalibRead, FALSE); |
|||
ginputGetMouse(0); |
|||
|
|||
// Set the color scheme
|
|||
nSetColorScheme(schemeDefault); |
|||
|
|||
while (TRUE) { |
|||
|
|||
chThdWait(nLaunchNotepadApp()); |
|||
|
|||
gdispClear(Black); |
|||
gdispSetClip(0, 0, gdispGetWidth(), gdispGetHeight()); |
|||
gdispDrawString(3, 3, "Notepad Terminated.", font, White); |
|||
gdispDrawString(3, 20, "Relaunching Notepad App...", font, White); |
|||
|
|||
chThdSleepMilliseconds(1000); |
|||
|
|||
} |
|||
|
|||
return 0; |
|||
} |
@ -0,0 +1,471 @@ |
|||
/*
|
|||
* File: notepadApp.c |
|||
* |
|||
* This file is a part of the Notepad demo application for ChibiOS/GFX |
|||
* Copyright © 2013, Kumar Abhishek [abhishek.kakkar@edaboard.com]. |
|||
* All rights reserved. |
|||
* |
|||
* Redistribution and use in source and binary forms, with or without |
|||
* modification, are permitted provided that the following conditions are met: |
|||
* |
|||
* * Redistributions of source code must retain the above copyright |
|||
* notice, this list of conditions and the following disclaimer. |
|||
* * Redistributions in binary form must reproduce the above copyright |
|||
* notice, this list of conditions and the following disclaimer in the |
|||
* documentation and/or other materials provided with the distribution. |
|||
* * The name of 'Kumar Abhishek' may not be used to endorse or promote |
|||
* products derived from this software without specific prior |
|||
* written permission. |
|||
* |
|||
* DISCLAIMER OF WARRANTY: |
|||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
|||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
|||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
|||
* DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY |
|||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
|||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
|||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
|||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
|||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|||
*/ |
|||
|
|||
#include "ch.h" |
|||
#include "hal.h" |
|||
#include "gfx.h" |
|||
|
|||
#include "chprintf.h" |
|||
|
|||
#include "notepadApp.h" |
|||
#include "toolbarIcons.h" |
|||
|
|||
// Get the handle for a window object
|
|||
#define H(obj) ((GHandle)&obj) |
|||
|
|||
// Static objects
|
|||
static GListener gl; // Event listener object
|
|||
static GHandle nDrawingArea; // GWindow Drawing Area
|
|||
static BaseSequentialStream *gstatusConsole; // GConsole Handle to the Status Bar
|
|||
|
|||
static GEventMouse curPtr; // Holder for current pointer location
|
|||
|
|||
static font_t font; |
|||
static coord_t swidth, sheight; |
|||
|
|||
// The toolbar buttons - Self-Explanatory
|
|||
static GButtonObject btnNew, btnOpen, btnSave; |
|||
static GButtonObject btnColorBar; |
|||
static GButtonObject btnColorBarSel; |
|||
|
|||
static GButtonObject btnPencil, btnFill, btnEraser; |
|||
|
|||
static GButtonObject btnClose; |
|||
/* static GButtonObject btnYes, btnNo; // Reserved for future use */ |
|||
|
|||
// Image object
|
|||
static gdispImage toolbarImageFilmstrip; |
|||
|
|||
static color_t myColors[] = { Black, Red, Green, Blue, Cyan, Magenta, Yellow, White }; |
|||
|
|||
static color_t selColor = Black; |
|||
static int selColorIndex = 0, selPenWidth = 1, tbMode = 1; |
|||
|
|||
static NColorScheme nCurColorScheme; |
|||
|
|||
static msg_t notepadThread(void *param); |
|||
|
|||
// Custom drawing functions for the buttons
|
|||
static void nbtnColorBarDraw(GHandle gh, bool_t enabled, bool_t isdown, const char *txt, const GButtonDrawStyle *pstyle, void *param) { |
|||
#define ccs nCurColorScheme |
|||
|
|||
int i, j, k; |
|||
|
|||
(void)txt; |
|||
(void)pstyle; |
|||
(void)param; |
|||
(void)enabled; |
|||
|
|||
ginputGetMouseStatus(0, &curPtr); |
|||
|
|||
// Draw the toolbars according to the mode
|
|||
if (tbMode == 0) { |
|||
k = (curPtr.x - gh->x) / (NPAD_COLORBAR_WIDTH / 8); |
|||
|
|||
for (i = 0; i < 8; i++) { |
|||
j = gh->x + (NPAD_TOOLBAR_BTN_WIDTH / 2) + NPAD_TOOLBAR_BTN_WIDTH * i; |
|||
|
|||
if (isdown == TRUE) { |
|||
// Update selection - this is like lazy release.
|
|||
if (k >= 0 && k <= 7) { |
|||
selPenWidth = k + 1; |
|||
ncoreSetPenWidth((uint8_t) selPenWidth); |
|||
} |
|||
|
|||
gdispFillArea(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, gh->y, |
|||
NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, |
|||
selPenWidth - i == 1 ? ccs.toolbarBgActive : ccs.toolbarBgUnsel); |
|||
} |
|||
else { |
|||
gdispFillArea(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, gh->y, |
|||
NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, |
|||
selPenWidth - i == 1 ? ccs.toolbarBgSel : ccs.toolbarBgUnsel); |
|||
|
|||
gdispDrawBox(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, gh->y, |
|||
NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, |
|||
selPenWidth - i == 1 ? ccs.toolbarSeparator: ccs.toolbarBgUnsel); |
|||
} |
|||
|
|||
gdispFillCircle(j, gh->y + 10, i + 1, myColors[selColorIndex]); |
|||
} |
|||
|
|||
} else { |
|||
k = (curPtr.x - gh->x) / (NPAD_COLORBAR_WIDTH / 8); |
|||
|
|||
for (i = 0; i < 8; i++) { |
|||
j = gh->x + (NPAD_TOOLBAR_BTN_WIDTH / 2) + NPAD_TOOLBAR_BTN_WIDTH * i; |
|||
|
|||
if (isdown == TRUE) { |
|||
// Update selection - this is like lazy release.
|
|||
if (k >= 0 && k <= 7) { |
|||
selColorIndex = k; |
|||
selColor = myColors[k]; |
|||
ncoreSetPenColor(selColor); |
|||
} |
|||
|
|||
gdispFillArea(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, gh->y, |
|||
NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, |
|||
k == i ? ccs.toolbarBgActive : ccs.toolbarBgUnsel); |
|||
} |
|||
else { |
|||
gdispFillArea(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, gh->y, |
|||
NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, |
|||
selColorIndex == i ? ccs.toolbarBgSel : ccs.toolbarBgUnsel); |
|||
|
|||
gdispDrawBox(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, gh->y, |
|||
NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, |
|||
selColorIndex == i ? ccs.toolbarSeparator: ccs.toolbarBgUnsel); |
|||
} |
|||
|
|||
gdispFillCircle(j, gh->y + (NPAD_TOOLBAR_BTN_HEIGHT / 2), 3, myColors[i] ); |
|||
} |
|||
} |
|||
|
|||
|
|||
#undef ccs |
|||
} |
|||
|
|||
static void nbtnColorBarSelDraw(GHandle gh, bool_t enabled, bool_t isdown, const char *txt, const GButtonDrawStyle *pstyle, void *param) { |
|||
#define ccs nCurColorScheme |
|||
|
|||
int i, j = 0, k; |
|||
color_t ca, cb; |
|||
GEventMouse ptr; |
|||
|
|||
(void)txt; |
|||
(void)pstyle; |
|||
(void)param; |
|||
(void)enabled; |
|||
|
|||
// Get a copy of the pointer location
|
|||
ginputGetMouseStatus(0, &ptr); |
|||
|
|||
// Get which button the pointer is on right now
|
|||
k = (ptr.x - gh->x) / NPAD_TOOLBAR_BTN_WIDTH; |
|||
|
|||
gdispDrawBox(gh->x, gh->y, gh->width, gh->height, ccs.toolbarBgUnsel); |
|||
gdispDrawBox(gh->x + 1, gh->y + 1, gh->width - 2, gh->height - 2, ccs.toolbarBgUnsel); |
|||
|
|||
for (i = 0; i < 2; i++) { |
|||
if (isdown == TRUE) { |
|||
// Update selection - this is like lazy release.
|
|||
if (k == 0 || k == 1) { |
|||
tbMode = k; |
|||
j = 1; |
|||
} |
|||
|
|||
ca = (tbMode == i ? ccs.toolbarBgActive : ccs.toolbarBgUnsel); |
|||
} |
|||
else { |
|||
ca = (tbMode == i ? ccs.toolbarBgSel : ccs.toolbarBgUnsel); |
|||
} |
|||
|
|||
cb = (tbMode == i ? ccs.toolbarSeparator : ccs.toolbarBgUnsel); |
|||
|
|||
gdispFillArea(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, |
|||
gh->y, |
|||
NPAD_TOOLBAR_BTN_WIDTH, |
|||
NPAD_TOOLBAR_BTN_HEIGHT, |
|||
ca); |
|||
|
|||
gdispImageSetBgColor(&toolbarImageFilmstrip, ca); |
|||
gdispDrawBox(gh->x + NPAD_TOOLBAR_BTN_WIDTH * i, gh->y, |
|||
NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, cb); |
|||
|
|||
/* Draw both the icons */ |
|||
gwinImageDraw(gh, &toolbarImageFilmstrip, |
|||
2 + NPAD_TOOLBAR_BTN_WIDTH * i, |
|||
2, |
|||
NPAD_ICON_WIDTH, |
|||
NPAD_ICON_HEIGHT, |
|||
NPAD_ICON_START(3 + i), |
|||
0); |
|||
} |
|||
|
|||
if (j) |
|||
gwinButtonDraw(H(btnColorBar)); |
|||
|
|||
#undef ccs |
|||
} |
|||
|
|||
static void nToolbarImageButtonDraw(GHandle gh, bool_t isenabled, bool_t isdown, const char *txt, const GButtonDrawStyle *pstyle, void *param) { |
|||
(void)txt; (void)pstyle; (void)isenabled; |
|||
|
|||
color_t cl = isdown ? nCurColorScheme.toolbarBgActive : nCurColorScheme.toolbarBgUnsel; |
|||
|
|||
gdispImageSetBgColor(&toolbarImageFilmstrip, cl); |
|||
gdispFillArea(gh->x, gh->y, gh->width, gh->height, cl); |
|||
gwinImageDraw(gh, &toolbarImageFilmstrip, 2, 2, NPAD_ICON_WIDTH, NPAD_ICON_HEIGHT, NPAD_ICON_START((int) param), 0); |
|||
|
|||
if (isdown || ((int)param - 5) == ncoreGetMode()) |
|||
gdispDrawBox(gh->x, gh->y, gh->width, gh->height, nCurColorScheme.toolbarSeparator); |
|||
} |
|||
|
|||
static void nCloseButtonDraw(GHandle gh, bool_t isenabled, bool_t isdown, const char *txt, const GButtonDrawStyle *pstyle, void *param) { |
|||
gwinImageDraw(gh, &toolbarImageFilmstrip, 0, 0, NPAD_ICON_WIDTH, NPAD_ICON_HEIGHT, NPAD_ICON_START(8), 0); |
|||
} |
|||
|
|||
static void initButtons(void) { |
|||
|
|||
/* Init all the button objects */ |
|||
gwinCreateButton(&btnNew, NPAD_TOOLBAR_1_X(0), NPAD_TOOLBAR_1_Y, NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, font, GBTN_CUSTOM); |
|||
gwinCreateButton(&btnOpen, NPAD_TOOLBAR_1_X(1), NPAD_TOOLBAR_1_Y, NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, font, GBTN_CUSTOM); |
|||
gwinCreateButton(&btnSave, NPAD_TOOLBAR_1_X(2), NPAD_TOOLBAR_1_Y, NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, font, GBTN_CUSTOM); |
|||
|
|||
gwinCreateButton(&btnColorBarSel, NPAD_COLORBAR_SEL_X, NPAD_COLORBAR_SEL_Y, NPAD_COLORBAR_SEL_WIDTH, NPAD_COLORBAR_SEL_HEIGHT, font, GBTN_CUSTOM); |
|||
gwinCreateButton(&btnColorBar, NPAD_COLORBAR_X, NPAD_TOOLBAR_1_Y, NPAD_COLORBAR_WIDTH, NPAD_COLORBAR_HEIGHT, font, GBTN_CUSTOM); |
|||
|
|||
gwinCreateButton(&btnPencil, NPAD_TOOLBAR_2_X, NPAD_TOOLBAR_2_Y(0), NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, font, GBTN_CUSTOM); |
|||
gwinCreateButton(&btnEraser, NPAD_TOOLBAR_2_X, NPAD_TOOLBAR_2_Y(1), NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, font, GBTN_CUSTOM); |
|||
gwinCreateButton(&btnFill, NPAD_TOOLBAR_2_X, NPAD_TOOLBAR_2_Y(2), NPAD_TOOLBAR_BTN_WIDTH, NPAD_TOOLBAR_BTN_HEIGHT, font, GBTN_CUSTOM); |
|||
|
|||
gwinCreateButton(&btnClose, swidth - 18, 0, 16, 16, font, GBTN_CUSTOM); |
|||
|
|||
/* Attach custom renders */ |
|||
gwinSetButtonCustom(H(btnNew), nToolbarImageButtonDraw, (void *)0); |
|||
gwinSetButtonCustom(H(btnOpen), nToolbarImageButtonDraw, (void *)1); |
|||
gwinSetButtonCustom(H(btnSave), nToolbarImageButtonDraw, (void *)2); |
|||
|
|||
gwinSetButtonCustom(H(btnColorBar), nbtnColorBarDraw, (void *)0); |
|||
gwinSetButtonCustom(H(btnColorBarSel), nbtnColorBarSelDraw, (void *)0); |
|||
|
|||
gwinSetButtonCustom(H(btnPencil), nToolbarImageButtonDraw, (void *)5); |
|||
gwinSetButtonCustom(H(btnEraser), nToolbarImageButtonDraw, (void *)6); |
|||
gwinSetButtonCustom(H(btnFill), nToolbarImageButtonDraw, (void *)7); |
|||
gwinSetButtonCustom(H(btnClose), nCloseButtonDraw, (void *)0); |
|||
|
|||
/* Attach listeners */ |
|||
geventAttachSource(&gl, gwinGetButtonSource(H(btnNew)), 0); |
|||
geventAttachSource(&gl, gwinGetButtonSource(H(btnOpen)), 0); |
|||
geventAttachSource(&gl, gwinGetButtonSource(H(btnSave)), 0); |
|||
|
|||
geventAttachSource(&gl, gwinGetButtonSource(H(btnColorBar)), 0); |
|||
geventAttachSource(&gl, gwinGetButtonSource(H(btnColorBarSel)), 0); |
|||
|
|||
geventAttachSource(&gl, gwinGetButtonSource(H(btnPencil)), 0); |
|||
geventAttachSource(&gl, gwinGetButtonSource(H(btnEraser)), 0); |
|||
geventAttachSource(&gl, gwinGetButtonSource(H(btnFill)), 0); |
|||
geventAttachSource(&gl, gwinGetButtonSource(H(btnClose)), 0); |
|||
|
|||
/* Give listeners access to touch events */ |
|||
gwinAttachButtonMouse(H(btnNew), 0); |
|||
gwinAttachButtonMouse(H(btnOpen), 0); |
|||
gwinAttachButtonMouse(H(btnSave), 0); |
|||
|
|||
gwinAttachButtonMouse(H(btnColorBar), 0); |
|||
gwinAttachButtonMouse(H(btnColorBarSel), 0); |
|||
|
|||
gwinAttachButtonMouse(H(btnPencil), 0); |
|||
gwinAttachButtonMouse(H(btnEraser), 0); |
|||
gwinAttachButtonMouse(H(btnFill), 0); |
|||
gwinAttachButtonMouse(H(btnClose), 0); |
|||
|
|||
} |
|||
|
|||
static void drawButtons(void) { |
|||
gwinButtonDraw(H(btnNew)); |
|||
gwinButtonDraw(H(btnOpen)); |
|||
gwinButtonDraw(H(btnSave)); |
|||
|
|||
gwinButtonDraw(H(btnColorBar)); |
|||
gwinButtonDraw(H(btnColorBarSel)); |
|||
|
|||
gwinButtonDraw(H(btnClose)); |
|||
} |
|||
|
|||
static void drawVButtons(void) { |
|||
gwinButtonDraw(H(btnPencil)); |
|||
gwinButtonDraw(H(btnEraser)); |
|||
gwinButtonDraw(H(btnFill)); |
|||
} |
|||
|
|||
static WORKING_AREA(waNotepadThread, NPAD_THD_WA_SIZE); |
|||
static msg_t notepadThread(void *param) { |
|||
|
|||
GEventMouse *pem; |
|||
GEventGWinButton *peb; |
|||
GHandle ghc; |
|||
|
|||
(void)param; |
|||
|
|||
/* Get the display dimensions */ |
|||
swidth = gdispGetWidth(); |
|||
sheight = gdispGetHeight(); |
|||
|
|||
font = gdispOpenFont("UI2"); |
|||
|
|||
/* Initialize the mouse */ |
|||
geventListenerInit(&gl); |
|||
ginputGetMouse(0); |
|||
|
|||
initButtons(); |
|||
|
|||
/* Configure the GIF decoder with the toolbar Icon images */ |
|||
gdispImageSetMemoryReader(&toolbarImageFilmstrip, toolbarIcons); |
|||
gdispImageOpen(&toolbarImageFilmstrip); |
|||
|
|||
/* Set clip to the entire screen */ |
|||
gdispSetClip(0, 0, swidth, sheight); |
|||
|
|||
/* Clear the screen with the window background
|
|||
* Also, draw the title bars */ |
|||
gdispClear(nCurColorScheme.winBgColor); |
|||
gdispDrawBox(0, 0, swidth, sheight, nCurColorScheme.titleBarColor); |
|||
gdispFillArea(0, 0, swidth, NPAD_TITLEBAR_HEIGHT, nCurColorScheme.titleBarColor); |
|||
gdispDrawStringBox(NPAD_TITLETEXT_START_X, |
|||
NPAD_TITLETEXT_START_Y, |
|||
swidth, |
|||
NPAD_TITLEBAR_HEIGHT, |
|||
NPAD_TITLETEXT_STR, |
|||
font, |
|||
nCurColorScheme.titleTextColor, |
|||
justifyLeft); |
|||
|
|||
/* Create the drawing window, draw its border */ |
|||
gdispDrawBox(NPAD_DRAWING_AREA_START_X - 1, |
|||
NPAD_DRAWING_AREA_START_Y - 1, |
|||
NPAD_DRAWING_AREA_WIDTH + 2, |
|||
NPAD_DRAWING_AREA_HEIGHT + 2, |
|||
nCurColorScheme.drawingWinBorder); |
|||
|
|||
nDrawingArea = gwinCreateWindow(NULL, |
|||
NPAD_DRAWING_AREA_START_X, |
|||
NPAD_DRAWING_AREA_START_Y, |
|||
NPAD_DRAWING_AREA_WIDTH, |
|||
NPAD_DRAWING_AREA_HEIGHT); |
|||
|
|||
/* Create the bottom status bar console */ |
|||
ghc = gwinCreateConsole(NULL, |
|||
NPAD_STATUSBAR_START_X, |
|||
NPAD_STATUSBAR_START_Y, |
|||
NPAD_STATUSBAR_WIDTH, |
|||
NPAD_STATUSBAR_HEIGHT, |
|||
font); |
|||
|
|||
gdispImageDraw(&toolbarImageFilmstrip, |
|||
NPAD_STATUSBAR_ICON_START_X, |
|||
NPAD_STATUSBAR_ICON_START_Y, |
|||
NPAD_ICON_WIDTH, |
|||
NPAD_ICON_HEIGHT, |
|||
NPAD_ICON_START(12), |
|||
0); |
|||
|
|||
gwinSetBgColor(ghc, nCurColorScheme.winBgColor); |
|||
gwinSetColor(ghc, Black); |
|||
|
|||
gstatusConsole = gwinGetConsoleStream(ghc); |
|||
|
|||
/* draw the buttons */ |
|||
gwinSetColor(nDrawingArea, Black); |
|||
gwinSetBgColor(nDrawingArea, White); |
|||
|
|||
gwinClear(nDrawingArea); |
|||
gwinClear(ghc); |
|||
|
|||
drawButtons(); |
|||
drawVButtons(); |
|||
|
|||
chprintf(gstatusConsole, "Welcome to ChibiOS/GFX Notepad demo."); |
|||
|
|||
ncoreSpawnDrawThread(nDrawingArea, gstatusConsole); |
|||
|
|||
while(TRUE) { |
|||
pem = (GEventMouse *) geventEventWait(&gl, TIME_INFINITE); |
|||
|
|||
/* button pressed... */ |
|||
if (pem->type == GEVENT_GWIN_BUTTON) { |
|||
peb = (GEventGWinButton *)pem; |
|||
|
|||
if (peb->button == H(btnNew)) { |
|||
// Reset all the settings
|
|||
selColorIndex = 0; |
|||
selPenWidth = 0; |
|||
ncoreSetMode(NCORE_MODE_DRAW); |
|||
|
|||
gwinSetColor(nDrawingArea, Black); |
|||
gwinSetBgColor(nDrawingArea, White); |
|||
|
|||
// Refresh the buttons
|
|||
drawButtons(); |
|||
drawVButtons(); |
|||
|
|||
gwinClear(nDrawingArea); |
|||
chprintf(gstatusConsole, "\nScreen Cleared."); |
|||
} |
|||
else if (peb->button == H(btnOpen)) { |
|||
chprintf(gstatusConsole, "\nFile Open not implemented."); |
|||
} |
|||
else if (peb->button == H(btnSave)) { |
|||
chprintf(gstatusConsole, "\nFile Save not implemented."); |
|||
} |
|||
else if (peb->button == H(btnPencil)) { |
|||
ncoreSetMode(NCORE_MODE_DRAW); |
|||
drawVButtons(); |
|||
chprintf(gstatusConsole, "\nPencil Tool Selected."); |
|||
} |
|||
else if (peb->button == H(btnEraser)) { |
|||
ncoreSetMode(NCORE_MODE_ERASE); |
|||
drawVButtons(); |
|||
chprintf(gstatusConsole, "\nEraser Tool Selected."); |
|||
} |
|||
else if (peb->button == H(btnFill)) { |
|||
ncoreSetMode(NCORE_MODE_FILL); |
|||
drawVButtons(); |
|||
chprintf(gstatusConsole, "\nFill Tool Selected."); |
|||
} |
|||
else if (peb->button == H(btnClose)) { |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
|
|||
gwinDestroyWindow(ghc); |
|||
// No need to destroy the buttons as they are statically allocated
|
|||
gdispCloseFont(font); |
|||
ncoreTerminateDrawThread(); |
|||
gdispImageClose(&toolbarImageFilmstrip); |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
// Public methods
|
|||
void nSetColorScheme(NColorScheme sch) { nCurColorScheme = sch; } |
|||
NColorScheme nGetColorScheme(void) { return nCurColorScheme; } |
|||
|
|||
Thread *nLaunchNotepadApp(void) { |
|||
|
|||
return chThdCreateStatic(waNotepadThread, |
|||
sizeof(waNotepadThread), |
|||
NPAD_THD_PRIO, |
|||
notepadThread, NULL); |
|||
|
|||
} |
@ -0,0 +1,48 @@ |
|||
/*
|
|||
* File: notepadApp.h |
|||
* |
|||
* This file is a part of the Notepad demo application for ChibiOS/GFX |
|||
* Copyright © 2013, Kumar Abhishek [abhishek.kakkar@edaboard.com]. |
|||
* All rights reserved. |
|||
* |
|||
* Redistribution and use in source and binary forms, with or without |
|||
* modification, are permitted provided that the following conditions are met: |
|||
* |
|||
* * Redistributions of source code must retain the above copyright |
|||
* notice, this list of conditions and the following disclaimer. |
|||
* * Redistributions in binary form must reproduce the above copyright |
|||
* notice, this list of conditions and the following disclaimer in the |
|||
* documentation and/or other materials provided with the distribution. |
|||
* * The name of 'Kumar Abhishek' may not be used to endorse or promote |
|||
* products derived from this software without specific prior |
|||
* written permission. |
|||
* |
|||
* DISCLAIMER OF WARRANTY: |
|||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
|||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
|||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
|||
* DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY |
|||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
|||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
|||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
|||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
|||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|||
*/ |
|||
|
|||
#ifndef NOTEPADAPP_H_ |
|||
#define NOTEPADAPP_H_ |
|||
|
|||
#include "notepadCore.h" |
|||
#include "notepadUIDefines.h" |
|||
|
|||
#define NPAD_THD_PRIO (NORMALPRIO + 2) |
|||
#define NPAD_THD_WA_SIZE 512 |
|||
|
|||
void nSetColorScheme(NColorScheme sch); |
|||
NColorScheme nGetColorScheme(void); |
|||
|
|||
|
|||
Thread *nLaunchNotepadApp(void); |
|||
|
|||
#endif /* NOTEPADAPP_H_ */ |
@ -0,0 +1,235 @@ |
|||
/*
|
|||
* File: notepadCore.c |
|||
* |
|||
* This file is a part of the Notepad demo application for ChibiOS/GFX |
|||
* Copyright © 2013, Kumar Abhishek [abhishek.kakkar@edaboard.com]. |
|||
* All rights reserved. |
|||
* |
|||
* Redistribution and use in source and binary forms, with or without |
|||
* modification, are permitted provided that the following conditions are met: |
|||
* |
|||
* * Redistributions of source code must retain the above copyright |
|||
* notice, this list of conditions and the following disclaimer. |
|||
* * Redistributions in binary form must reproduce the above copyright |
|||
* notice, this list of conditions and the following disclaimer in the |
|||
* documentation and/or other materials provided with the distribution. |
|||
* * The name of 'Kumar Abhishek' may not be used to endorse or promote |
|||
* products derived from this software without specific prior |
|||
* written permission. |
|||
* |
|||
* DISCLAIMER OF WARRANTY: |
|||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
|||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
|||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
|||
* DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY |
|||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
|||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
|||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
|||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
|||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|||
*/ |
|||
|
|||
#include <stdlib.h> |
|||
|
|||
#include "ch.h" |
|||
#include "hal.h" |
|||
#include "gfx.h" |
|||
|
|||
#include "notepadCore.h" |
|||
#include "notepadUIDefines.h" |
|||
|
|||
#define PEN_IN_DRAWING_AREA(ev) ((ev.x >= ncoreDrawingArea->x) && (ev.x <= (ncoreDrawingArea->x + ncoreDrawingArea->width)) && \ |
|||
(ev.y >= ncoreDrawingArea->y) && (ev.y <= (ncoreDrawingArea->y + ncoreDrawingArea->height))) |
|||
|
|||
/* This is the drawing core */ |
|||
static WORKING_AREA(waDrawThread, NCORE_THD_STACK_SIZE); |
|||
|
|||
static uint8_t nPenWidth = 1; |
|||
static uint8_t nMode = NCORE_MODE_DRAW; |
|||
|
|||
static Thread *nThd; |
|||
|
|||
static GHandle ncoreDrawingArea = NULL; |
|||
static BaseSequentialStream *nStatusConsole = NULL; |
|||
|
|||
static void draw_point(coord_t x, coord_t y) { |
|||
color_t c = ncoreDrawingArea->color; |
|||
|
|||
if (nMode == NCORE_MODE_DRAW) |
|||
c = ncoreDrawingArea->color; |
|||
else if (nMode == NCORE_MODE_ERASE) |
|||
c = ncoreDrawingArea->bgcolor; |
|||
|
|||
if (nPenWidth == 1) |
|||
gdispDrawPixel(x, y, c); |
|||
else |
|||
gdispFillCircle(x, y, nPenWidth, c); |
|||
} |
|||
|
|||
/* Bresenham's Line Drawing Algorithm
|
|||
Modified version to draw line of variable thickness */ |
|||
static void draw_line(coord_t x0, coord_t y0, coord_t x1, coord_t y1) { |
|||
int16_t dy, dx; |
|||
int16_t addx, addy; |
|||
int16_t P, diff, i; |
|||
|
|||
if (x1 >= x0) { |
|||
dx = x1 - x0; |
|||
addx = 1; |
|||
} else { |
|||
dx = x0 - x1; |
|||
addx = -1; |
|||
} |
|||
if (y1 >= y0) { |
|||
dy = y1 - y0; |
|||
addy = 1; |
|||
} else { |
|||
dy = y0 - y1; |
|||
addy = -1; |
|||
} |
|||
|
|||
if (dx >= dy) { |
|||
dy *= 2; |
|||
P = dy - dx; |
|||
diff = P - dx; |
|||
|
|||
for(i=0; i<=dx; ++i) { |
|||
draw_point(x0, y0); |
|||
if (P < 0) { |
|||
P += dy; |
|||
x0 += addx; |
|||
} else { |
|||
P += diff; |
|||
x0 += addx; |
|||
y0 += addy; |
|||
} |
|||
} |
|||
} else { |
|||
dx *= 2; |
|||
P = dx - dy; |
|||
diff = P - dy; |
|||
|
|||
for(i=0; i<=dy; ++i) { |
|||
draw_point(x0, y0); |
|||
if (P < 0) { |
|||
P += dx; |
|||
y0 += addy; |
|||
} else { |
|||
P += diff; |
|||
x0 += addx; |
|||
y0 += addy; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
/* Core thread */ |
|||
static msg_t ncoreDrawThread(void *msg) { |
|||
|
|||
GEventMouse ev, evPrev; |
|||
coord_t dx, dy; |
|||
|
|||
int state = 0, dist; |
|||
|
|||
(void)msg; |
|||
|
|||
ginputGetMouseStatus(0, &evPrev); |
|||
|
|||
while (1) { |
|||
|
|||
// Exit signal received? If yes, terminate.
|
|||
if (chThdShouldTerminate()) |
|||
return 0; |
|||
|
|||
ginputGetMouseStatus(0, &ev); |
|||
switch(state) { |
|||
case 0: if (ev.meta == GMETA_MOUSE_DOWN) { |
|||
state = 1; |
|||
if (nMode == NCORE_MODE_FILL && PEN_IN_DRAWING_AREA(ev)) { |
|||
// Set bgcolor to current color, clear the display.
|
|||
ncoreDrawingArea->bgcolor = ncoreDrawingArea->color; |
|||
gwinClear(ncoreDrawingArea); |
|||
} |
|||
} |
|||
else |
|||
chThdYield(); |
|||
break; |
|||
|
|||
|
|||
case 1: if (ev.meta == GMETA_MOUSE_UP) { |
|||
state = 0; |
|||
//chprintf(nStatusConsole, "\nPen Up: (%d, %d)", ev.x, ev.y);
|
|||
break; |
|||
} |
|||
|
|||
dx = abs(ev.x - evPrev.x); |
|||
dy = abs(ev.y - evPrev.y); |
|||
|
|||
dist = dx * dx + dy * dy; |
|||
|
|||
if (dist > 0) |
|||
{ |
|||
gdispSetClip(ncoreDrawingArea->x, |
|||
ncoreDrawingArea->y, |
|||
ncoreDrawingArea->width, |
|||
ncoreDrawingArea->height); |
|||
|
|||
if (PEN_IN_DRAWING_AREA(ev)){ |
|||
// Do Interpolation
|
|||
if (dist <= 2) { |
|||
draw_point(ev.x, ev.y); |
|||
} |
|||
else if (dist <= 5) { |
|||
// Line drawing does not give good results for this case.
|
|||
// So draw two pixels directly
|
|||
draw_point(ev.x, ev.y); |
|||
draw_point((ev.x + evPrev.x) / 2, (ev.y + evPrev.y) / 2); |
|||
} |
|||
else if (dx * dx <= MAX_DX && dy * dy <= MAX_DY) { |
|||
draw_line(ev.x, ev.y, evPrev.x, evPrev.y); |
|||
} |
|||
} |
|||
|
|||
//chprintf(nStatusConsole, "\nPen Down: (%d, %d)", ev.x, ev.y);
|
|||
} |
|||
break; |
|||
} |
|||
evPrev = ev; |
|||
} |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
/* Spawn the core thread */ |
|||
void ncoreSpawnDrawThread(GHandle drawingArea, BaseSequentialStream *statusConsole) { |
|||
|
|||
ncoreDrawingArea = drawingArea; |
|||
nStatusConsole = statusConsole; |
|||
|
|||
nThd = chThdCreateStatic(waDrawThread, |
|||
sizeof(waDrawThread), |
|||
NCORE_THD_PRIO, |
|||
ncoreDrawThread, |
|||
NULL); |
|||
|
|||
} |
|||
|
|||
/* Terminate the core thread, wait for control release */ |
|||
void ncoreTerminateDrawThread(void) { |
|||
chThdTerminate(nThd); |
|||
chThdWait(nThd); |
|||
} |
|||
|
|||
/* Get and set the pen width
|
|||
* Brush is cicular, width is pixel radius */ |
|||
void ncoreSetPenWidth(uint8_t penWidth) { nPenWidth = penWidth; } |
|||
uint8_t ncoreGetPenWidth(void) { return nPenWidth; } |
|||
|
|||
/* Get and set the drawing color */ |
|||
void ncoreSetPenColor(color_t penColor) { gwinSetColor(ncoreDrawingArea, penColor); } |
|||
color_t ncoreGetPenColor(void) { return ncoreDrawingArea->color; } |
|||
|
|||
/* Set mode */ |
|||
void ncoreSetMode(uint8_t mode) { nMode = mode; } |
|||
uint8_t ncoreGetMode(void) { return nMode; } |
@ -0,0 +1,66 @@ |
|||
/*
|
|||
* File: notepadCore.h |
|||
* |
|||
* This file is a part of the Notepad demo application for ChibiOS/GFX |
|||
* Copyright © 2013, Kumar Abhishek [abhishek.kakkar@edaboard.com]. |
|||
* All rights reserved. |
|||
* |
|||
* Redistribution and use in source and binary forms, with or without |
|||
* modification, are permitted provided that the following conditions are met: |
|||
* |
|||
* * Redistributions of source code must retain the above copyright |
|||
* notice, this list of conditions and the following disclaimer. |
|||
* * Redistributions in binary form must reproduce the above copyright |
|||
* notice, this list of conditions and the following disclaimer in the |
|||
* documentation and/or other materials provided with the distribution. |
|||
* * The name of 'Kumar Abhishek' may not be used to endorse or promote |
|||
* products derived from this software without specific prior |
|||
* written permission. |
|||
* |
|||
* DISCLAIMER OF WARRANTY: |
|||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
|||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
|||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
|||
* DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY |
|||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
|||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
|||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
|||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
|||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|||
*/ |
|||
|
|||
#ifndef NOTEPADCORE_H_ |
|||
#define NOTEPADCORE_H_ |
|||
|
|||
/* Configuration */ |
|||
#define NCORE_THD_STACK_SIZE 256 |
|||
#define NCORE_THD_PRIO (NORMALPRIO + 1) |
|||
|
|||
#define NCORE_MODE_DRAW 0 |
|||
#define NCORE_MODE_ERASE 1 |
|||
#define NCORE_MODE_FILL 2 |
|||
|
|||
#define MAX_DX 500 |
|||
#define MAX_DY 500 |
|||
|
|||
/* Spawn the notepad core thread */ |
|||
void ncoreSpawnDrawThread(GHandle drawingArea, BaseSequentialStream *statusConsole); |
|||
|
|||
/* Terminate the core thread, wait for control release */ |
|||
void ncoreTerminateDrawThread(void); |
|||
|
|||
/* Get and set the pen width
|
|||
* Brush is cicular, width is pixel radius */ |
|||
void ncoreSetPenWidth(uint8_t penWidth); |
|||
uint8_t ncoreGetPenWidth(void); |
|||
|
|||
/* Get and set the drawing color */ |
|||
void ncoreSetPenColor(color_t penColor); |
|||
color_t ncoreGetPenColor(void); |
|||
|
|||
/* Get and set the pen mode */ |
|||
void ncoreSetMode(uint8_t mode); |
|||
uint8_t ncoreGetMode(void); |
|||
|
|||
#endif /* NOTEPADCORE_H_ */ |
@ -0,0 +1,114 @@ |
|||
/*
|
|||
* File: notepadUIDefines.h |
|||
* |
|||
* This file is a part of the Notepad demo application for ChibiOS/GFX |
|||
* Copyright © 2013, Kumar Abhishek [abhishek.kakkar@edaboard.com]. |
|||
* All rights reserved. |
|||
* |
|||
* Redistribution and use in source and binary forms, with or without |
|||
* modification, are permitted provided that the following conditions are met: |
|||
* |
|||
* * Redistributions of source code must retain the above copyright |
|||
* notice, this list of conditions and the following disclaimer. |
|||
* * Redistributions in binary form must reproduce the above copyright |
|||
* notice, this list of conditions and the following disclaimer in the |
|||
* documentation and/or other materials provided with the distribution. |
|||
* * The name of 'Kumar Abhishek' may not be used to endorse or promote |
|||
* products derived from this software without specific prior |
|||
* written permission. |
|||
* |
|||
* DISCLAIMER OF WARRANTY: |
|||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
|||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
|||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
|||
* DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY |
|||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
|||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
|||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
|||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
|||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|||
*/ |
|||
|
|||
#ifndef NOTEPADUIDEFINES_H_ |
|||
#define NOTEPADUIDEFINES_H_ |
|||
|
|||
#define NPAD_TITLETEXT_STR "ChibiOS/GFX Notepad Demo" |
|||
|
|||
/* UI Element dimenstions */ |
|||
#define NPAD_TITLEBAR_HEIGHT 18 |
|||
#define NPAD_TITLETEXT_START_X 5 |
|||
#define NPAD_TITLETEXT_START_Y 0 |
|||
|
|||
#define NPAD_TOOLBAR_BTN_WIDTH 20 |
|||
#define NPAD_TOOLBAR_BTN_HEIGHT 20 |
|||
|
|||
#define NPAD_TOOLBAR_INTERBTN_PADDING_X 2 |
|||
#define NPAD_TOOLBAR_1_START_X 5 |
|||
#define NPAD_TOOLBAR_1_Y (NPAD_TITLEBAR_HEIGHT + 3) |
|||
#define NPAD_TOOLBAR_1_X(n) (NPAD_TOOLBAR_1_START_X + \ |
|||
(NPAD_TOOLBAR_BTN_WIDTH + \ |
|||
NPAD_TOOLBAR_INTERBTN_PADDING_X) * n) |
|||
|
|||
#define NPAD_TOOLBAR_INTERBTN_PADDING_Y 2 |
|||
#define NPAD_TOOLBAR_2_START_Y (NPAD_DRAWING_AREA_START_Y + 6) |
|||
#define NPAD_TOOLBAR_2_X 4 |
|||
#define NPAD_TOOLBAR_2_Y(n) (NPAD_TOOLBAR_2_START_Y + \ |
|||
(NPAD_TOOLBAR_BTN_HEIGHT + \ |
|||
NPAD_TOOLBAR_INTERBTN_PADDING_Y) * n) |
|||
|
|||
#define NPAD_DRAWING_AREA_START_X 28 |
|||
#define NPAD_DRAWING_AREA_START_Y 46 |
|||
#define NPAD_DRAWING_AREA_END_X 10 |
|||
#define NPAD_DRAWING_AREA_END_Y 24 |
|||
#define NPAD_DRAWING_AREA_WIDTH (swidth - \ |
|||
NPAD_DRAWING_AREA_START_X - \ |
|||
NPAD_DRAWING_AREA_END_X) |
|||
#define NPAD_DRAWING_AREA_HEIGHT (sheight - \ |
|||
NPAD_DRAWING_AREA_START_Y - \ |
|||
NPAD_DRAWING_AREA_END_Y) |
|||
|
|||
#define NPAD_COLORBAR_WIDTH 160 |
|||
#define NPAD_COLORBAR_HEIGHT 20 |
|||
#define NPAD_COLORBAR_X (swidth - NPAD_DRAWING_AREA_END_X - NPAD_COLORBAR_WIDTH) |
|||
#define NPAD_COLORBAR_Y NPAD_TOOLBAR_1_Y |
|||
|
|||
#define NPAD_COLORBAR_SEL_WIDTH (2 * NPAD_TOOLBAR_BTN_WIDTH) |
|||
#define NPAD_COLORBAR_SEL_HEIGHT (NPAD_TOOLBAR_BTN_HEIGHT) |
|||
#define NPAD_COLORBAR_SEL_X (NPAD_COLORBAR_X - NPAD_COLORBAR_SEL_WIDTH - 24) |
|||
#define NPAD_COLORBAR_SEL_Y NPAD_TOOLBAR_1_Y |
|||
|
|||
#define NPAD_ICON_WIDTH 16 |
|||
#define NPAD_ICON_HEIGHT 16 |
|||
#define NPAD_ICON_START(x) ((x) * NPAD_ICON_WIDTH) |
|||
|
|||
|
|||
#define NPAD_STATUSBAR_ICON_START_X 5 |
|||
#define NPAD_STATUSBAR_ICON_START_Y (sheight - 5 - NPAD_ICON_HEIGHT - 1) |
|||
|
|||
|
|||
#define NPAD_STATUSBAR_PADDING 5 |
|||
#define NPAD_STATUSBAR_START_X (NPAD_STATUSBAR_ICON_START_X + NPAD_ICON_WIDTH + NPAD_STATUSBAR_PADDING) |
|||
#define NPAD_STATUSBAR_START_Y (NPAD_STATUSBAR_ICON_START_Y + 3) |
|||
#define NPAD_STATUSBAR_WIDTH (swidth - NPAD_STATUSBAR_START_X - 2) |
|||
#define NPAD_STATUSBAR_HEIGHT 15 |
|||
|
|||
/* Color scheme definition */ |
|||
typedef struct colScheme { |
|||
color_t titleBarColor; |
|||
color_t titleTextColor; |
|||
|
|||
color_t winBgColor; |
|||
color_t drawingWinBorder; |
|||
|
|||
color_t toolbarSeparator; |
|||
color_t toolbarBgUnsel; |
|||
color_t toolbarBgActive; |
|||
color_t toolbarBgSel; |
|||
|
|||
color_t statusBarText; |
|||
} NColorScheme; |
|||
|
|||
|
|||
|
|||
#endif /* NOTEPADUIDEFINES_H_ */ |
@ -0,0 +1,17 @@ |
|||
# Notepad-2 Demo for ChibiOS/GFX |
|||
|
|||
This demo showcases an improved Notepad demo for the ChibiOS/GFX project. |
|||
|
|||
## Features: |
|||
|
|||
* 2 Different UI Skins available |
|||
* Draw in 8 different colors in 8 different thickness |
|||
* Pen, Erase and Fill Modes (Fill: Fills the entire canvas, this is not flood fill) |
|||
|
|||
This demo is planned to support Loading and Saving to SD Card the sketches made in the near future. |
|||
|
|||
## License: |
|||
Copyright © 2013 Kumar Abhishek [abhishek.kakkar@edaboard.com]. All Rights Reserved |
|||
This code is made available under the terms of the 3-clause BSD License. |
|||
|
|||
Some of the icons in the set have been taken from the fugue-icons-set by Yusuke Kamiyamane: http://p.yusukekamiyamane.com/ . These icons are covered by a Creative Commons Attribution 3.0 License. |
After Width: | Height: | Size: 3.1 KiB |
@ -0,0 +1,237 @@ |
|||
/*
|
|||
* File: toolbarIcons.h |
|||
* |
|||
* This file is a part of the Notepad demo application for ChibiOS/GFX |
|||
* |
|||
* This file has a different license from the others. |
|||
* |
|||
* Icons [0-10 and 15] in this set are taken from the fugue-icons-set |
|||
* by Yusuke Kamiyamane [http://p.yusukekamiyamane.com/] .These icons
|
|||
* are covered by a Creative Commons Attribution 3.0 License: |
|||
* http://creativecommons.org/licenses/by/3.0/
|
|||
* and have been used according to the terms of the license. |
|||
* |
|||
* The file is in a filmstrip format of 16x16 icons converted to GIF Format |
|||
* See toolbarIcons.gif for the GIF source |
|||
* |
|||
* Total 16 icons (256 x 16) |
|||
* 0 -> New |
|||
* 1 -> Open |
|||
* 2 -> Save |
|||
* 3 -> Brush |
|||
* 4 -> Color Palette |
|||
* 5 -> Pencil |
|||
* 6 -> Eraser |
|||
* 7 -> Fill Color |
|||
* 8 -> Cross |
|||
* 9 -> Plus |
|||
* 10 -> Minus |
|||
* 11 -> Cross (Round) |
|||
* 12 -> Info |
|||
* 13 -> Tick |
|||
* 14 -> Warning |
|||
* 15 -> 32-bit processor |
|||
* |
|||
*/ |
|||
|
|||
static const unsigned char toolbarIcons[] = { |
|||
0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x00, 0x01, 0x10, 0x00, 0xF7, 0x00, 0x00, 0x05, 0x05, 0x05, |
|||
0x18, 0x18, 0x18, 0x00, 0x33, 0x00, 0x0B, 0x2A, 0x2A, 0x17, 0x38, 0x38, 0x31, 0x09, 0x09, 0x2A, |
|||
0x38, 0x1D, 0x29, 0x29, 0x29, 0x29, 0x35, 0x35, 0x32, 0x2E, 0x26, 0x3A, 0x3A, 0x3A, 0x02, 0x4D, |
|||
0x02, 0x00, 0x5B, 0x02, 0x1E, 0x5D, 0x1E, 0x02, 0x70, 0x03, 0x2A, 0x6A, 0x2A, 0x2C, 0x50, 0x50, |
|||
0x3E, 0x65, 0x65, 0x5C, 0x01, 0x01, 0x68, 0x00, 0x00, 0x7D, 0x00, 0x00, 0x7D, 0x3C, 0x06, 0x71, |
|||
0x27, 0x27, 0x45, 0x00, 0x67, 0x51, 0x02, 0x79, 0x45, 0x36, 0x4E, 0x55, 0x47, 0x0A, 0x4F, 0x57, |
|||
0x32, 0x6C, 0x52, 0x01, 0x7A, 0x64, 0x00, 0x46, 0x46, 0x46, 0x52, 0x4F, 0x47, 0x54, 0x54, 0x54, |
|||
0x43, 0x51, 0x7C, 0x5E, 0x70, 0x5E, 0x45, 0x6D, 0x6D, 0x4B, 0x74, 0x74, 0x53, 0x7D, 0x7D, 0x6A, |
|||
0x48, 0x48, 0x67, 0x67, 0x67, 0x78, 0x78, 0x78, 0x09, 0x2B, 0x91, 0x1B, 0x3D, 0xA3, 0x3B, 0x2B, |
|||
0x97, 0x1E, 0x71, 0x8E, 0x19, 0x6C, 0xB7, 0x2A, 0x53, 0xB4, 0x38, 0x6B, 0x9E, 0x37, 0x71, 0xB5, |
|||
0x3C, 0x5E, 0xC4, 0x29, 0x78, 0xC5, 0x5B, 0x02, 0x86, 0x49, 0x55, 0xBC, 0x42, 0x75, 0xA8, 0x7C, |
|||
0x49, 0x95, 0x50, 0x72, 0xD6, 0x5A, 0x7C, 0xE2, 0x00, 0x91, 0x0F, 0x13, 0x9C, 0x24, 0x00, 0xA7, |
|||
0x13, 0x12, 0xA6, 0x23, 0x11, 0xB9, 0x22, 0x2E, 0x83, 0x2E, 0x31, 0x86, 0x31, 0x34, 0x98, 0x34, |
|||
0x28, 0xB3, 0x39, 0x34, 0xBC, 0x45, 0x0F, 0xCC, 0x1F, 0x0F, 0xC8, 0x20, 0x12, 0xC9, 0x23, 0x11, |
|||
0xD5, 0x22, 0x22, 0xC3, 0x34, 0x3B, 0xC4, 0x4C, 0x48, 0x9D, 0x48, 0x54, 0xA9, 0x54, 0x67, 0xAD, |
|||
0x67, 0x60, 0xB5, 0x60, 0x7A, 0xB4, 0x7A, 0x44, 0xCC, 0x55, 0x4D, 0xD5, 0x5E, 0x51, 0xDB, 0x62, |
|||
0x5B, 0xE3, 0x6C, 0x6E, 0xC3, 0x6E, 0x1B, 0xA1, 0xE2, 0x3B, 0x8A, 0xD6, 0x3E, 0x9C, 0xE7, 0x38, |
|||
0xC5, 0xFF, 0x55, 0x88, 0xBA, 0x70, 0x9E, 0xB9, 0x78, 0xA7, 0xB9, 0x4C, 0x91, 0xCD, 0x52, 0x8F, |
|||
0xF6, 0x5F, 0xBC, 0xE8, 0x68, 0x9B, 0xCE, 0x63, 0x85, 0xEB, 0x72, 0xA4, 0xD1, 0x66, 0xA6, 0xFF, |
|||
0x5D, 0xD1, 0xFF, 0x75, 0xC8, 0xEE, 0x88, 0x00, 0x00, 0x95, 0x01, 0x01, 0x9B, 0x11, 0x11, 0x9B, |
|||
0x02, 0x20, 0xA7, 0x00, 0x00, 0xA7, 0x14, 0x14, 0xB3, 0x01, 0x01, 0xB8, 0x11, 0x11, 0xA7, 0x02, |
|||
0x23, 0xB4, 0x02, 0x25, 0xAD, 0x26, 0x26, 0xB5, 0x28, 0x28, 0xBC, 0x34, 0x34, 0x89, 0x45, 0x01, |
|||
0x8A, 0x5B, 0x00, 0x93, 0x49, 0x01, 0x9A, 0x50, 0x05, 0x98, 0x55, 0x11, 0x8E, 0x6B, 0x01, 0x89, |
|||
0x75, 0x04, 0x98, 0x66, 0x00, 0x96, 0x77, 0x03, 0xB0, 0x5C, 0x06, 0xA7, 0x6F, 0x00, 0xAB, 0x65, |
|||
0x13, 0xA6, 0x78, 0x02, 0xA9, 0x7A, 0x1C, 0xBC, 0x61, 0x04, 0xB7, 0x7A, 0x00, 0xB2, 0x78, 0x38, |
|||
0x8A, 0x6A, 0x4B, 0xC9, 0x0C, 0x0C, 0xC9, 0x12, 0x12, 0xD8, 0x01, 0x01, 0xD4, 0x11, 0x11, 0xC6, |
|||
0x27, 0x27, 0xC7, 0x39, 0x39, 0xE4, 0x13, 0x00, 0xD2, 0x5E, 0x28, 0xC0, 0x62, 0x04, 0xC9, 0x78, |
|||
0x26, 0xEA, 0x40, 0x30, 0xCA, 0x42, 0x42, 0xD5, 0x4D, 0x4D, 0xD8, 0x50, 0x50, 0xD1, 0x7B, 0x5A, |
|||
0xE4, 0x59, 0x56, 0xEB, 0x69, 0x5C, 0xF1, 0x6C, 0x6A, 0x80, 0x48, 0x9B, 0x89, 0x56, 0xA2, 0x90, |
|||
0x5D, 0xA9, 0x96, 0x63, 0xAF, 0xA7, 0x74, 0xC0, 0xD2, 0x7D, 0x8E, 0x99, 0x85, 0x0B, 0xA6, 0x8A, |
|||
0x03, 0xAB, 0x94, 0x01, 0xA4, 0x93, 0x1C, 0xB0, 0x82, 0x0B, 0xB8, 0x85, 0x17, 0xB3, 0x9A, 0x03, |
|||
0xAF, 0x8E, 0x2E, 0xB7, 0xA6, 0x30, 0x91, 0x83, 0x48, 0x8B, 0x84, 0x66, 0x9A, 0x88, 0x71, 0x9B, |
|||
0x9A, 0x75, 0x88, 0xA2, 0x56, 0x97, 0xB3, 0x67, 0xB1, 0x94, 0x44, 0xBA, 0x9F, 0x63, 0xBD, 0xA3, |
|||
0x66, 0xA7, 0xC6, 0x79, 0xCA, 0x87, 0x00, 0xD0, 0x88, 0x3C, 0xCE, 0xB0, 0x14, 0xCF, 0xB7, 0x2E, |
|||
0xCA, 0x96, 0x56, 0xC7, 0xAF, 0x4C, 0xD6, 0xAE, 0x6D, 0xE7, 0x93, 0x71, 0xEA, 0xBF, 0x5F, 0xE2, |
|||
0xB1, 0x79, 0xFE, 0xCC, 0x04, 0xE6, 0xCA, 0x34, 0xDE, 0xCD, 0x56, 0xE3, 0xD2, 0x5E, 0xEB, 0xC4, |
|||
0x67, 0xE9, 0xCA, 0x7F, 0xE6, 0xD5, 0x64, 0xFA, 0xF3, 0x58, 0xEB, 0xE0, 0x64, 0xF6, 0xE5, 0x79, |
|||
0x83, 0x83, 0x84, 0x8A, 0x86, 0x95, 0x95, 0x95, 0x96, 0x9C, 0x9C, 0xAD, 0x80, 0xBF, 0x80, 0x96, |
|||
0xAB, 0xAB, 0xB8, 0xB4, 0x8F, 0xA5, 0xA6, 0xA8, 0xA9, 0xA9, 0xB8, 0xA5, 0xB6, 0xB6, 0xBD, 0xAF, |
|||
0xA0, 0xB8, 0xB8, 0xB9, 0x85, 0x80, 0xCB, 0x84, 0xAC, 0xCB, 0x81, 0xB6, 0xE3, 0xBA, 0x87, 0xD3, |
|||
0xB6, 0xB9, 0xC5, 0xB0, 0xD1, 0x84, 0xB0, 0xCA, 0xB0, 0x94, 0xC7, 0xF8, 0x92, 0xE3, 0xFF, 0xAD, |
|||
0xC3, 0xCD, 0xAA, 0xD3, 0xFD, 0xBF, 0xE1, 0xF1, 0xDA, 0x85, 0x96, 0xC7, 0xB6, 0x80, 0xF1, 0x89, |
|||
0x91, 0xE9, 0x9B, 0xAC, 0xE6, 0xB8, 0x84, 0xEB, 0xA4, 0xB5, 0xF2, 0xBE, 0xB9, 0xC3, 0x90, 0xDC, |
|||
0xCD, 0x9A, 0xE6, 0xD9, 0xA6, 0xF2, 0xFB, 0xB3, 0xC4, 0xD8, 0xC7, 0x8B, 0xDB, 0xD4, 0xB0, 0xEA, |
|||
0xC4, 0x89, 0xEE, 0xC4, 0x91, 0xE9, 0xD3, 0x87, 0xEC, 0xD5, 0x91, 0xF0, 0xC8, 0x95, 0xF1, 0xD5, |
|||
0x89, 0xF4, 0xDA, 0x95, 0xFD, 0xEC, 0x84, 0xF8, 0xE2, 0x9B, 0xFF, 0xFF, 0x84, 0xE5, 0xE2, 0xBC, |
|||
0xFC, 0xE9, 0xA4, 0xFF, 0xF1, 0xAC, 0xC9, 0xC9, 0xC9, 0xD9, 0xD9, 0xD9, 0xD8, 0xD8, 0xEA, 0xDB, |
|||
0xEA, 0xEA, 0xDB, 0xEB, 0xFF, 0xF3, 0xE8, 0xCA, 0xE7, 0xE7, 0xE7, 0xE1, 0xE1, 0xF2, 0xE6, 0xF2, |
|||
0xE6, 0xE8, 0xF3, 0xF4, 0xFD, 0xF0, 0xEF, 0xF8, 0xF9, 0xF9, 0x00, 0x00, 0x00, 0x21, 0xF9, 0x04, |
|||
0x01, 0x0A, 0x00, 0xFF, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x08, |
|||
0xFE, 0x00, 0xFF, 0xFD, 0x2B, 0x41, 0xA2, 0x84, 0xC1, 0x83, 0x06, 0x05, 0x2A, 0xFC, 0xD7, 0xAA, |
|||
0xA1, 0xC3, 0x87, 0x0D, 0x17, 0x4A, 0x94, 0x58, 0xA5, 0xCA, 0xC4, 0x8B, 0x0A, 0x0F, 0x8D, 0xC1, |
|||
0xC8, 0xB1, 0xE3, 0x3F, 0x44, 0x88, 0x08, 0x75, 0x5C, 0xC3, 0x86, 0x24, 0x46, 0x0F, 0x20, 0x14, |
|||
0x1C, 0xF0, 0xC8, 0xB2, 0xA5, 0xCB, 0x97, 0x30, 0x63, 0xB6, 0xA4, 0x77, 0xD1, 0x81, 0xCD, 0x9B, |
|||
0x38, 0x73, 0x2A, 0x2C, 0xE1, 0x8F, 0x9F, 0xCF, 0x9F, 0xD6, 0x12, 0x2E, 0x6C, 0xB5, 0x6E, 0x57, |
|||
0xAD, 0x75, 0xEE, 0xE2, 0x29, 0x55, 0xDA, 0x4A, 0xE1, 0x8C, 0x19, 0x08, 0xA3, 0x52, 0xA1, 0x42, |
|||
0xA3, 0xA5, 0x23, 0x32, 0x63, 0x0E, 0x49, 0xF4, 0xA3, 0xA8, 0xAB, 0x57, 0x45, 0x7E, 0x5A, 0x82, |
|||
0x50, 0xB3, 0x2D, 0x4D, 0x1A, 0x8C, 0x6C, 0xD8, 0x8C, 0x1B, 0xB7, 0x66, 0xCD, 0x45, 0x10, 0x02, |
|||
0x03, 0x70, 0x3C, 0x43, 0xB7, 0xAE, 0x5D, 0xBA, 0x0B, 0x77, 0xE8, 0xDD, 0xCB, 0x57, 0xEF, 0xC2, |
|||
0xBB, 0x80, 0xCF, 0x4C, 0xFC, 0x16, 0x09, 0x24, 0xC8, 0x48, 0xDF, 0x30, 0x62, 0xE3, 0x32, 0xA5, |
|||
0xF1, 0x14, 0x2E, 0xD8, 0x2E, 0xD2, 0x9B, 0xB6, 0x04, 0x88, 0x65, 0x20, 0x4B, 0xA6, 0xD1, 0xC4, |
|||
0x48, 0xEF, 0xD6, 0xAD, 0xCD, 0x0B, 0x1D, 0xC4, 0x53, 0x22, 0xA5, 0xB4, 0x69, 0xD3, 0x4A, 0xE2, |
|||
0x39, 0xD8, 0xE9, 0xD3, 0x1E, 0x3F, 0x7B, 0xF6, 0xE8, 0x29, 0xF3, 0x47, 0x70, 0xA8, 0xBC, 0x78, |
|||
0xEE, 0x76, 0xA5, 0x3A, 0xC6, 0x9B, 0xF7, 0x28, 0x52, 0xA4, 0xFE, 0xCD, 0x10, 0xE7, 0xAF, 0x78, |
|||
0xF1, 0x67, 0x5A, 0x92, 0x6B, 0xA9, 0x26, 0x43, 0x86, 0x47, 0x32, 0x58, 0x37, 0x2A, 0xF4, 0xE3, |
|||
0x27, 0x51, 0xA4, 0x48, 0xB4, 0xBA, 0xD9, 0x92, 0x05, 0xEB, 0x53, 0xD8, 0x8E, 0x20, 0x40, 0xFE, |
|||
0xF8, 0x9B, 0x14, 0x49, 0xF0, 0x44, 0x92, 0xE3, 0xBC, 0x79, 0x63, 0xCB, 0x66, 0xA2, 0x07, 0x0F, |
|||
0x07, 0x02, 0x00, 0xB8, 0x78, 0xC6, 0xD0, 0xA4, 0xFB, 0xF8, 0xF3, 0x1B, 0x32, 0xBF, 0xE3, 0x48, |
|||
0x94, 0xFF, 0x00, 0x02, 0x08, 0x45, 0x10, 0x3B, 0x08, 0x54, 0x5F, 0x7E, 0x08, 0x4E, 0xB2, 0xDF, |
|||
0x42, 0x92, 0x18, 0xE6, 0x20, 0x22, 0x93, 0x4C, 0x24, 0x86, 0x63, 0x14, 0x4E, 0x21, 0x86, 0x44, |
|||
0xF4, 0x34, 0x71, 0xD9, 0x86, 0x40, 0x34, 0x01, 0x9A, 0x44, 0xE8, 0x78, 0x86, 0xCE, 0x44, 0x0E, |
|||
0x28, 0xA1, 0x84, 0x34, 0x27, 0xA6, 0x88, 0x22, 0x8A, 0x4A, 0xAC, 0x26, 0x10, 0x09, 0x3D, 0xBD, |
|||
0x06, 0x9B, 0x3D, 0xC6, 0xD4, 0x08, 0xC1, 0x50, 0x4B, 0xC5, 0x33, 0x8B, 0x71, 0x3C, 0x06, 0x37, |
|||
0x43, 0x38, 0x3C, 0xFA, 0xB3, 0x9C, 0x18, 0x61, 0x14, 0x29, 0x86, 0x73, 0x1C, 0x41, 0x37, 0xC6, |
|||
0x18, 0x8E, 0x08, 0x94, 0x87, 0x1F, 0x8B, 0xD8, 0xE2, 0xC8, 0x7D, 0x86, 0xCC, 0x02, 0x0B, 0x30, |
|||
0xC0, 0x84, 0x42, 0x1D, 0x47, 0x9C, 0x68, 0xE2, 0xCF, 0x3C, 0xF4, 0x8C, 0x61, 0xDE, 0x42, 0xE8, |
|||
0xA9, 0xA7, 0x1E, 0x5B, 0x6E, 0x2D, 0x04, 0x5F, 0x3E, 0x28, 0x00, 0x30, 0x9F, 0x44, 0x67, 0x90, |
|||
0x77, 0xDD, 0x9C, 0x74, 0x96, 0x27, 0xD0, 0x0E, 0x50, 0x3C, 0xA1, 0xE7, 0x13, 0x48, 0x20, 0xB1, |
|||
0xE7, 0x13, 0x50, 0x14, 0xF8, 0x4F, 0x9C, 0x75, 0x16, 0x3A, 0xE6, 0x24, 0x88, 0x30, 0xC2, 0x88, |
|||
0x83, 0x8A, 0x42, 0xB8, 0xD0, 0x84, 0x8E, 0x15, 0x47, 0xE1, 0x85, 0x0A, 0x69, 0xC8, 0xE1, 0x86, |
|||
0x1E, 0x4E, 0xD4, 0x99, 0x67, 0x9F, 0x49, 0xE4, 0x00, 0x13, 0x49, 0x90, 0xF3, 0x40, 0x3C, 0xA3, |
|||
0x96, 0x4A, 0x4E, 0x12, 0x4C, 0xB8, 0xF8, 0x0F, 0x8C, 0x3D, 0xF9, 0xE3, 0x1A, 0x6C, 0xFE, 0xF4, |
|||
0xF0, 0x33, 0x02, 0x8E, 0x4B, 0x91, 0xB2, 0xC5, 0x16, 0x60, 0x80, 0x71, 0xCD, 0x35, 0xFE, 0xF8, |
|||
0x08, 0x64, 0xAB, 0xFC, 0x7C, 0xA1, 0x9C, 0x16, 0x56, 0xB8, 0xD0, 0x42, 0x92, 0x4A, 0x4A, 0xF7, |
|||
0x8F, 0x1F, 0xB1, 0x98, 0x63, 0xCB, 0x21, 0x87, 0xB8, 0x01, 0x89, 0x2D, 0xA2, 0x88, 0xD2, 0xC9, |
|||
0x2C, 0xAE, 0xE4, 0x81, 0x11, 0x28, 0x9B, 0xB4, 0x23, 0x0A, 0x3D, 0x01, 0x14, 0x30, 0x51, 0x30, |
|||
0xC1, 0x8C, 0xC3, 0x0D, 0x37, 0xDE, 0xA0, 0x9B, 0x0D, 0x37, 0x69, 0x0A, 0xB4, 0x26, 0x3D, 0x28, |
|||
0xE4, 0xE3, 0x26, 0x9C, 0x93, 0x38, 0xE2, 0x88, 0x3F, 0xF6, 0xDA, 0x8B, 0xAF, 0x23, 0x76, 0xFE, |
|||
0x83, 0xA7, 0x13, 0x00, 0x23, 0x51, 0x1C, 0x12, 0x00, 0x3B, 0x11, 0xA8, 0x81, 0xF5, 0xE6, 0xAB, |
|||
0xB0, 0xBD, 0xFD, 0x7E, 0x93, 0x68, 0x3F, 0xFD, 0x2C, 0xFA, 0x70, 0xC4, 0x88, 0x24, 0xF6, 0x0F, |
|||
0x36, 0x15, 0x4A, 0x4A, 0x61, 0x64, 0xFF, 0x4C, 0x73, 0x29, 0x10, 0xC5, 0xF8, 0xB3, 0x8F, 0x65, |
|||
0xD3, 0x4C, 0x14, 0x22, 0xA7, 0x23, 0x86, 0x26, 0x0D, 0x39, 0x1F, 0xBC, 0xE7, 0xF2, 0x7B, 0x1F, |
|||
0x90, 0x23, 0x8D, 0xAA, 0x23, 0x00, 0x2B, 0x23, 0x6C, 0xFC, 0x90, 0xB0, 0xD0, 0x1F, 0xB8, 0x25, |
|||
0x35, 0x8A, 0x33, 0x40, 0x7F, 0x61, 0xCD, 0x3D, 0xBD, 0x0A, 0x07, 0xA4, 0x6B, 0x3F, 0xBD, 0xC6, |
|||
0x0F, 0x0C, 0x30, 0xAC, 0x80, 0x2C, 0x1A, 0x63, 0x50, 0xA0, 0x50, 0x1E, 0xB3, 0x68, 0x67, 0x0B, |
|||
0x24, 0x68, 0x4C, 0xBB, 0x9D, 0x26, 0xB2, 0xD8, 0x62, 0x8B, 0xB6, 0x13, 0x71, 0xC2, 0x49, 0x3B, |
|||
0xC0, 0xE4, 0x62, 0xC7, 0x9B, 0x0B, 0x91, 0x5B, 0xDC, 0xB9, 0xEA, 0xAE, 0xDB, 0xEE, 0xBB, 0xF3, |
|||
0xA0, 0xC0, 0x0C, 0x3D, 0xF3, 0x2A, 0x44, 0x46, 0x24, 0x8D, 0x18, 0xD7, 0x48, 0xFE, 0xDE, 0xC5, |
|||
0x35, 0x72, 0x95, 0x40, 0x39, 0x40, 0xD1, 0x27, 0x12, 0x42, 0x14, 0x27, 0xC4, 0xE0, 0x4E, 0xE4, |
|||
0x20, 0xD0, 0xDD, 0x7B, 0x37, 0xEE, 0xB8, 0xDF, 0x64, 0x08, 0x54, 0x18, 0x23, 0xFD, 0xF8, 0x13, |
|||
0x31, 0xE5, 0x96, 0x2F, 0x1A, 0x89, 0x40, 0x8C, 0x55, 0xE8, 0x39, 0x17, 0x02, 0x55, 0x76, 0xE9, |
|||
0x3E, 0xFE, 0x14, 0x63, 0xD9, 0x12, 0x18, 0x7A, 0xE6, 0xA6, 0x67, 0x1F, 0x96, 0xF8, 0x80, 0x07, |
|||
0xF4, 0x7C, 0x09, 0xC2, 0x3C, 0xFE, 0xD0, 0xE3, 0xC1, 0x03, 0x2D, 0x2A, 0x54, 0x33, 0xB0, 0xAE, |
|||
0x2A, 0x1D, 0xC1, 0xCE, 0xEE, 0xB0, 0xC3, 0x8E, 0x3B, 0xB1, 0xF0, 0x18, 0x0D, 0x3F, 0x45, 0xFF, |
|||
0x78, 0xF3, 0x8C, 0xB0, 0x5D, 0xD1, 0xCC, 0x0C, 0x18, 0x41, 0xF7, 0x46, 0x19, 0x52, 0x4F, 0xAD, |
|||
0x4E, 0x37, 0xDD, 0x98, 0x83, 0xFD, 0xF6, 0xD8, 0x2F, 0xF3, 0xC5, 0x17, 0x81, 0x4C, 0x04, 0xCA, |
|||
0xD8, 0xC0, 0xF4, 0xC2, 0x09, 0x28, 0x13, 0xA1, 0x80, 0x42, 0x71, 0xF9, 0xF8, 0x83, 0x6E, 0x26, |
|||
0xD9, 0x6C, 0xB3, 0x86, 0x19, 0xEE, 0x1E, 0x90, 0x0F, 0x3D, 0xF3, 0x20, 0x83, 0xC2, 0x30, 0xC8, |
|||
0x80, 0x7B, 0x83, 0x17, 0x8B, 0x7B, 0xC4, 0x1B, 0xDA, 0xC0, 0x3E, 0x7A, 0x18, 0xB0, 0x0C, 0x68, |
|||
0x70, 0x43, 0xE4, 0xFE, 0x91, 0x83, 0x27, 0x08, 0x21, 0x08, 0x10, 0xCC, 0x47, 0x3E, 0x74, 0x40, |
|||
0x41, 0x1D, 0x04, 0x41, 0x71, 0xFF, 0x20, 0x83, 0x00, 0xDF, 0xC0, 0x41, 0x37, 0xA0, 0x01, 0x0D, |
|||
0x65, 0x40, 0xA0, 0x02, 0x05, 0x62, 0x18, 0xCC, 0x41, 0x2C, 0x73, 0x86, 0x11, 0x88, 0xE7, 0x34, |
|||
0x46, 0x21, 0x81, 0x7C, 0x2C, 0x64, 0x23, 0xBB, 0x0C, 0x88, 0x54, 0x07, 0x00, 0x11, 0x85, 0x86, |
|||
0x15, 0xE9, 0x50, 0x00, 0x08, 0x3C, 0xE0, 0x0F, 0x97, 0xF9, 0x43, 0x01, 0xFE, 0xE9, 0x60, 0x85, |
|||
0xAA, 0x22, 0x10, 0x24, 0xE4, 0xE1, 0xCC, 0x04, 0x84, 0x10, 0x84, 0x40, 0xFE, 0x10, 0xBC, 0xE1, |
|||
0x6D, 0xE2, 0x15, 0x50, 0xF4, 0x87, 0x31, 0x7C, 0xE2, 0x23, 0x70, 0xD4, 0x23, 0x69, 0x48, 0xE3, |
|||
0x47, 0x3D, 0xC0, 0x01, 0xBD, 0x89, 0x40, 0xE7, 0x10, 0x68, 0xA8, 0x9E, 0x42, 0xE6, 0x30, 0x0B, |
|||
0x73, 0xC4, 0x22, 0x0F, 0xCD, 0xCA, 0xDE, 0xF6, 0xBA, 0x40, 0x0D, 0x6A, 0x5C, 0x41, 0x22, 0x62, |
|||
0x23, 0x9B, 0x2E, 0x36, 0xC1, 0x89, 0xF4, 0xC5, 0x4B, 0x82, 0xFE, 0x90, 0x60, 0x26, 0x32, 0xB1, |
|||
0x0D, 0x33, 0xD0, 0xEF, 0x1F, 0x70, 0x63, 0xC6, 0x30, 0xE6, 0x11, 0x0C, 0x62, 0x24, 0xA3, 0x1E, |
|||
0x21, 0xC0, 0xC1, 0x0D, 0x32, 0xE8, 0x88, 0x37, 0xB8, 0xA1, 0x0C, 0x60, 0x3A, 0xE0, 0x07, 0xD1, |
|||
0xB0, 0xC0, 0x1C, 0x38, 0x21, 0x08, 0x79, 0x34, 0x20, 0x3D, 0x24, 0x98, 0x0F, 0x1E, 0xF0, 0x00, |
|||
0x83, 0x64, 0x68, 0x64, 0xED, 0x22, 0xC9, 0xC9, 0x0F, 0x2E, 0x90, 0x51, 0x95, 0x43, 0x61, 0x0A, |
|||
0xFF, 0xB1, 0x42, 0x7F, 0x78, 0xCE, 0x85, 0xA3, 0x2B, 0xDD, 0x86, 0x16, 0xB2, 0xA9, 0x5B, 0xAC, |
|||
0x8E, 0x75, 0x0A, 0x71, 0x40, 0x12, 0x1E, 0xA0, 0x00, 0x64, 0xF8, 0x63, 0x18, 0x1E, 0x08, 0x46, |
|||
0x3E, 0x90, 0xA1, 0x80, 0x07, 0x24, 0x61, 0x88, 0x3C, 0x42, 0x9E, 0x11, 0xED, 0x61, 0x82, 0xB2, |
|||
0x2C, 0x51, 0x78, 0xC2, 0xF3, 0x04, 0x2C, 0x60, 0xF1, 0x0A, 0x7F, 0x64, 0xE1, 0x1A, 0xFC, 0x08, |
|||
0x0E, 0x06, 0xC0, 0x01, 0x8D, 0x6E, 0x7A, 0xF3, 0x9B, 0xD0, 0xE8, 0xE2, 0x42, 0xA0, 0xE3, 0x88, |
|||
0x36, 0x88, 0x71, 0x21, 0x70, 0x48, 0xE7, 0x3F, 0xE0, 0xA0, 0x8E, 0x58, 0xD0, 0x21, 0x15, 0xD8, |
|||
0xBB, 0xC2, 0x15, 0x6A, 0x10, 0x3E, 0x85, 0x70, 0xAB, 0x1D, 0xBD, 0xFE, 0xE8, 0x85, 0x26, 0x36, |
|||
0x31, 0x91, 0x13, 0xC4, 0x2B, 0x8F, 0x00, 0x05, 0x53, 0x36, 0xFC, 0x58, 0xBF, 0xFB, 0xCD, 0x23, |
|||
0x19, 0x82, 0x04, 0x81, 0x30, 0x92, 0x91, 0x8C, 0x7C, 0x28, 0xE0, 0x06, 0x8B, 0x24, 0x43, 0x23, |
|||
0x3C, 0x88, 0x06, 0x4D, 0xE6, 0x63, 0x92, 0x6A, 0xA8, 0xE4, 0x25, 0x35, 0xB9, 0x49, 0x4E, 0x7A, |
|||
0x12, 0x94, 0x13, 0xC5, 0x9F, 0x01, 0x39, 0x79, 0xD1, 0x8C, 0x92, 0xB0, 0x84, 0xA9, 0xA4, 0xD8, |
|||
0x2A, 0x5B, 0xF9, 0xCA, 0x7F, 0x5C, 0x86, 0x74, 0xC5, 0x80, 0x21, 0x87, 0x16, 0x72, 0x32, 0x5B, |
|||
0xD6, 0xD0, 0x86, 0x02, 0x61, 0x00, 0x2A, 0xCC, 0xA1, 0x00, 0x0F, 0x28, 0xC0, 0xA1, 0xF9, 0x38, |
|||
0x81, 0x4F, 0xCD, 0x81, 0x0A, 0x06, 0x28, 0x04, 0x02, 0x41, 0x2A, 0x0E, 0x3F, 0xE0, 0xE1, 0x4B, |
|||
0x09, 0x2C, 0xF0, 0x0F, 0xEC, 0x58, 0xC7, 0x3A, 0xD8, 0xF1, 0x09, 0x5F, 0xE0, 0x02, 0x17, 0xFE, |
|||
0xC0, 0x02, 0x35, 0xB2, 0x29, 0x1C, 0x68, 0x54, 0xE2, 0xAB, 0x60, 0x0D, 0x6B, 0x38, 0x30, 0x20, |
|||
0x11, 0x0B, 0x84, 0xD2, 0x0D, 0xE7, 0xBC, 0x08, 0x1C, 0x00, 0xC1, 0x0E, 0x3A, 0xFC, 0x83, 0x0E, |
|||
0xE7, 0xE8, 0xC6, 0x31, 0x5E, 0x50, 0x0A, 0xB0, 0xFD, 0x23, 0x8E, 0xF9, 0xB4, 0x83, 0x26, 0xFA, |
|||
0x79, 0x02, 0x92, 0x4A, 0x70, 0x1E, 0x60, 0x52, 0xC0, 0x1F, 0xFF, 0x61, 0x3F, 0xFC, 0x31, 0x83, |
|||
0x19, 0xC9, 0x40, 0x86, 0x21, 0xA3, 0xA1, 0x8F, 0x9E, 0xC6, 0x20, 0x06, 0xFF, 0xC8, 0x8A, 0x1A, |
|||
0xD4, 0x60, 0x51, 0x09, 0x4E, 0x56, 0x0D, 0xD2, 0xC9, 0x01, 0x12, 0x7A, 0xE0, 0x49, 0x1E, 0x48, |
|||
0xB0, 0xB3, 0x3D, 0xE8, 0x01, 0x06, 0x25, 0x3B, 0xC9, 0xD2, 0xA2, 0x61, 0xB2, 0xD2, 0x41, 0xA9, |
|||
0xE5, 0x2A, 0xA7, 0x52, 0x44, 0xA8, 0x30, 0x63, 0xAE, 0xAC, 0xFE, 0x10, 0x2C, 0x41, 0x26, 0x32, |
|||
0x98, 0xCE, 0x54, 0x20, 0xB5, 0xB4, 0x29, 0xA7, 0x3A, 0xF5, 0x0F, 0x06, 0x00, 0xE1, 0x01, 0x07, |
|||
0x60, 0x46, 0x3E, 0x98, 0xF1, 0x53, 0x09, 0x1E, 0xE0, 0x01, 0x40, 0x30, 0xAA, 0x40, 0x90, 0x5A, |
|||
0x44, 0x78, 0xC8, 0x02, 0x18, 0x08, 0x90, 0x8B, 0x40, 0xF8, 0xB0, 0x0E, 0x74, 0xA0, 0x63, 0x1D, |
|||
0xA1, 0x78, 0xC7, 0x2F, 0x70, 0xC1, 0x8F, 0x29, 0x72, 0x75, 0x9B, 0x95, 0x00, 0xEC, 0x3C, 0xA2, |
|||
0x01, 0x58, 0x4B, 0x60, 0xC2, 0x12, 0xE1, 0x5C, 0xC8, 0x0E, 0x0F, 0xF1, 0x86, 0xB4, 0x4E, 0x44, |
|||
0x0E, 0x80, 0x50, 0x47, 0x5C, 0xAB, 0x16, 0xD7, 0x73, 0x98, 0x63, 0x0F, 0xF6, 0x1C, 0x9B, 0x2E, |
|||
0x7A, 0x61, 0x07, 0x3C, 0x5C, 0xA4, 0xAF, 0x9C, 0xDC, 0x24, 0x60, 0xE9, 0x71, 0x80, 0x95, 0x28, |
|||
0x24, 0x00, 0xF8, 0x43, 0x28, 0x32, 0x92, 0x61, 0xC8, 0x64, 0x34, 0xD6, 0x03, 0xFF, 0x70, 0x81, |
|||
0x0B, 0x22, 0x6B, 0x08, 0xCA, 0x1A, 0xF0, 0x83, 0x9C, 0x44, 0x2D, 0xE0, 0x8E, 0x10, 0xDA, 0xD0, |
|||
0x4A, 0xB0, 0xC3, 0xA1, 0x1D, 0x6D, 0x85, 0x2F, 0x4B, 0xE2, 0xCB, 0x4A, 0x67, 0x72, 0xAC, 0x55, |
|||
0x54, 0x8A, 0x11, 0xB1, 0xB9, 0x7F, 0x74, 0x2E, 0x52, 0xB1, 0x75, 0x0C, 0xE8, 0xFE, 0x21, 0x3A, |
|||
0x20, 0x90, 0x4E, 0x64, 0x1C, 0x42, 0x9D, 0x40, 0x6A, 0xBA, 0x5B, 0x94, 0xE5, 0x14, 0x15, 0xAB, |
|||
0x48, 0x40, 0x00, 0x86, 0x4C, 0xE4, 0x00, 0x24, 0x60, 0x15, 0x45, 0x3D, 0x6A, 0x52, 0x9D, 0x0B, |
|||
0x8C, 0x54, 0x6C, 0x60, 0x21, 0x7A, 0x58, 0x87, 0x39, 0xCC, 0xB1, 0x0E, 0x3E, 0xDC, 0xE2, 0x15, |
|||
0xA0, 0xE0, 0x87, 0x08, 0x58, 0x00, 0x9C, 0x7F, 0x60, 0x00, 0x1A, 0x96, 0x88, 0x86, 0x0D, 0x6C, |
|||
0x70, 0xD8, 0x68, 0x54, 0x02, 0x13, 0x97, 0x00, 0x07, 0xFE, 0x59, 0x05, 0xB2, 0x43, 0x7F, 0x20, |
|||
0xC3, 0xBD, 0xEF, 0xB5, 0xAF, 0x39, 0xCE, 0x21, 0x5F, 0x75, 0xB4, 0xD3, 0xAE, 0x7C, 0xE8, 0x96, |
|||
0x2E, 0x74, 0xD1, 0x01, 0x3B, 0x60, 0x04, 0x04, 0x01, 0xCE, 0x87, 0x78, 0x87, 0x2C, 0x11, 0x37, |
|||
0xCD, 0x03, 0xB1, 0x8A, 0x4D, 0x46, 0x34, 0xEA, 0xD1, 0x53, 0x81, 0xA8, 0x40, 0x05, 0x91, 0x1D, |
|||
0xC4, 0x20, 0x28, 0xAB, 0x06, 0x49, 0xAB, 0x21, 0x1F, 0x95, 0x1E, 0x44, 0x66, 0x8B, 0xC0, 0xE9, |
|||
0x22, 0xF4, 0xE0, 0xC3, 0x9D, 0x2E, 0xC2, 0x68, 0x25, 0x4D, 0xEA, 0x52, 0x93, 0x5A, 0x3A, 0x0E, |
|||
0xA3, 0x9C, 0x4A, 0x55, 0xBD, 0x28, 0x8B, 0x61, 0x8C, 0x42, 0x2C, 0x6C, 0x0C, 0xC7, 0x3C, 0x66, |
|||
0x99, 0x90, 0xC9, 0x72, 0x43, 0x25, 0xFB, 0x47, 0x6E, 0x75, 0xBB, 0x5B, 0x9A, 0xF8, 0xD6, 0x07, |
|||
0xAA, 0x68, 0xC0, 0x2C, 0x84, 0x4D, 0x6C, 0x55, 0xF8, 0x20, 0xB9, 0x4A, 0xE6, 0x11, 0x93, 0x53, |
|||
0x51, 0x8E, 0x1B, 0x29, 0xE4, 0x0E, 0xE8, 0xE0, 0x05, 0x2F, 0xD0, 0x71, 0x87, 0x57, 0x6C, 0x02, |
|||
0x0F, 0xFC, 0x30, 0x45, 0x53, 0x04, 0xF2, 0xE5, 0x4A, 0x30, 0xC3, 0x12, 0x97, 0x60, 0x68, 0x32, |
|||
0x2E, 0x81, 0x09, 0x4C, 0x40, 0x63, 0xCD, 0x7B, 0xD8, 0x83, 0x9B, 0xA5, 0xEB, 0x11, 0x39, 0x34, |
|||
0x4B, 0xBE, 0xDD, 0x98, 0x05, 0x20, 0xE6, 0xB0, 0x10, 0x3C, 0xD4, 0x01, 0x1F, 0xB2, 0xE0, 0x73, |
|||
0x07, 0x38, 0xE2, 0xD3, 0xDA, 0x0D, 0x17, 0xB0, 0xF2, 0xB9, 0x88, 0x9B, 0xA2, 0x91, 0xE8, 0x45, |
|||
0x1F, 0x40, 0x01, 0x0A, 0x49, 0x41, 0x0A, 0xFE, 0x41, 0x81, 0x41, 0x14, 0xA2, 0x10, 0x6A, 0x78, |
|||
0xF8, 0xC3, 0x23, 0x5E, 0x08, 0x41, 0x54, 0xCF, 0x01, 0x45, 0x30, 0x82, 0xC6, 0x8D, 0x10, 0xDA, |
|||
0x8D, 0x1B, 0x81, 0x08, 0x2E, 0x6A, 0xB8, 0xC4, 0xFE, 0x47, 0x2E, 0x71, 0x8B, 0x2B, 0xA4, 0x41, |
|||
0x8D, 0x2A, 0xE1, 0xA2, 0x22, 0xA4, 0x10, 0x48, 0x35, 0x26, 0xD6, 0x94, 0x12, 0x88, 0xA5, 0x3E, |
|||
0xD6, 0xA1, 0xCD, 0xF0, 0x98, 0xD7, 0x3E, 0x5E, 0xC0, 0x0F, 0x7E, 0x70, 0x0A, 0x9E, 0xFB, 0xBC, |
|||
0xE7, 0x3D, 0xFF, 0xC1, 0x02, 0x92, 0x5D, 0x1C, 0x7C, 0x37, 0xB9, 0x1C, 0xFE, 0x70, 0xB6, 0x40, |
|||
0xE2, 0x10, 0x8A, 0x32, 0x9A, 0x23, 0x14, 0x49, 0x7B, 0xB2, 0x42, 0x2E, 0x70, 0x01, 0x4A, 0x8C, |
|||
0x3B, 0xDC, 0x0C, 0x25, 0xB7, 0xB9, 0x2F, 0x20, 0x90, 0x3D, 0xC4, 0x02, 0x10, 0xEC, 0x66, 0x49, |
|||
0x3A, 0xC7, 0x0E, 0x87, 0x89, 0xD4, 0x61, 0x15, 0xF8, 0x28, 0x07, 0x07, 0xF6, 0xDD, 0x91, 0xF8, |
|||
0x08, 0x1A, 0xB0, 0x75, 0x13, 0x38, 0x00, 0x18, 0xBA, 0x68, 0x42, 0x27, 0x5C, 0x20, 0x13, 0x20, |
|||
0x83, 0xC3, 0x49, 0xFE, 0x70, 0x41, 0x90, 0x61, 0x02, 0x02, 0x71, 0x40, 0x0E, 0x32, 0xEE, 0xF1, |
|||
0x8D, 0x0F, 0x21, 0x07, 0x2E, 0xCA, 0xFB, 0xDE, 0xF9, 0xEE, 0x77, 0xC0, 0x2B, 0x04, 0x51, 0x0F, |
|||
0x02, 0x09, 0xCB, 0x1F, 0xE5, 0xB9, 0xC6, 0xC4, 0xBC, 0x52, 0x34, 0xCF, 0x94, 0x40, 0x7A, 0xCC, |
|||
0x79, 0x4E, 0xFD, 0x43, 0x00, 0xB3, 0xF8, 0x01, 0xCD, 0x81, 0xF0, 0x83, 0x59, 0x08, 0x40, 0x21, |
|||
0x04, 0xE0, 0x91, 0x36, 0xF0, 0x91, 0x0A, 0x78, 0x14, 0x87, 0x00, 0x12, 0xB9, 0xC3, 0x1D, 0xFA, |
|||
0x20, 0x0B, 0x0E, 0x78, 0xE2, 0xF6, 0xB7, 0x97, 0x08, 0xD5, 0xDD, 0xC4, 0x7B, 0x00, 0x50, 0xFD, |
|||
0xF7, 0xFF, 0xC0, 0x81, 0x30, 0x52, 0x51, 0x01, 0x99, 0x74, 0x84, 0x03, 0xAC, 0xE7, 0x00, 0x07, |
|||
0x5A, 0x22, 0x9F, 0xDE, 0x7B, 0x64, 0xE0, 0xF5, 0x88, 0xFB, 0x44, 0x24, 0x40, 0xFD, 0xEA, 0x5B, |
|||
0x9F, 0xFA, 0x0B, 0x61, 0x80, 0xF6, 0xB7, 0x56, 0xCF, 0x7D, 0xED, 0x2F, 0xE4, 0xFA, 0xE0, 0x97, |
|||
0xC0, 0x60, 0x0A, 0x63, 0x18, 0xC4, 0x28, 0xE6, 0xC5, 0x8F, 0xE1, 0x18, 0x86, 0x28, 0xB3, 0xA1, |
|||
0xCC, 0x7C, 0xE8, 0xE6, 0x9D, 0x1F, 0x91, 0x00, 0xE6, 0x4F, 0xFF, 0xFA, 0xDB, 0x5F, 0x21, 0x03, |
|||
0xC8, 0x7F, 0xFE, 0x01, 0xA0, 0x01, 0x03, 0xE8, 0x7F, 0x00, 0x17, 0x11, 0x07, 0x71, 0xB0, 0x6D, |
|||