Working on First Run Setup.
This commit is contained in:
parent
1beebe629c
commit
ecf6d1f842
40 changed files with 1133 additions and 369 deletions
1
.gitattributes
vendored
1
.gitattributes
vendored
|
@ -3,3 +3,4 @@
|
||||||
*.xcf filter=lfs diff=lfs merge=lfs -text
|
*.xcf filter=lfs diff=lfs merge=lfs -text
|
||||||
*.odg filter=lfs diff=lfs merge=lfs -text
|
*.odg filter=lfs diff=lfs merge=lfs -text
|
||||||
*.xlsx filter=lfs diff=lfs merge=lfs -text
|
*.xlsx filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.dat filter=lfs diff=lfs merge=lfs -text
|
||||||
|
|
86
buildPrerequisites.sh
Executable file
86
buildPrerequisites.sh
Executable file
|
@ -0,0 +1,86 @@
|
||||||
|
#!/bin/bash -ex
|
||||||
|
|
||||||
|
#
|
||||||
|
# Kangaroo Punch MultiPlayer Game Server Mark II
|
||||||
|
# Copyright (C) 2020-2021 Scott Duensing
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
function createEmbeddedBinary() {
|
||||||
|
local BINFILE=$1
|
||||||
|
local BINEXTENSION=$2
|
||||||
|
local TARGETDIR=$3
|
||||||
|
local SOURCEFILE="$3/${1,,}.h"
|
||||||
|
local BLOCKER="${1^^}_${2^^}_H"
|
||||||
|
|
||||||
|
outputLicense > ${SOURCEFILE}
|
||||||
|
outputHeader ${BLOCKER} >> ${SOURCEFILE}
|
||||||
|
printf "\n#ifdef EMBED_HERE\n\n" >> ${SOURCEFILE}
|
||||||
|
xxd -i ${BINFILE}.${BINEXTENSION} >> ${SOURCEFILE}
|
||||||
|
printf "\n#else // EMBED_HERE\n\n" >> ${SOURCEFILE}
|
||||||
|
printf "extern unsigned char ${BINFILE}_${BINEXTENSION}[];\n" >> ${SOURCEFILE}
|
||||||
|
printf "extern unsigned int ${BINFILE}_${BINEXTENSION}_len;\n" >> ${SOURCEFILE}
|
||||||
|
printf "\n#endif // EMBED_HERE\n\n" >> ${SOURCEFILE}
|
||||||
|
outputFooter ${BLOCKER} >> ${SOURCEFILE}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function outputFooter() {
|
||||||
|
local BLOCKER=$1
|
||||||
|
|
||||||
|
printf "\n#pragma GCC diagnostic pop\n\n\n#endif // ${BLOCKER}\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function outputHeader() {
|
||||||
|
local BLOCKER=$1
|
||||||
|
|
||||||
|
printf "\n\n#ifndef ${BLOCKER}\n#define ${BLOCKER}\n\n\n"
|
||||||
|
printf "// ===== THIS FILE IS AUTOMATICALLY GENERATED - DO NOT EDIT =====\n\n\n"
|
||||||
|
printf "#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wunused-variable\"\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function outputLicense() {
|
||||||
|
cat <<-LICENSE
|
||||||
|
/*
|
||||||
|
* Kangaroo Punch MultiPlayer Game Server Mark II
|
||||||
|
* Copyright (C) 2020-2021 Scott Duensing
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
LICENSE
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
pushd font/data
|
||||||
|
|
||||||
|
createEmbeddedBinary vga8x14 dat ../../client/src/embedded
|
||||||
|
|
||||||
|
popd
|
||||||
|
|
|
@ -68,6 +68,8 @@ HEADERS = \
|
||||||
$$SHARED/packets.h \
|
$$SHARED/packets.h \
|
||||||
src/config.h \
|
src/config.h \
|
||||||
$$SHARED/util.h \
|
$$SHARED/util.h \
|
||||||
|
src/embedded/vga8x14.h \
|
||||||
|
src/firstrun.h \
|
||||||
src/gui/msgbox.h \
|
src/gui/msgbox.h \
|
||||||
src/login.h \
|
src/login.h \
|
||||||
src/menu.h \
|
src/menu.h \
|
||||||
|
@ -117,6 +119,8 @@ SOURCES = \
|
||||||
$$SHARED/thirdparty/tiny-AES128-C/pkcs7_padding.c \
|
$$SHARED/thirdparty/tiny-AES128-C/pkcs7_padding.c \
|
||||||
src/config.c \
|
src/config.c \
|
||||||
$$SHARED/memory.c \
|
$$SHARED/memory.c \
|
||||||
|
src/embedded/embedded.c \
|
||||||
|
src/firstrun.c \
|
||||||
src/gui/msgbox.c \
|
src/gui/msgbox.c \
|
||||||
src/login.c \
|
src/login.c \
|
||||||
src/menu.c \
|
src/menu.c \
|
||||||
|
@ -158,10 +162,8 @@ LIBS = \
|
||||||
OTHER_FILES = \
|
OTHER_FILES = \
|
||||||
$$DOS_HEADERS \
|
$$DOS_HEADERS \
|
||||||
$$DOS_SOURCES \
|
$$DOS_SOURCES \
|
||||||
../Makefile.djgpp \
|
|
||||||
../build.sh \
|
|
||||||
../test.sh \
|
|
||||||
../test.conf \
|
|
||||||
postBuild.sh
|
postBuild.sh
|
||||||
|
|
||||||
QMAKE_POST_LINK = $$PWD/postBuild.sh "$$PWD" "$$DESTDIR"
|
QMAKE_POST_LINK = $$PWD/postBuild.sh "$$PWD" "$$DESTDIR"
|
||||||
|
|
||||||
|
DISTFILES +=
|
||||||
|
|
22
client/src/embedded/embedded.c
Normal file
22
client/src/embedded/embedded.c
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
/*
|
||||||
|
* Kangaroo Punch MultiPlayer Game Server Mark II
|
||||||
|
* Copyright (C) 2020-2021 Scott Duensing
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#define EMBED_HERE
|
||||||
|
#include "vga8x14.h"
|
347
client/src/embedded/vga8x14.h
Normal file
347
client/src/embedded/vga8x14.h
Normal file
|
@ -0,0 +1,347 @@
|
||||||
|
/*
|
||||||
|
* Kangaroo Punch MultiPlayer Game Server Mark II
|
||||||
|
* Copyright (C) 2020-2021 Scott Duensing
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef VGA8X14_DAT_H
|
||||||
|
#define VGA8X14_DAT_H
|
||||||
|
|
||||||
|
|
||||||
|
// ===== THIS FILE IS AUTOMATICALLY GENERATED - DO NOT EDIT =====
|
||||||
|
|
||||||
|
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wunused-variable"
|
||||||
|
|
||||||
|
#ifdef EMBED_HERE
|
||||||
|
|
||||||
|
unsigned char vga8x14_dat[] = {
|
||||||
|
0x08, 0x0e, 0x10, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x7e, 0x7e, 0x00, 0x00, 0x18, 0x18, 0x00, 0xff, 0x00, 0xff, 0x1e,
|
||||||
|
0x3c, 0x3f, 0x7f, 0x18, 0x00, 0x81, 0xff, 0x6c, 0x10, 0x3c, 0x3c, 0x00,
|
||||||
|
0xff, 0x00, 0xff, 0x0e, 0x66, 0x33, 0x63, 0x18, 0x00, 0xa5, 0xdb, 0xfe,
|
||||||
|
0x38, 0x3c, 0x7e, 0x00, 0xff, 0x3c, 0xc3, 0x1a, 0x66, 0x3f, 0x7f, 0xdb,
|
||||||
|
0x00, 0x81, 0xff, 0xfe, 0x7c, 0xe7, 0xff, 0x18, 0xe7, 0x66, 0x99, 0x32,
|
||||||
|
0x66, 0x30, 0x63, 0x3c, 0x00, 0x81, 0xff, 0xfe, 0xfe, 0xe7, 0xff, 0x3c,
|
||||||
|
0xc3, 0x42, 0xbd, 0x78, 0x3c, 0x30, 0x63, 0xe7, 0x00, 0xbd, 0xc3, 0xfe,
|
||||||
|
0x7c, 0xe7, 0x7e, 0x3c, 0xc3, 0x42, 0xbd, 0xcc, 0x18, 0x30, 0x63, 0x3c,
|
||||||
|
0x00, 0x99, 0xe7, 0x7c, 0x38, 0x18, 0x18, 0x18, 0xe7, 0x66, 0x99, 0xcc,
|
||||||
|
0x7e, 0x70, 0x67, 0xdb, 0x00, 0x81, 0xff, 0x38, 0x10, 0x18, 0x18, 0x00,
|
||||||
|
0xff, 0x3c, 0xc3, 0xcc, 0x18, 0xf0, 0xe7, 0x18, 0x00, 0x7e, 0x7e, 0x10,
|
||||||
|
0x00, 0x3c, 0x3c, 0x00, 0xff, 0x00, 0xff, 0x78, 0x18, 0xe0, 0xe6, 0x18,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00,
|
||||||
|
0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 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, 0x7c, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x18, 0x66,
|
||||||
|
0x7f, 0xc6, 0x00, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xc0, 0x06, 0x3c, 0x66, 0xdb, 0x60, 0x00, 0x3c, 0x3c, 0x18, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x10, 0xfe, 0xe0, 0x0e, 0x7e, 0x66, 0xdb, 0x38, 0x00, 0x7e,
|
||||||
|
0x7e, 0x18, 0x18, 0x30, 0x00, 0x28, 0x38, 0xfe, 0xf8, 0x3e, 0x18, 0x66,
|
||||||
|
0xdb, 0x6c, 0x00, 0x18, 0x18, 0x18, 0x0c, 0x60, 0xc0, 0x6c, 0x38, 0x7c,
|
||||||
|
0xfe, 0xfe, 0x18, 0x66, 0x7b, 0xc6, 0x00, 0x18, 0x18, 0x18, 0xfe, 0xfe,
|
||||||
|
0xc0, 0xfe, 0x7c, 0x7c, 0xf8, 0x3e, 0x18, 0x66, 0x1b, 0xc6, 0x00, 0x18,
|
||||||
|
0x18, 0x18, 0x0c, 0x60, 0xc0, 0x6c, 0x7c, 0x38, 0xe0, 0x0e, 0x7e, 0x00,
|
||||||
|
0x1b, 0x6c, 0xfe, 0x7e, 0x18, 0x7e, 0x18, 0x30, 0xfe, 0x28, 0xfe, 0x38,
|
||||||
|
0xc0, 0x06, 0x3c, 0x66, 0x1b, 0x38, 0xfe, 0x3c, 0x18, 0x3c, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0xfe, 0x10, 0x80, 0x02, 0x18, 0x66, 0x1b, 0x0c, 0xfe, 0x18,
|
||||||
|
0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0xc6, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x66, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x66, 0x6c, 0x7c, 0x00, 0x38, 0x30,
|
||||||
|
0x0c, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3c, 0x66, 0x6c,
|
||||||
|
0xc6, 0x00, 0x6c, 0x30, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
|
||||||
|
0x00, 0x3c, 0x24, 0xfe, 0xc2, 0xc2, 0x6c, 0x60, 0x30, 0x0c, 0x66, 0x18,
|
||||||
|
0x00, 0x00, 0x00, 0x0c, 0x00, 0x3c, 0x00, 0x6c, 0xc0, 0xc6, 0x38, 0x00,
|
||||||
|
0x30, 0x0c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x6c,
|
||||||
|
0x7c, 0x0c, 0x76, 0x00, 0x30, 0x0c, 0xff, 0x7e, 0x00, 0xfe, 0x00, 0x30,
|
||||||
|
0x00, 0x18, 0x00, 0x6c, 0x06, 0x18, 0xdc, 0x00, 0x30, 0x0c, 0x3c, 0x18,
|
||||||
|
0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0xfe, 0x86, 0x30, 0xcc, 0x00,
|
||||||
|
0x30, 0x0c, 0x66, 0x18, 0x18, 0x00, 0x00, 0xc0, 0x00, 0x18, 0x00, 0x6c,
|
||||||
|
0xc6, 0x66, 0xcc, 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x00, 0x18, 0x80,
|
||||||
|
0x00, 0x18, 0x00, 0x6c, 0x7c, 0xc6, 0x76, 0x00, 0x0c, 0x30, 0x00, 0x00,
|
||||||
|
0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x7c, 0x18, 0x7c, 0x7c, 0x0c, 0xfe, 0x38, 0xfe, 0x7c, 0x7c, 0x00, 0x00,
|
||||||
|
0x06, 0x00, 0x60, 0x7c, 0xc6, 0x38, 0xc6, 0xc6, 0x1c, 0xc0, 0x60, 0xc6,
|
||||||
|
0xc6, 0xc6, 0x18, 0x18, 0x0c, 0x00, 0x30, 0xc6, 0xce, 0x78, 0x06, 0x06,
|
||||||
|
0x3c, 0xc0, 0xc0, 0x06, 0xc6, 0xc6, 0x18, 0x18, 0x18, 0x00, 0x18, 0xc6,
|
||||||
|
0xde, 0x18, 0x0c, 0x06, 0x6c, 0xc0, 0xc0, 0x0c, 0xc6, 0xc6, 0x00, 0x00,
|
||||||
|
0x30, 0x7e, 0x0c, 0x0c, 0xf6, 0x18, 0x18, 0x3c, 0xcc, 0xfc, 0xfc, 0x18,
|
||||||
|
0x7c, 0x7e, 0x00, 0x00, 0x60, 0x00, 0x06, 0x18, 0xe6, 0x18, 0x30, 0x06,
|
||||||
|
0xfe, 0x06, 0xc6, 0x30, 0xc6, 0x06, 0x00, 0x00, 0x30, 0x00, 0x0c, 0x18,
|
||||||
|
0xc6, 0x18, 0x60, 0x06, 0x0c, 0x06, 0xc6, 0x30, 0xc6, 0x06, 0x18, 0x18,
|
||||||
|
0x18, 0x7e, 0x18, 0x00, 0xc6, 0x18, 0xc6, 0xc6, 0x0c, 0xc6, 0xc6, 0x30,
|
||||||
|
0xc6, 0x0c, 0x18, 0x18, 0x0c, 0x00, 0x30, 0x18, 0x7c, 0x7e, 0xfe, 0x7c,
|
||||||
|
0x1e, 0x7c, 0x7c, 0x30, 0x7c, 0x78, 0x00, 0x30, 0x06, 0x00, 0x60, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x10, 0xfc, 0x3c,
|
||||||
|
0xf8, 0xfe, 0xfe, 0x3c, 0xc6, 0x3c, 0x1e, 0xe6, 0xf0, 0xc6, 0xc6, 0x38,
|
||||||
|
0xc6, 0x38, 0x66, 0x66, 0x6c, 0x66, 0x66, 0x66, 0xc6, 0x18, 0x0c, 0x66,
|
||||||
|
0x60, 0xee, 0xe6, 0x6c, 0xc6, 0x6c, 0x66, 0xc2, 0x66, 0x62, 0x62, 0xc2,
|
||||||
|
0xc6, 0x18, 0x0c, 0x6c, 0x60, 0xfe, 0xf6, 0xc6, 0xde, 0xc6, 0x66, 0xc0,
|
||||||
|
0x66, 0x68, 0x68, 0xc0, 0xc6, 0x18, 0x0c, 0x6c, 0x60, 0xfe, 0xfe, 0xc6,
|
||||||
|
0xde, 0xc6, 0x7c, 0xc0, 0x66, 0x78, 0x78, 0xc0, 0xfe, 0x18, 0x0c, 0x78,
|
||||||
|
0x60, 0xd6, 0xde, 0xc6, 0xde, 0xfe, 0x66, 0xc0, 0x66, 0x68, 0x68, 0xde,
|
||||||
|
0xc6, 0x18, 0x0c, 0x6c, 0x60, 0xc6, 0xce, 0xc6, 0xdc, 0xc6, 0x66, 0xc2,
|
||||||
|
0x66, 0x62, 0x60, 0xc6, 0xc6, 0x18, 0xcc, 0x6c, 0x62, 0xc6, 0xc6, 0xc6,
|
||||||
|
0xc0, 0xc6, 0x66, 0x66, 0x6c, 0x66, 0x60, 0x66, 0xc6, 0x18, 0xcc, 0x66,
|
||||||
|
0x66, 0xc6, 0xc6, 0x6c, 0x7c, 0xc6, 0xfc, 0x3c, 0xf8, 0xfe, 0xf0, 0x3a,
|
||||||
|
0xc6, 0x3c, 0x78, 0xe6, 0xfe, 0xc6, 0xc6, 0x38, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x38, 0x00, 0xfc, 0x7c, 0xfc, 0x7c, 0x7e, 0xc6, 0xc6, 0xc6,
|
||||||
|
0xc6, 0x66, 0xfe, 0x3c, 0x80, 0x3c, 0x6c, 0x00, 0x66, 0xc6, 0x66, 0xc6,
|
||||||
|
0x7e, 0xc6, 0xc6, 0xc6, 0xc6, 0x66, 0xc6, 0x30, 0xc0, 0x0c, 0xc6, 0x00,
|
||||||
|
0x66, 0xc6, 0x66, 0xc6, 0x5a, 0xc6, 0xc6, 0xc6, 0x6c, 0x66, 0x8c, 0x30,
|
||||||
|
0xe0, 0x0c, 0x00, 0x00, 0x66, 0xc6, 0x66, 0x60, 0x18, 0xc6, 0xc6, 0xc6,
|
||||||
|
0x38, 0x66, 0x18, 0x30, 0x70, 0x0c, 0x00, 0x00, 0x7c, 0xc6, 0x7c, 0x38,
|
||||||
|
0x18, 0xc6, 0xc6, 0xd6, 0x38, 0x3c, 0x30, 0x30, 0x38, 0x0c, 0x00, 0x00,
|
||||||
|
0x60, 0xd6, 0x6c, 0x0c, 0x18, 0xc6, 0xc6, 0xd6, 0x38, 0x18, 0x60, 0x30,
|
||||||
|
0x1c, 0x0c, 0x00, 0x00, 0x60, 0xde, 0x66, 0xc6, 0x18, 0xc6, 0x6c, 0xfe,
|
||||||
|
0x6c, 0x18, 0xc2, 0x30, 0x0e, 0x0c, 0x00, 0x00, 0x60, 0x7c, 0x66, 0xc6,
|
||||||
|
0x18, 0xc6, 0x38, 0x7c, 0xc6, 0x18, 0xc6, 0x30, 0x06, 0x0c, 0x00, 0x00,
|
||||||
|
0xf0, 0x0c, 0xe6, 0x7c, 0x3c, 0x7c, 0x10, 0x6c, 0xc6, 0x3c, 0xfe, 0x3c,
|
||||||
|
0x02, 0x3c, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 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,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x18, 0x00, 0xe0, 0x00, 0x1c, 0x00, 0x38, 0x00, 0xe0, 0x18, 0x06, 0xe0,
|
||||||
|
0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x0c, 0x00, 0x6c, 0x00,
|
||||||
|
0x60, 0x18, 0x06, 0x60, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00,
|
||||||
|
0x0c, 0x00, 0x64, 0x00, 0x60, 0x00, 0x00, 0x60, 0x18, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x78, 0x78, 0x7c, 0x3c, 0x7c, 0x60, 0x76, 0x6c, 0x38, 0x0e, 0x66,
|
||||||
|
0x18, 0xec, 0xdc, 0x7c, 0x00, 0x0c, 0x6c, 0xc6, 0x6c, 0xc6, 0xf0, 0xcc,
|
||||||
|
0x76, 0x18, 0x06, 0x6c, 0x18, 0xfe, 0x66, 0xc6, 0x00, 0x7c, 0x66, 0xc0,
|
||||||
|
0xcc, 0xfe, 0x60, 0xcc, 0x66, 0x18, 0x06, 0x78, 0x18, 0xd6, 0x66, 0xc6,
|
||||||
|
0x00, 0xcc, 0x66, 0xc0, 0xcc, 0xc0, 0x60, 0xcc, 0x66, 0x18, 0x06, 0x6c,
|
||||||
|
0x18, 0xd6, 0x66, 0xc6, 0x00, 0xcc, 0x66, 0xc6, 0xcc, 0xc6, 0x60, 0x7c,
|
||||||
|
0x66, 0x18, 0x06, 0x66, 0x18, 0xd6, 0x66, 0xc6, 0x00, 0x76, 0x7c, 0x7c,
|
||||||
|
0x76, 0x7c, 0xf0, 0x0c, 0xe6, 0x3c, 0x66, 0xe6, 0x3c, 0xc6, 0x66, 0x7c,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x66, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78,
|
||||||
|
0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x18, 0x70, 0x76, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
|
||||||
|
0x18, 0x18, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x00, 0x10, 0xdc, 0x76, 0xdc, 0x7c,
|
||||||
|
0xfc, 0xcc, 0x66, 0xc6, 0xc6, 0xc6, 0xfe, 0x18, 0x18, 0x18, 0x00, 0x38,
|
||||||
|
0x66, 0xcc, 0x76, 0xc6, 0x30, 0xcc, 0x66, 0xc6, 0x6c, 0xc6, 0xcc, 0x70,
|
||||||
|
0x00, 0x0e, 0x00, 0x6c, 0x66, 0xcc, 0x66, 0x70, 0x30, 0xcc, 0x66, 0xd6,
|
||||||
|
0x38, 0xc6, 0x18, 0x18, 0x18, 0x18, 0x00, 0xc6, 0x66, 0xcc, 0x60, 0x1c,
|
||||||
|
0x30, 0xcc, 0x66, 0xd6, 0x38, 0xc6, 0x30, 0x18, 0x18, 0x18, 0x00, 0xc6,
|
||||||
|
0x7c, 0x7c, 0x60, 0xc6, 0x36, 0xcc, 0x3c, 0xfe, 0x6c, 0x7e, 0x66, 0x18,
|
||||||
|
0x18, 0x18, 0x00, 0xfe, 0x60, 0x0c, 0xf0, 0x7c, 0x1c, 0x76, 0x18, 0x6c,
|
||||||
|
0xc6, 0x06, 0xfe, 0x0e, 0x18, 0x70, 0x00, 0x00, 0x60, 0x0c, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0xf0, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
|
||||||
|
0x00, 0x00, 0x0c, 0x10, 0x00, 0x60, 0x38, 0x00, 0x10, 0x00, 0x60, 0x00,
|
||||||
|
0x18, 0x60, 0xc6, 0x6c, 0x3c, 0xcc, 0x18, 0x38, 0xcc, 0x30, 0x6c, 0x00,
|
||||||
|
0x38, 0xcc, 0x30, 0x66, 0x3c, 0x30, 0xc6, 0x38, 0x66, 0xcc, 0x30, 0x6c,
|
||||||
|
0xcc, 0x18, 0x38, 0x00, 0x6c, 0xcc, 0x18, 0x66, 0x66, 0x18, 0x10, 0x00,
|
||||||
|
0xc2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x38, 0x38, 0xc0, 0xcc, 0x7c, 0x78, 0x78, 0x78, 0x78, 0x66,
|
||||||
|
0x7c, 0x7c, 0x7c, 0x38, 0x38, 0x38, 0x6c, 0x6c, 0xc0, 0xcc, 0xc6, 0x0c,
|
||||||
|
0x0c, 0x0c, 0x0c, 0x60, 0xc6, 0xc6, 0xc6, 0x18, 0x18, 0x18, 0xc6, 0xc6,
|
||||||
|
0xc2, 0xcc, 0xfe, 0x7c, 0x7c, 0x7c, 0x7c, 0x66, 0xfe, 0xfe, 0xfe, 0x18,
|
||||||
|
0x18, 0x18, 0xc6, 0xc6, 0x66, 0xcc, 0xc0, 0xcc, 0xcc, 0xcc, 0xcc, 0x3c,
|
||||||
|
0xc0, 0xc0, 0xc0, 0x18, 0x18, 0x18, 0xfe, 0xfe, 0x3c, 0xcc, 0xc6, 0xcc,
|
||||||
|
0xcc, 0xcc, 0xcc, 0x0c, 0xc6, 0xc6, 0xc6, 0x18, 0x18, 0x18, 0xc6, 0xc6,
|
||||||
|
0x0c, 0x76, 0x7c, 0x76, 0x76, 0x76, 0x76, 0x06, 0x7c, 0x7c, 0x7c, 0x3c,
|
||||||
|
0x3c, 0x3c, 0xc6, 0xc6, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x10,
|
||||||
|
0x00, 0x60, 0x30, 0x60, 0x00, 0xc6, 0xc6, 0x18, 0x38, 0x00, 0xf8, 0x0e,
|
||||||
|
0x60, 0x00, 0x3e, 0x38, 0xc6, 0x30, 0x78, 0x30, 0xc6, 0xc6, 0xc6, 0x18,
|
||||||
|
0x6c, 0x66, 0xcc, 0x1b, 0x00, 0x00, 0x6c, 0x6c, 0xc6, 0x18, 0xcc, 0x18,
|
||||||
|
0xc6, 0x38, 0x00, 0x3c, 0x64, 0x66, 0xcc, 0x18, 0xfe, 0xcc, 0xcc, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0xc6, 0x66, 0x60, 0x3c, 0xf8, 0x18,
|
||||||
|
0x66, 0x76, 0xcc, 0x7c, 0x7c, 0x7c, 0xcc, 0xcc, 0xc6, 0xc6, 0xc6, 0x60,
|
||||||
|
0xf0, 0x18, 0xc4, 0x18, 0x60, 0x36, 0xfe, 0xc6, 0xc6, 0xc6, 0xcc, 0xcc,
|
||||||
|
0xc6, 0xc6, 0xc6, 0x60, 0x60, 0x7e, 0xcc, 0x7e, 0x7c, 0x7e, 0xcc, 0xc6,
|
||||||
|
0xc6, 0xc6, 0xcc, 0xcc, 0xc6, 0xc6, 0xc6, 0x66, 0x60, 0x18, 0xde, 0x18,
|
||||||
|
0x60, 0xd8, 0xcc, 0xc6, 0xc6, 0xc6, 0xcc, 0xcc, 0xc6, 0xc6, 0xc6, 0x3c,
|
||||||
|
0x60, 0x7e, 0xcc, 0x18, 0x66, 0xd8, 0xcc, 0xc6, 0xc6, 0xc6, 0xcc, 0xcc,
|
||||||
|
0x7e, 0x6c, 0xc6, 0x18, 0xe6, 0x18, 0xcc, 0x18, 0xfe, 0x6e, 0xce, 0x7c,
|
||||||
|
0x7c, 0x7c, 0x76, 0x76, 0x06, 0x38, 0x7c, 0x18, 0xfc, 0x18, 0xc6, 0x18,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x18, 0x0c, 0x18, 0x18, 0x00, 0xdc, 0x3c, 0x38,
|
||||||
|
0x00, 0x00, 0x00, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x30, 0x18, 0x30, 0x30,
|
||||||
|
0x76, 0x00, 0x6c, 0x6c, 0x30, 0x00, 0x00, 0xc0, 0xc0, 0x18, 0x00, 0x00,
|
||||||
|
0x60, 0x30, 0x60, 0x60, 0xdc, 0xc6, 0x6c, 0x6c, 0x30, 0x00, 0x00, 0xc6,
|
||||||
|
0xc6, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0x3e, 0x38,
|
||||||
|
0x00, 0x00, 0x00, 0xcc, 0xcc, 0x00, 0x36, 0xd8, 0x78, 0x38, 0x7c, 0xcc,
|
||||||
|
0xdc, 0xf6, 0x00, 0x00, 0x30, 0x00, 0x00, 0xd8, 0xd8, 0x18, 0x6c, 0x6c,
|
||||||
|
0x0c, 0x18, 0xc6, 0xcc, 0x66, 0xfe, 0x7e, 0x7c, 0x30, 0xfe, 0xfe, 0x30,
|
||||||
|
0x30, 0x18, 0xd8, 0x36, 0x7c, 0x18, 0xc6, 0xcc, 0x66, 0xde, 0x00, 0x00,
|
||||||
|
0x60, 0xc0, 0x06, 0x60, 0x66, 0x3c, 0x6c, 0x6c, 0xcc, 0x18, 0xc6, 0xcc,
|
||||||
|
0x66, 0xce, 0x00, 0x00, 0xc6, 0xc0, 0x06, 0xdc, 0xce, 0x3c, 0x36, 0xd8,
|
||||||
|
0xcc, 0x18, 0xc6, 0xcc, 0x66, 0xc6, 0x00, 0x00, 0xc6, 0xc0, 0x06, 0x86,
|
||||||
|
0x9e, 0x3c, 0x00, 0x00, 0x76, 0x3c, 0x7c, 0x76, 0x66, 0xc6, 0x00, 0x00,
|
||||||
|
0x7c, 0x00, 0x00, 0x0c, 0x3e, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x06, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e,
|
||||||
|
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x55, 0xdd, 0x18,
|
||||||
|
0x18, 0x18, 0x36, 0x00, 0x00, 0x36, 0x36, 0x00, 0x36, 0x36, 0x18, 0x00,
|
||||||
|
0x44, 0xaa, 0x77, 0x18, 0x18, 0x18, 0x36, 0x00, 0x00, 0x36, 0x36, 0x00,
|
||||||
|
0x36, 0x36, 0x18, 0x00, 0x11, 0x55, 0xdd, 0x18, 0x18, 0x18, 0x36, 0x00,
|
||||||
|
0x00, 0x36, 0x36, 0x00, 0x36, 0x36, 0x18, 0x00, 0x44, 0xaa, 0x77, 0x18,
|
||||||
|
0x18, 0x18, 0x36, 0x00, 0x00, 0x36, 0x36, 0x00, 0x36, 0x36, 0x18, 0x00,
|
||||||
|
0x11, 0x55, 0xdd, 0x18, 0x18, 0x18, 0x36, 0x00, 0x00, 0x36, 0x36, 0x00,
|
||||||
|
0x36, 0x36, 0x18, 0x00, 0x44, 0xaa, 0x77, 0x18, 0x18, 0xf8, 0x36, 0x00,
|
||||||
|
0xf8, 0xf6, 0x36, 0xfe, 0xf6, 0x36, 0xf8, 0x00, 0x11, 0x55, 0xdd, 0x18,
|
||||||
|
0x18, 0x18, 0x36, 0x00, 0x18, 0x06, 0x36, 0x06, 0x06, 0x36, 0x18, 0x00,
|
||||||
|
0x44, 0xaa, 0x77, 0x18, 0xf8, 0xf8, 0xf6, 0xfe, 0xf8, 0xf6, 0x36, 0xf6,
|
||||||
|
0xfe, 0xfe, 0xf8, 0xf8, 0x11, 0x55, 0xdd, 0x18, 0x18, 0x18, 0x36, 0x36,
|
||||||
|
0x18, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x18, 0x44, 0xaa, 0x77, 0x18,
|
||||||
|
0x18, 0x18, 0x36, 0x36, 0x18, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x18,
|
||||||
|
0x11, 0x55, 0xdd, 0x18, 0x18, 0x18, 0x36, 0x36, 0x18, 0x36, 0x36, 0x36,
|
||||||
|
0x00, 0x00, 0x00, 0x18, 0x44, 0xaa, 0x77, 0x18, 0x18, 0x18, 0x36, 0x36,
|
||||||
|
0x18, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x18, 0x11, 0x55, 0xdd, 0x18,
|
||||||
|
0x18, 0x18, 0x36, 0x36, 0x18, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x18,
|
||||||
|
0x44, 0xaa, 0x77, 0x18, 0x18, 0x18, 0x36, 0x36, 0x18, 0x36, 0x36, 0x36,
|
||||||
|
0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x00, 0x18, 0x00, 0x18, 0x18, 0x36,
|
||||||
|
0x36, 0x00, 0x36, 0x00, 0x36, 0x00, 0x36, 0x18, 0x18, 0x18, 0x00, 0x18,
|
||||||
|
0x00, 0x18, 0x18, 0x36, 0x36, 0x00, 0x36, 0x00, 0x36, 0x00, 0x36, 0x18,
|
||||||
|
0x18, 0x18, 0x00, 0x18, 0x00, 0x18, 0x18, 0x36, 0x36, 0x00, 0x36, 0x00,
|
||||||
|
0x36, 0x00, 0x36, 0x18, 0x18, 0x18, 0x00, 0x18, 0x00, 0x18, 0x18, 0x36,
|
||||||
|
0x36, 0x00, 0x36, 0x00, 0x36, 0x00, 0x36, 0x18, 0x18, 0x18, 0x00, 0x18,
|
||||||
|
0x00, 0x18, 0x18, 0x36, 0x36, 0x00, 0x36, 0x00, 0x36, 0x00, 0x36, 0x18,
|
||||||
|
0x18, 0x18, 0x00, 0x18, 0x00, 0x18, 0x1f, 0x36, 0x37, 0x3f, 0xf7, 0xff,
|
||||||
|
0x37, 0xff, 0xf7, 0xff, 0x18, 0x18, 0x00, 0x18, 0x00, 0x18, 0x18, 0x36,
|
||||||
|
0x30, 0x30, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0x1f,
|
||||||
|
0xff, 0xff, 0x1f, 0x37, 0x3f, 0x37, 0xff, 0xf7, 0x37, 0xff, 0xf7, 0xff,
|
||||||
|
0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x36, 0x00, 0x36, 0x00, 0x36,
|
||||||
|
0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x36,
|
||||||
|
0x00, 0x36, 0x00, 0x36, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x18, 0x18,
|
||||||
|
0x00, 0x18, 0x18, 0x36, 0x00, 0x36, 0x00, 0x36, 0x36, 0x00, 0x36, 0x00,
|
||||||
|
0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x36, 0x00, 0x36, 0x00, 0x36,
|
||||||
|
0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x36,
|
||||||
|
0x00, 0x36, 0x00, 0x36, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x18, 0x18,
|
||||||
|
0x00, 0x18, 0x18, 0x36, 0x00, 0x36, 0x00, 0x36, 0x36, 0x00, 0x36, 0x00,
|
||||||
|
0x36, 0x00, 0x00, 0x36, 0x18, 0x00, 0x00, 0x36, 0x18, 0x18, 0x00, 0xff,
|
||||||
|
0x00, 0xf0, 0x0f, 0xff, 0x36, 0x00, 0x00, 0x36, 0x18, 0x00, 0x00, 0x36,
|
||||||
|
0x18, 0x18, 0x00, 0xff, 0x00, 0xf0, 0x0f, 0xff, 0x36, 0x00, 0x00, 0x36,
|
||||||
|
0x18, 0x00, 0x00, 0x36, 0x18, 0x18, 0x00, 0xff, 0x00, 0xf0, 0x0f, 0xff,
|
||||||
|
0x36, 0x00, 0x00, 0x36, 0x18, 0x00, 0x00, 0x36, 0x18, 0x18, 0x00, 0xff,
|
||||||
|
0x00, 0xf0, 0x0f, 0xff, 0x36, 0x00, 0x00, 0x36, 0x18, 0x00, 0x00, 0x36,
|
||||||
|
0x18, 0x18, 0x00, 0xff, 0x00, 0xf0, 0x0f, 0xff, 0x36, 0xff, 0x00, 0x36,
|
||||||
|
0x1f, 0x1f, 0x00, 0x36, 0xff, 0x18, 0x00, 0xff, 0x00, 0xf0, 0x0f, 0xff,
|
||||||
|
0x36, 0x00, 0x00, 0x36, 0x18, 0x18, 0x00, 0x36, 0x18, 0x18, 0x00, 0xff,
|
||||||
|
0x00, 0xf0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x1f, 0x1f, 0x3f, 0xff,
|
||||||
|
0xff, 0xf8, 0x1f, 0xff, 0xff, 0xf0, 0x0f, 0x00, 0x00, 0x18, 0x36, 0x00,
|
||||||
|
0x00, 0x18, 0x36, 0x36, 0x18, 0x00, 0x18, 0xff, 0xff, 0xf0, 0x0f, 0x00,
|
||||||
|
0x00, 0x18, 0x36, 0x00, 0x00, 0x18, 0x36, 0x36, 0x18, 0x00, 0x18, 0xff,
|
||||||
|
0xff, 0xf0, 0x0f, 0x00, 0x00, 0x18, 0x36, 0x00, 0x00, 0x18, 0x36, 0x36,
|
||||||
|
0x18, 0x00, 0x18, 0xff, 0xff, 0xf0, 0x0f, 0x00, 0x00, 0x18, 0x36, 0x00,
|
||||||
|
0x00, 0x18, 0x36, 0x36, 0x18, 0x00, 0x18, 0xff, 0xff, 0xf0, 0x0f, 0x00,
|
||||||
|
0x00, 0x18, 0x36, 0x00, 0x00, 0x18, 0x36, 0x36, 0x18, 0x00, 0x18, 0xff,
|
||||||
|
0xff, 0xf0, 0x0f, 0x00, 0x00, 0x18, 0x36, 0x00, 0x00, 0x18, 0x36, 0x36,
|
||||||
|
0x18, 0x00, 0x18, 0xff, 0xff, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0x00, 0x00,
|
||||||
|
0x7e, 0x38, 0x38, 0x1e, 0x00, 0x03, 0x1c, 0x00, 0x00, 0x00, 0xc6, 0x00,
|
||||||
|
0xc6, 0x00, 0x00, 0x00, 0x18, 0x6c, 0x6c, 0x30, 0x00, 0x06, 0x30, 0x7c,
|
||||||
|
0x00, 0x7c, 0xc6, 0xfe, 0x60, 0x00, 0x66, 0x76, 0x3c, 0xc6, 0xc6, 0x18,
|
||||||
|
0x00, 0x7e, 0x60, 0xc6, 0x76, 0xc6, 0xc0, 0x6c, 0x30, 0x7e, 0x66, 0xdc,
|
||||||
|
0x66, 0xc6, 0xc6, 0x0c, 0x7e, 0xdb, 0x60, 0xc6, 0xdc, 0xfc, 0xc0, 0x6c,
|
||||||
|
0x18, 0xd8, 0x66, 0x18, 0x66, 0xfe, 0xc6, 0x3e, 0xdb, 0xdb, 0x7c, 0xc6,
|
||||||
|
0xd8, 0xc6, 0xc0, 0x6c, 0x30, 0xd8, 0x66, 0x18, 0x66, 0xc6, 0x6c, 0x66,
|
||||||
|
0xdb, 0xf3, 0x60, 0xc6, 0xd8, 0xc6, 0xc0, 0x6c, 0x60, 0xd8, 0x7c, 0x18,
|
||||||
|
0x3c, 0xc6, 0x6c, 0x66, 0x7e, 0x7e, 0x60, 0xc6, 0xdc, 0xfc, 0xc0, 0x6c,
|
||||||
|
0xc6, 0xd8, 0x60, 0x18, 0x18, 0x6c, 0x6c, 0x66, 0x00, 0x60, 0x30, 0xc6,
|
||||||
|
0x76, 0xc0, 0xc0, 0x6c, 0xfe, 0x70, 0x60, 0x18, 0x7e, 0x38, 0xee, 0x3c,
|
||||||
|
0x00, 0xc0, 0x1c, 0xc6, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x18, 0x00, 0x00, 0x38, 0x00, 0x00, 0x0f, 0xd8, 0x70, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x30, 0x0c, 0x0e, 0x18, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x0c,
|
||||||
|
0x6c, 0xd8, 0x00, 0x00, 0xfe, 0x18, 0x18, 0x18, 0x1b, 0x18, 0x18, 0x00,
|
||||||
|
0x6c, 0x00, 0x00, 0x0c, 0x6c, 0x30, 0x00, 0x00, 0x00, 0x18, 0x0c, 0x30,
|
||||||
|
0x1b, 0x18, 0x18, 0x76, 0x38, 0x00, 0x00, 0x0c, 0x6c, 0x60, 0x7c, 0x00,
|
||||||
|
0x00, 0x7e, 0x06, 0x60, 0x18, 0x18, 0x00, 0xdc, 0x00, 0x00, 0x00, 0x0c,
|
||||||
|
0x6c, 0xc8, 0x7c, 0x00, 0xfe, 0x18, 0x0c, 0x30, 0x18, 0x18, 0x7e, 0x00,
|
||||||
|
0x00, 0x18, 0x00, 0x0c, 0x6c, 0xf8, 0x7c, 0x00, 0x00, 0x18, 0x18, 0x18,
|
||||||
|
0x18, 0x18, 0x00, 0x76, 0x00, 0x18, 0x18, 0xec, 0x00, 0x00, 0x7c, 0x00,
|
||||||
|
0x00, 0x00, 0x30, 0x0c, 0x18, 0xd8, 0x18, 0xdc, 0x00, 0x00, 0x00, 0x6c,
|
||||||
|
0x00, 0x00, 0x7c, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x18, 0xd8, 0x18, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x7c, 0x00, 0x00, 0xff, 0x7e, 0x7e,
|
||||||
|
0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||||
|
};
|
||||||
|
unsigned int vga8x14_dat_len = 3588;
|
||||||
|
|
||||||
|
#else // EMBED_HERE
|
||||||
|
|
||||||
|
extern unsigned char vga8x14_dat[];
|
||||||
|
extern unsigned int vga8x14_dat_len;
|
||||||
|
|
||||||
|
#endif // EMBED_HERE
|
||||||
|
|
||||||
|
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
|
||||||
|
|
||||||
|
#endif // VGA8X14_DAT_H
|
138
client/src/firstrun.c
Normal file
138
client/src/firstrun.c
Normal file
|
@ -0,0 +1,138 @@
|
||||||
|
/*
|
||||||
|
* Kangaroo Punch MultiPlayer Game Server Mark II
|
||||||
|
* Copyright (C) 2020-2021 Scott Duensing
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include "log.h"
|
||||||
|
#include "memory.h"
|
||||||
|
#include "timer.h"
|
||||||
|
#include "task.h"
|
||||||
|
#include "network.h"
|
||||||
|
#include "settings.h"
|
||||||
|
|
||||||
|
#include "firstrun.h"
|
||||||
|
|
||||||
|
|
||||||
|
static uint8_t _firstRunRunning = 1;
|
||||||
|
|
||||||
|
|
||||||
|
static void firstRunFail(void);
|
||||||
|
static void taskFirstRun(void *data);
|
||||||
|
static void taskFirstRunHelper(void *data);
|
||||||
|
|
||||||
|
|
||||||
|
static void firstRunFail(void) {
|
||||||
|
netShutdown();
|
||||||
|
taskShutdown();
|
||||||
|
timerShutdown();
|
||||||
|
configShutdown();
|
||||||
|
osShutdown();
|
||||||
|
logClose();
|
||||||
|
memoryShutdown();
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void firstRunCheckSetup(void) {
|
||||||
|
// ***TODO*** Check for needed files here.
|
||||||
|
mkdir("cache", 0777);
|
||||||
|
|
||||||
|
taskCreate(taskFirstRunHelper, NULL);
|
||||||
|
taskCreate(taskFirstRun, NULL);
|
||||||
|
taskRun();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void taskFirstRun(void *data) {
|
||||||
|
int8_t comPort = -1;
|
||||||
|
int8_t r = 0;
|
||||||
|
|
||||||
|
(void)data;
|
||||||
|
|
||||||
|
logWrite("First Run Setup\n");
|
||||||
|
logWrite("===============\n\n");
|
||||||
|
|
||||||
|
// 0 1 2 3 4 5 6 7 8
|
||||||
|
// 12345678901234567890123456789012345678901234567890123456789012345678901234567890
|
||||||
|
logWrite("Welcome to the KangaWorld Client! Before you can connect to KangaWorld, Setup\n");
|
||||||
|
logWrite("needs to detect a compatible softmodem and download several files.\n\n");
|
||||||
|
logWrite("One moment while we check for a compatible softmodem...\n\n");
|
||||||
|
|
||||||
|
comPort = settingsScanComPorts();
|
||||||
|
|
||||||
|
if (comPort < 0) {
|
||||||
|
logWrite("Unable to detect a compatible softmodem! For assistance, visit:\n");
|
||||||
|
logWrite("https://Kanga.World\n");
|
||||||
|
firstRunFail();
|
||||||
|
}
|
||||||
|
|
||||||
|
logWrite("Compatible softmodem found on COM%d:! Connecting to KangaWorld...\n\n", comPort + 1);
|
||||||
|
|
||||||
|
logWrite("Initializing modem...\n");
|
||||||
|
r = netConnectStep1();
|
||||||
|
if (r == NETWORK_CONNECT_OPEN_FAILED) {
|
||||||
|
logWrite("Unable to open COM port! Please check settings.\n");
|
||||||
|
_firstRunRunning = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (r == NETWORK_CONNECT_BAD_MODEM) {
|
||||||
|
logWrite("Modem does not support ENET! Please check settings.\n");
|
||||||
|
_firstRunRunning = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
logWrite("Dialing modem...\n");
|
||||||
|
r = netConnectStep2();
|
||||||
|
if (r == NETWORK_CONNECT_NO_CARRIER) {
|
||||||
|
logWrite("Unable to connect to server! Please check settings or try later.\n");
|
||||||
|
_firstRunRunning = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (r == NETWORK_CONNECT_BAD_ENCRYPTION) {
|
||||||
|
logWrite("Unable to negotiate encryption settings!\n");
|
||||||
|
_firstRunRunning = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (r == NETWORK_CONNECT_BAD_SETTINGS) {
|
||||||
|
logWrite("Unable to fetch client settings!\n");
|
||||||
|
_firstRunRunning = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
logWrite("Connected! Pre-caching needed files...\n");
|
||||||
|
|
||||||
|
|
||||||
|
logWrite("Disconnecting...\n");
|
||||||
|
netDisconnect();
|
||||||
|
|
||||||
|
_firstRunRunning = 0;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void taskFirstRunHelper(void *data) {
|
||||||
|
|
||||||
|
(void)data;
|
||||||
|
|
||||||
|
while (_firstRunRunning) {
|
||||||
|
timerUpdate();
|
||||||
|
taskYield();
|
||||||
|
}
|
||||||
|
}
|
31
client/src/firstrun.h
Normal file
31
client/src/firstrun.h
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
/*
|
||||||
|
* Kangaroo Punch MultiPlayer Game Server Mark II
|
||||||
|
* Copyright (C) 2020-2021 Scott Duensing
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef FIRSTRUN_H
|
||||||
|
#define FIRSTRUN_H
|
||||||
|
|
||||||
|
|
||||||
|
#include "os.h"
|
||||||
|
|
||||||
|
|
||||||
|
void firstRunCheckSetup(void);
|
||||||
|
|
||||||
|
|
||||||
|
#endif // FIRSTRUN_H
|
|
@ -22,45 +22,67 @@
|
||||||
#include "surface.h"
|
#include "surface.h"
|
||||||
|
|
||||||
|
|
||||||
|
FontT *fontFromRAMLoad(uint8_t *pointer) {
|
||||||
|
FontT *font = NULL;
|
||||||
|
uint32_t size = 0;
|
||||||
|
|
||||||
|
font = (FontT *)malloc(sizeof(FontT));
|
||||||
|
if (!font) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
font->width = pointer[0]; // Width of character in pixels
|
||||||
|
font->height = pointer[1]; // Height of character in pixels
|
||||||
|
font->span = pointer[2]; // Width of atlas in characters
|
||||||
|
font->count = pointer[3]; // Number of characters in atlas - 1
|
||||||
|
|
||||||
|
font->widthPixels = font->width * font->span; // Width of atlas in pixels
|
||||||
|
font->heightPixels = font->height * ((font->count + 1) / font->span); // Height of atlas in pixels
|
||||||
|
size = font->widthPixels * font->heightPixels / 8; // Bits required to store atlas
|
||||||
|
|
||||||
|
font->bits = (uint8_t *)malloc(size);
|
||||||
|
if (!font->bits) {
|
||||||
|
DEL(font);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(font->bits, &pointer[4], size);
|
||||||
|
|
||||||
|
return font;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
uint16_t fontHeightGet(FontT *font) {
|
uint16_t fontHeightGet(FontT *font) {
|
||||||
return font->height;
|
return font->height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
FontT *fontLoad(char *filename) {
|
FontT *fontLoad(char *filename) {
|
||||||
FILE *in = NULL;
|
FILE *in = NULL;
|
||||||
uint16_t size = 0;
|
size_t size = 0;
|
||||||
FontT *font = NULL;
|
uint8_t *buffer = NULL;
|
||||||
|
FontT *font = NULL;
|
||||||
|
|
||||||
in = fopen(filename, "rb");
|
in = fopen(filename, "rb");
|
||||||
if (!in) return NULL;
|
if (!in) return NULL;
|
||||||
|
|
||||||
font = (FontT *)malloc(sizeof(FontT));
|
fseek(in, 0, SEEK_END);
|
||||||
if (!font) {
|
size = ftell(in);
|
||||||
|
fseek(in, 0, SEEK_SET);
|
||||||
|
|
||||||
|
buffer = (uint8_t *)malloc(size);
|
||||||
|
if (!buffer) {
|
||||||
fclose(in);
|
fclose(in);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
font->width = fgetc(in);
|
fread(buffer, size, 1, in);
|
||||||
font->height = fgetc(in);
|
|
||||||
font->span = fgetc(in);
|
|
||||||
font->count = fgetc(in);
|
|
||||||
|
|
||||||
font->widthPixels = font->width * font->span;
|
|
||||||
font->heightPixels = font->height * (font->count / font->span);
|
|
||||||
|
|
||||||
size = font->widthPixels * font->heightPixels;
|
|
||||||
font->bits = (uint8_t *)malloc(size);
|
|
||||||
if (!font->bits) {
|
|
||||||
free(font);
|
|
||||||
fclose(in);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
fread(font->bits, size, 1, in);
|
|
||||||
|
|
||||||
fclose(in);
|
fclose(in);
|
||||||
|
|
||||||
|
font = fontFromRAMLoad(buffer);
|
||||||
|
|
||||||
|
DEL(buffer);
|
||||||
|
|
||||||
return font;
|
return font;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,7 @@ typedef struct FontS {
|
||||||
} FontT;
|
} FontT;
|
||||||
|
|
||||||
|
|
||||||
|
FontT *fontFromRAMLoad(uint8_t *pointer);
|
||||||
uint16_t fontHeightGet(FontT *font);
|
uint16_t fontHeightGet(FontT *font);
|
||||||
FontT *fontLoad(char *filename);
|
FontT *fontLoad(char *filename);
|
||||||
void fontRender(FontT *font, char *string, ColorT foreground, ColorT background, uint16_t x, uint16_t y);
|
void fontRender(FontT *font, char *string, ColorT foreground, ColorT background, uint16_t x, uint16_t y);
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
|
|
||||||
|
|
||||||
#include "gui.h"
|
#include "gui.h"
|
||||||
|
#include "embedded/vga8x14.h"
|
||||||
#include "widget.h"
|
#include "widget.h"
|
||||||
#include "desktop.h"
|
#include "desktop.h"
|
||||||
#include "window.h"
|
#include "window.h"
|
||||||
|
@ -29,9 +30,6 @@
|
||||||
|
|
||||||
int16_t _guiMetric[METRIC_COUNT];
|
int16_t _guiMetric[METRIC_COUNT];
|
||||||
ColorT _guiColor[COLOR_COUNT];
|
ColorT _guiColor[COLOR_COUNT];
|
||||||
FontT *_guiFont8 = NULL;
|
|
||||||
FontT *_guiFont14 = NULL;
|
|
||||||
FontT *_guiFont16 = NULL;
|
|
||||||
FontT *_guiFont = NULL;
|
FontT *_guiFont = NULL;
|
||||||
WidgetT *_guiDragWidget = NULL;
|
WidgetT *_guiDragWidget = NULL;
|
||||||
uint16_t _guiDragOffsetX = 0;
|
uint16_t _guiDragOffsetX = 0;
|
||||||
|
@ -43,7 +41,7 @@ static DesktopT *_guiDesktop = NULL;
|
||||||
static WidgetT *_guiLastWidgetLeft = NULL;
|
static WidgetT *_guiLastWidgetLeft = NULL;
|
||||||
static uint8_t _guiLastWidgetLeftEvent = MOUSE_EVENT_NONE;
|
static uint8_t _guiLastWidgetLeftEvent = MOUSE_EVENT_NONE;
|
||||||
static WidgetT *_guiFocused = NULL;
|
static WidgetT *_guiFocused = NULL;
|
||||||
static uint8_t _guiHasStopped = 0;
|
static uint8_t _guiHasStopped = 0; // This starts as 0 even if the GUI hasn't been started.
|
||||||
static WidgetT ***_guiDeleteList = NULL;
|
static WidgetT ***_guiDeleteList = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
@ -521,10 +519,7 @@ WidgetT *guiRootGet(void) {
|
||||||
|
|
||||||
void guiShutdown(void) {
|
void guiShutdown(void) {
|
||||||
// Unload fonts.
|
// Unload fonts.
|
||||||
fontUnload(&_guiFont16);
|
fontUnload(&_guiFont);
|
||||||
fontUnload(&_guiFont14);
|
|
||||||
fontUnload(&_guiFont8);
|
|
||||||
_guiFont = NULL;
|
|
||||||
|
|
||||||
// Delete all widgets in GUI tree.
|
// Delete all widgets in GUI tree.
|
||||||
guiDelete((WidgetT **)&_guiDesktop);
|
guiDelete((WidgetT **)&_guiDesktop);
|
||||||
|
@ -631,12 +626,8 @@ DesktopT *guiStartup(void) {
|
||||||
_guiColor[COLOR_LISTBOX_ARROWS_ACTIVE] = vbeColorMake(168, 168, 168);
|
_guiColor[COLOR_LISTBOX_ARROWS_ACTIVE] = vbeColorMake(168, 168, 168);
|
||||||
_guiColor[COLOR_LISTBOX_ARROWS_INACTIVE] = vbeColorMake( 80, 84, 80);
|
_guiColor[COLOR_LISTBOX_ARROWS_INACTIVE] = vbeColorMake( 80, 84, 80);
|
||||||
|
|
||||||
// Load all font sizes.
|
// Load font.
|
||||||
_guiFont8 = fontLoad("data/vga8x8.dat");
|
_guiFont = fontFromRAMLoad(vga8x14_dat);
|
||||||
_guiFont14 = fontLoad("data/vga8x14.dat");
|
|
||||||
_guiFont16 = fontLoad("data/vga8x16.dat");
|
|
||||||
|
|
||||||
_guiFont = _guiFont14; // Font to use for widgets.
|
|
||||||
|
|
||||||
// Create desktop and return it. Remember it for later.
|
// Create desktop and return it. Remember it for later.
|
||||||
_guiDesktop = desktopNew();
|
_guiDesktop = desktopNew();
|
||||||
|
|
|
@ -182,9 +182,6 @@ typedef struct WindowS WindowT;
|
||||||
extern int16_t _guiMetric[METRIC_COUNT];
|
extern int16_t _guiMetric[METRIC_COUNT];
|
||||||
extern ColorT _guiColor[COLOR_COUNT];
|
extern ColorT _guiColor[COLOR_COUNT];
|
||||||
extern FontT *_guiFont;
|
extern FontT *_guiFont;
|
||||||
extern FontT *_guiFont8;
|
|
||||||
extern FontT *_guiFont14;
|
|
||||||
extern FontT *_guiFont16;
|
|
||||||
extern WidgetT *_guiDragWidget;
|
extern WidgetT *_guiDragWidget;
|
||||||
extern uint16_t _guiDragOffsetX;
|
extern uint16_t _guiDragOffsetX;
|
||||||
extern uint16_t _guiDragOffsetY;
|
extern uint16_t _guiDragOffsetY;
|
||||||
|
|
|
@ -77,12 +77,13 @@ static uint32_t _pixelFormat = SDL_PIXELFORMAT_RGBA8888;
|
||||||
static uint8_t _takeScreenshot = 0;
|
static uint8_t _takeScreenshot = 0;
|
||||||
|
|
||||||
|
|
||||||
static void comAddToBuffer(char *data, uint16_t len);
|
static void comAddToBuffer(char *data, uint16_t len);
|
||||||
static void comBufferShow(void);
|
static void comBufferShow(void);
|
||||||
static void comModem(uint8_t c);
|
static void comModem(uint8_t c);
|
||||||
static void processEvent(void);
|
static void processEvent(void);
|
||||||
static void processNetworkEvent(void);
|
static void processNetworkEvent(void);
|
||||||
static void vbeScreenshot(void);
|
static uint32_t timerCallback(uint32_t interval, void *param);
|
||||||
|
static void vbeScreenshot(void);
|
||||||
|
|
||||||
|
|
||||||
long biostime(int cmd, long newtime) {
|
long biostime(int cmd, long newtime) {
|
||||||
|
@ -379,6 +380,28 @@ void keyStartup(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void linuxOsShutdown(void) {
|
||||||
|
// Stop timer.
|
||||||
|
SDL_RemoveTimer(_timerID);
|
||||||
|
|
||||||
|
// Stop network.
|
||||||
|
enet_deinitialize();
|
||||||
|
|
||||||
|
SDL_Quit();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void linuxOsStartup(void) {
|
||||||
|
SDL_Init(SDL_INIT_EVERYTHING);
|
||||||
|
|
||||||
|
// And networking/serial startup.
|
||||||
|
enet_initialize();
|
||||||
|
|
||||||
|
// We do timer startup here, too.
|
||||||
|
_timerID = SDL_AddTimer(TIMER_INTERVAL, timerCallback, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void mouseShutdown(void) {
|
void mouseShutdown(void) {
|
||||||
// Eh, don't care.
|
// Eh, don't care.
|
||||||
}
|
}
|
||||||
|
@ -463,8 +486,6 @@ static void processEvent(void) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
processNetworkEvent();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -472,7 +493,7 @@ static void processNetworkEvent(void) {
|
||||||
ENetEvent event = { 0 };
|
ENetEvent event = { 0 };
|
||||||
|
|
||||||
if (_host) {
|
if (_host) {
|
||||||
while (enet_host_service(_host, &event, 1) > 0) {
|
while (enet_host_service(_host, &event, 0) > 0) {
|
||||||
switch (event.type) {
|
switch (event.type) {
|
||||||
case ENET_EVENT_TYPE_CONNECT:
|
case ENET_EVENT_TYPE_CONNECT:
|
||||||
_connected = 1;
|
_connected = 1;
|
||||||
|
@ -497,9 +518,11 @@ static void processNetworkEvent(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint32_t timerCallback(uint32_t interval, void *param) {
|
static uint32_t timerCallback(uint32_t interval, void *param) {
|
||||||
(void)param;
|
(void)param;
|
||||||
|
|
||||||
|
processNetworkEvent();
|
||||||
|
|
||||||
_timerTicks++;
|
_timerTicks++;
|
||||||
if (_timerTicks > TICKS_PER_DAY) {
|
if (_timerTicks > TICKS_PER_DAY) {
|
||||||
_timerTicks = 0;
|
_timerTicks = 0;
|
||||||
|
@ -550,15 +573,8 @@ void vbePresent(void) {
|
||||||
SDL_RenderCopy(_renderer, _texture, NULL, NULL);
|
SDL_RenderCopy(_renderer, _texture, NULL, NULL);
|
||||||
SDL_RenderPresent(_renderer);
|
SDL_RenderPresent(_renderer);
|
||||||
|
|
||||||
if (_host) {
|
// Throttle this to some sane frame rate.
|
||||||
// Throttle this to some sane frame rate by checking for network events.
|
SDL_Delay(32);
|
||||||
for (temp=0; temp<32; temp++) {
|
|
||||||
processNetworkEvent();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// No network activity. Just sleep.
|
|
||||||
SDL_Delay(32);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_takeScreenshot) {
|
if (_takeScreenshot) {
|
||||||
_takeScreenshot = 0;
|
_takeScreenshot = 0;
|
||||||
|
@ -620,14 +636,6 @@ int16_t vbeShutdown(void) {
|
||||||
_window = NULL;
|
_window = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stop network.
|
|
||||||
enet_deinitialize();
|
|
||||||
|
|
||||||
// Stop timer.
|
|
||||||
SDL_RemoveTimer(_timerID);
|
|
||||||
|
|
||||||
SDL_Quit();
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -638,8 +646,6 @@ uint8_t vbeStartup(uint16_t xRes, uint16_t yRes, uint8_t bpp) {
|
||||||
|
|
||||||
_windowScale = 3;
|
_windowScale = 3;
|
||||||
|
|
||||||
SDL_Init(SDL_INIT_EVERYTHING);
|
|
||||||
|
|
||||||
_window = SDL_CreateWindow("GUI Test", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, xRes, yRes, SDL_WINDOW_ALLOW_HIGHDPI);
|
_window = SDL_CreateWindow("GUI Test", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, xRes, yRes, SDL_WINDOW_ALLOW_HIGHDPI);
|
||||||
_surface = SDL_GetWindowSurface(_window);
|
_surface = SDL_GetWindowSurface(_window);
|
||||||
_renderer = SDL_CreateRenderer(_window, -1, SDL_RENDERER_ACCELERATED);
|
_renderer = SDL_CreateRenderer(_window, -1, SDL_RENDERER_ACCELERATED);
|
||||||
|
@ -651,12 +657,6 @@ uint8_t vbeStartup(uint16_t xRes, uint16_t yRes, uint8_t bpp) {
|
||||||
_width = xRes;
|
_width = xRes;
|
||||||
_height = yRes;
|
_height = yRes;
|
||||||
|
|
||||||
// We do timer startup here, too.
|
|
||||||
_timerID = SDL_AddTimer(TIMER_INTERVAL, timerCallback, NULL);
|
|
||||||
|
|
||||||
// And networking/serial startup.
|
|
||||||
enet_initialize();
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -97,26 +97,7 @@ static void setButtons(uint8_t enabled) {
|
||||||
|
|
||||||
|
|
||||||
static void taskDisconnect(void *nextTask) {
|
static void taskDisconnect(void *nextTask) {
|
||||||
PacketEncodeDataT encoded = { 0 };
|
netDisconnect();
|
||||||
int16_t timeout = 2;
|
|
||||||
|
|
||||||
// Tell server we're disconnecting.
|
|
||||||
encoded.packetType = PACKET_TYPE_CLIENT_SHUTDOWN;
|
|
||||||
encoded.control = PACKET_CONTROL_DAT;
|
|
||||||
encoded.channel = 0;
|
|
||||||
encoded.encrypt = 0;
|
|
||||||
packetEncode(__packetThreadData, &encoded, NULL, 0);
|
|
||||||
packetSend(__packetThreadData, &encoded);
|
|
||||||
|
|
||||||
// Snooze a bit for the packet to send.
|
|
||||||
while (timeout > 0) {
|
|
||||||
taskYield();
|
|
||||||
if (__timerQuarterSecondTick) timeout--;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shut down packet processing & COM port.
|
|
||||||
netShutdown();
|
|
||||||
comClose(__configData.serialCom - 1);
|
|
||||||
if (nextTask) taskCreate(taskWelcome, nextTask);
|
if (nextTask) taskCreate(taskWelcome, nextTask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,8 @@
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "runtime.h"
|
#include "runtime.h"
|
||||||
#include "comport.h"
|
#include "comport.h"
|
||||||
|
#include "network.h"
|
||||||
|
#include "firstrun.h"
|
||||||
|
|
||||||
#include "welcome.h"
|
#include "welcome.h"
|
||||||
#include "signup.h"
|
#include "signup.h"
|
||||||
|
@ -92,10 +94,6 @@ static void taskGuiEventLoop(void *data) {
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
FILE *cache = NULL;
|
|
||||||
char *line = NULL;
|
|
||||||
char *p = NULL;
|
|
||||||
|
|
||||||
#ifndef __linux__
|
#ifndef __linux__
|
||||||
// On DOS, display the contets of the log now that we're back in text mode.
|
// On DOS, display the contets of the log now that we're back in text mode.
|
||||||
char *logName = NULL;
|
char *logName = NULL;
|
||||||
|
@ -104,6 +102,7 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
memoryStartup(argv[0]);
|
memoryStartup(argv[0]);
|
||||||
logOpenByHandle(memoryLogHandleGet());
|
logOpenByHandle(memoryLogHandleGet());
|
||||||
|
osStartup();
|
||||||
configStartup(argv[0]);
|
configStartup(argv[0]);
|
||||||
|
|
||||||
// 0 1 2 3 4 5 6 7 8
|
// 0 1 2 3 4 5 6 7 8
|
||||||
|
@ -121,6 +120,12 @@ int main(int argc, char *argv[]) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
timerStartup();
|
||||||
|
taskStartup();
|
||||||
|
|
||||||
|
// Perform "first run" setup tasks.
|
||||||
|
firstRunCheckSetup();
|
||||||
|
|
||||||
// Do we have the video mode they asked for?
|
// Do we have the video mode they asked for?
|
||||||
if (vbeStartup(__configData.videoWidth, __configData.videoHeight, __configData.videoDepth)) {
|
if (vbeStartup(__configData.videoWidth, __configData.videoHeight, __configData.videoDepth)) {
|
||||||
configShutdown();
|
configShutdown();
|
||||||
|
@ -131,54 +136,8 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
surfaceStartup();
|
surfaceStartup();
|
||||||
mouseStartup();
|
mouseStartup();
|
||||||
timerStartup();
|
|
||||||
guiStartup();
|
guiStartup();
|
||||||
taskStartup();
|
// Do not call netStartup() here. It will be started when needed.
|
||||||
|
|
||||||
__packetThreadData = packetThreadDataCreate(NULL);
|
|
||||||
packetSenderRegister(comPacketSender);
|
|
||||||
|
|
||||||
__runtimeData.integers = NULL;
|
|
||||||
__runtimeData.strings = NULL;
|
|
||||||
__runtimeData.protocolVersion = 0;
|
|
||||||
|
|
||||||
sh_new_strdup(__runtimeData.integers);
|
|
||||||
sh_new_strdup(__runtimeData.strings);
|
|
||||||
|
|
||||||
// ***TODO*** Default initial tables
|
|
||||||
|
|
||||||
mkdir("cache", 0777);
|
|
||||||
line = (char *)malloc(4096);
|
|
||||||
if (line) {
|
|
||||||
// Load string cache.
|
|
||||||
cache = fopen("cache/string.dat", "rt");
|
|
||||||
if (cache) {
|
|
||||||
while (fscanf(cache, "%s\n", line) != EOF) {
|
|
||||||
p = strstr(line, "=");
|
|
||||||
if (p) {
|
|
||||||
*p = 0;
|
|
||||||
p++;
|
|
||||||
shput(__runtimeData.strings, line, strdup(p));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fclose(cache);
|
|
||||||
}
|
|
||||||
// Load integer cache.
|
|
||||||
cache = fopen("cache/integer.dat", "rt");
|
|
||||||
if (cache) {
|
|
||||||
while (fscanf(cache, "%s\n", line) != EOF) {
|
|
||||||
p = strstr(line, "=");
|
|
||||||
if (p) {
|
|
||||||
*p = 0;
|
|
||||||
p++;
|
|
||||||
shput(__runtimeData.integers, line, atol(p));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fclose(cache);
|
|
||||||
}
|
|
||||||
free(line);
|
|
||||||
line = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// taskCreate(taskSignUp, NULL);
|
// taskCreate(taskSignUp, NULL);
|
||||||
taskCreate(taskWelcome, NULL);
|
taskCreate(taskWelcome, NULL);
|
||||||
|
@ -186,44 +145,15 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
taskRun();
|
taskRun();
|
||||||
|
|
||||||
// Save & free integer table.
|
netShutdown();
|
||||||
cache = fopen("cache/integer.dat", "wt");
|
|
||||||
if (cache) {
|
|
||||||
if (__runtimeData.integers) {
|
|
||||||
while (shlen(__runtimeData.integers) > 0) {
|
|
||||||
//logWrite("[%s]=[%d]\n", __runtimeData.integers[0].key, __runtimeData.integers[0].value);
|
|
||||||
fprintf(cache, "%s=%d\n", __runtimeData.integers[0].key, __runtimeData.integers[0].value);
|
|
||||||
shdel(__runtimeData.integers, __runtimeData.integers[0].key);
|
|
||||||
}
|
|
||||||
shfree(__runtimeData.integers);
|
|
||||||
}
|
|
||||||
fclose(cache);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save & free string table.
|
|
||||||
cache = fopen("cache/string.dat", "wt");
|
|
||||||
if (cache) {
|
|
||||||
if (__runtimeData.strings) {
|
|
||||||
while (shlen(__runtimeData.strings) > 0) {
|
|
||||||
//logWrite("[%s]=[%s]\n", __runtimeData.strings[0].key, __runtimeData.strings[0].value);
|
|
||||||
fprintf(cache, "%s=%s\n", __runtimeData.strings[0].key, __runtimeData.strings[0].value);
|
|
||||||
DEL(__runtimeData.strings[0].value);
|
|
||||||
shdel(__runtimeData.strings, __runtimeData.strings[0].key);
|
|
||||||
}
|
|
||||||
shfree(__runtimeData.strings);
|
|
||||||
}
|
|
||||||
fclose(cache);
|
|
||||||
}
|
|
||||||
|
|
||||||
packetThreadDataDestroy(&__packetThreadData);
|
|
||||||
|
|
||||||
taskShutdown();
|
|
||||||
guiShutdown();
|
guiShutdown();
|
||||||
timerShutdown();
|
|
||||||
mouseShutdown();
|
mouseShutdown();
|
||||||
surfaceShutdown();
|
surfaceShutdown();
|
||||||
vbeShutdown();
|
vbeShutdown();
|
||||||
|
taskShutdown();
|
||||||
|
timerShutdown();
|
||||||
configShutdown();
|
configShutdown();
|
||||||
|
osShutdown();
|
||||||
logClose();
|
logClose();
|
||||||
memoryShutdown();
|
memoryShutdown();
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#include "comport.h"
|
#include "comport.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
|
#include "runtime.h"
|
||||||
|
|
||||||
#include "network.h"
|
#include "network.h"
|
||||||
|
|
||||||
|
@ -35,6 +36,157 @@ typedef struct NetworkPacketS {
|
||||||
|
|
||||||
static NetworkPacketT *_packets = NULL;
|
static NetworkPacketT *_packets = NULL;
|
||||||
static uint8_t _netRunning = 0;
|
static uint8_t _netRunning = 0;
|
||||||
|
static uint8_t _netStarted = 0;
|
||||||
|
|
||||||
|
|
||||||
|
int8_t netConnectStep1(void) {
|
||||||
|
int32_t r = 0;
|
||||||
|
char buffer[1024] = { 0 };
|
||||||
|
|
||||||
|
// Open COM port.
|
||||||
|
r = comOpen(__configData.serialCom - 1, 57600L, 8, 'n', 1, SER_HANDSHAKING_RTSCTS);
|
||||||
|
if (r != SER_SUCCESS) return NETWORK_CONNECT_OPEN_FAILED;
|
||||||
|
// Send a CR to clear anything in the modem.
|
||||||
|
snprintf(buffer, 1023, "%c", 13);
|
||||||
|
comWrite(__configData.serialCom - 1, buffer, strlen(buffer));
|
||||||
|
// Wait roughly a second for anything.
|
||||||
|
comWaitWithTimeout(__configData.serialCom - 1, buffer, 1023, 4, "weExpectNothing");
|
||||||
|
// Send actual init
|
||||||
|
snprintf(buffer, 1023, "%s%c", "AT+SOCK1", 13);
|
||||||
|
comWrite(__configData.serialCom - 1, buffer, strlen(buffer));
|
||||||
|
// Wait roughly a second for "OK".
|
||||||
|
r = comWaitWithTimeout(__configData.serialCom - 1, buffer, 1023, 4, "OK");
|
||||||
|
if (r <= 0) {
|
||||||
|
comClose(__configData.serialCom - 1);
|
||||||
|
return NETWORK_CONNECT_BAD_MODEM;
|
||||||
|
}
|
||||||
|
// Flush COM port.
|
||||||
|
timerQuarterSecondsWait(4);
|
||||||
|
comReceiveBufferFlush(__configData.serialCom - 1);
|
||||||
|
|
||||||
|
return NETWORK_CONNECT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int8_t netConnectStep2(void) {
|
||||||
|
int32_t r = 0;
|
||||||
|
char buffer[1024] = { 0 };
|
||||||
|
PacketDecodeDataT *decoded = NULL;
|
||||||
|
PacketEncodeDataT encoded = { 0 };
|
||||||
|
uint8_t waiting = 1;
|
||||||
|
int16_t timeout = 0;
|
||||||
|
|
||||||
|
snprintf(buffer, 1023, "ATDT%s:%d%c", __configData.serverHost, __configData.serverPort, 13);
|
||||||
|
comWrite(__configData.serialCom - 1, buffer, strlen(buffer));
|
||||||
|
// Wait 7 seconds for welcome banner.
|
||||||
|
r = comWaitWithTimeout(__configData.serialCom - 1, buffer, 1023, 4 * 7, "KPMPGSMKII\r");
|
||||||
|
if (r <= 0) {
|
||||||
|
comClose(__configData.serialCom - 1);
|
||||||
|
return NETWORK_CONNECT_NO_CARRIER;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start packet handler and negotiate encryption.
|
||||||
|
netStartup();
|
||||||
|
packetEncryptionSetup(__packetThreadData);
|
||||||
|
timeout = 5;
|
||||||
|
do {
|
||||||
|
if (packetEncryptionReady()) break;
|
||||||
|
taskYield();
|
||||||
|
if (__timerSecondTick) timeout--;
|
||||||
|
} while (!guiHasStopped() && timeout >= 0);
|
||||||
|
if (timeout < 0) {
|
||||||
|
comClose(__configData.serialCom - 1);
|
||||||
|
return NETWORK_CONNECT_BAD_ENCRYPTION;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ***TODO*** Should probably cleanly handle a full server here with some kind of SERVER_FULL packet.
|
||||||
|
|
||||||
|
// Wait for version and table packets to arrive.
|
||||||
|
timeout = 10;
|
||||||
|
do {
|
||||||
|
decoded = netGetPacket(0);
|
||||||
|
if (decoded) {
|
||||||
|
switch (decoded->packetType) {
|
||||||
|
case PACKET_TYPE_NUMBER:
|
||||||
|
// Store in number table.
|
||||||
|
shput(__runtimeData.integers, &decoded->data[4], (int32_t)decoded->data[0]);
|
||||||
|
// Reset timeout.
|
||||||
|
timeout = 10;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PACKET_TYPE_PROCEED:
|
||||||
|
waiting = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PACKET_TYPE_STRING:
|
||||||
|
// Store in string table.
|
||||||
|
//logWrite("Storing [%s]=[%s]\n", decoded->data, &decoded->data[strlen(decoded->data) + 1]);
|
||||||
|
shput(__runtimeData.strings, decoded->data, strdup(&decoded->data[strlen(decoded->data) + 1]));
|
||||||
|
// Reset timeout.
|
||||||
|
timeout = 10;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PACKET_TYPE_VERSION:
|
||||||
|
packetContentUnpack(decoded->data, "i", &__runtimeData.protocolVersion);
|
||||||
|
// Do we need to update?
|
||||||
|
if (PACKET_PROTOCOL_VERSION == __runtimeData.protocolVersion) {
|
||||||
|
// Nope, we're good.
|
||||||
|
encoded.packetType = PACKET_TYPE_VERSION_OKAY;
|
||||||
|
} else {
|
||||||
|
// Version mismatch - upgrade time!
|
||||||
|
encoded.packetType = PACKET_TYPE_VERSION_BAD;
|
||||||
|
//***TODO***
|
||||||
|
}
|
||||||
|
encoded.control = PACKET_CONTROL_DAT;
|
||||||
|
encoded.channel = 0;
|
||||||
|
encoded.encrypt = 0;
|
||||||
|
packetEncode(__packetThreadData, &encoded, NULL, 0);
|
||||||
|
// Send GOOD or BAD.
|
||||||
|
packetSend(__packetThreadData, &encoded);
|
||||||
|
// Reset timeout.
|
||||||
|
timeout = 10;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
logWrite("Unexpected packet received: %d\n", decoded->packetType);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
packetDecodeDataDestroy(&decoded);
|
||||||
|
}
|
||||||
|
taskYield();
|
||||||
|
if (__timerSecondTick) timeout--;
|
||||||
|
} while (!guiHasStopped() && timeout >= 0 && waiting);
|
||||||
|
if (timeout < 0) {
|
||||||
|
comClose(__configData.serialCom - 1);
|
||||||
|
return NETWORK_CONNECT_BAD_SETTINGS;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NETWORK_CONNECT_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void netDisconnect(void) {
|
||||||
|
PacketEncodeDataT encoded = { 0 };
|
||||||
|
int16_t timeout = 2;
|
||||||
|
|
||||||
|
// Tell server we're disconnecting.
|
||||||
|
encoded.packetType = PACKET_TYPE_CLIENT_SHUTDOWN;
|
||||||
|
encoded.control = PACKET_CONTROL_DAT;
|
||||||
|
encoded.channel = 0;
|
||||||
|
encoded.encrypt = 0;
|
||||||
|
packetEncode(__packetThreadData, &encoded, NULL, 0);
|
||||||
|
packetSend(__packetThreadData, &encoded);
|
||||||
|
|
||||||
|
// Snooze a bit for the packet to send.
|
||||||
|
while (timeout > 0) {
|
||||||
|
taskYield();
|
||||||
|
if (__timerQuarterSecondTick) timeout--;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Shut down packet processing & COM port.
|
||||||
|
netShutdown();
|
||||||
|
comClose(__configData.serialCom - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
uint8_t netGetChannelFree(void) {
|
uint8_t netGetChannelFree(void) {
|
||||||
|
@ -67,11 +219,98 @@ PacketDecodeDataT *netGetPacket(uint8_t channel) {
|
||||||
|
|
||||||
|
|
||||||
void netShutdown(void) {
|
void netShutdown(void) {
|
||||||
|
FILE *cache = NULL;
|
||||||
|
|
||||||
|
if (_netStarted) {
|
||||||
|
_netStarted = 0;
|
||||||
|
|
||||||
|
// Save & free integer table.
|
||||||
|
cache = fopen("cache/integer.dat", "wt");
|
||||||
|
if (cache) {
|
||||||
|
if (__runtimeData.integers) {
|
||||||
|
while (shlen(__runtimeData.integers) > 0) {
|
||||||
|
//logWrite("[%s]=[%d]\n", __runtimeData.integers[0].key, __runtimeData.integers[0].value);
|
||||||
|
fprintf(cache, "%s=%d\n", __runtimeData.integers[0].key, __runtimeData.integers[0].value);
|
||||||
|
shdel(__runtimeData.integers, __runtimeData.integers[0].key);
|
||||||
|
}
|
||||||
|
shfree(__runtimeData.integers);
|
||||||
|
}
|
||||||
|
fclose(cache);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save & free string table.
|
||||||
|
cache = fopen("cache/string.dat", "wt");
|
||||||
|
if (cache) {
|
||||||
|
if (__runtimeData.strings) {
|
||||||
|
while (shlen(__runtimeData.strings) > 0) {
|
||||||
|
//logWrite("[%s]=[%s]\n", __runtimeData.strings[0].key, __runtimeData.strings[0].value);
|
||||||
|
fprintf(cache, "%s=%s\n", __runtimeData.strings[0].key, __runtimeData.strings[0].value);
|
||||||
|
DEL(__runtimeData.strings[0].value);
|
||||||
|
shdel(__runtimeData.strings, __runtimeData.strings[0].key);
|
||||||
|
}
|
||||||
|
shfree(__runtimeData.strings);
|
||||||
|
}
|
||||||
|
fclose(cache);
|
||||||
|
}
|
||||||
|
|
||||||
|
packetThreadDataDestroy(&__packetThreadData);
|
||||||
|
}
|
||||||
|
|
||||||
_netRunning = 0;
|
_netRunning = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void netStartup(void) {
|
void netStartup(void) {
|
||||||
|
FILE *cache = NULL;
|
||||||
|
char *line = NULL;
|
||||||
|
char *p = NULL;
|
||||||
|
|
||||||
|
_netStarted = 1;
|
||||||
|
|
||||||
|
__packetThreadData = packetThreadDataCreate(NULL);
|
||||||
|
packetSenderRegister(comPacketSender);
|
||||||
|
|
||||||
|
__runtimeData.integers = NULL;
|
||||||
|
__runtimeData.strings = NULL;
|
||||||
|
__runtimeData.protocolVersion = 0;
|
||||||
|
|
||||||
|
sh_new_strdup(__runtimeData.integers);
|
||||||
|
sh_new_strdup(__runtimeData.strings);
|
||||||
|
|
||||||
|
// ***TODO*** Default initial tables
|
||||||
|
|
||||||
|
line = (char *)malloc(4096);
|
||||||
|
if (line) {
|
||||||
|
// Load string cache.
|
||||||
|
cache = fopen("cache/string.dat", "rt");
|
||||||
|
if (cache) {
|
||||||
|
while (fscanf(cache, "%s\n", line) != EOF) {
|
||||||
|
p = strstr(line, "=");
|
||||||
|
if (p) {
|
||||||
|
*p = 0;
|
||||||
|
p++;
|
||||||
|
shput(__runtimeData.strings, line, strdup(p));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose(cache);
|
||||||
|
}
|
||||||
|
// Load integer cache.
|
||||||
|
cache = fopen("cache/integer.dat", "rt");
|
||||||
|
if (cache) {
|
||||||
|
while (fscanf(cache, "%s\n", line) != EOF) {
|
||||||
|
p = strstr(line, "=");
|
||||||
|
if (p) {
|
||||||
|
*p = 0;
|
||||||
|
p++;
|
||||||
|
shput(__runtimeData.integers, line, atol(p));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose(cache);
|
||||||
|
}
|
||||||
|
free(line);
|
||||||
|
line = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
taskCreate(taskNetwork, NULL);
|
taskCreate(taskNetwork, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,17 @@
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define NETWORK_CONNECT_SUCCESS 0
|
||||||
|
#define NETWORK_CONNECT_OPEN_FAILED 1
|
||||||
|
#define NETWORK_CONNECT_BAD_MODEM 2
|
||||||
|
#define NETWORK_CONNECT_NO_CARRIER 3
|
||||||
|
#define NETWORK_CONNECT_BAD_ENCRYPTION 4
|
||||||
|
#define NETWORK_CONNECT_BAD_SETTINGS 5
|
||||||
|
|
||||||
|
|
||||||
|
int8_t netConnectStep1(void);
|
||||||
|
int8_t netConnectStep2(void);
|
||||||
|
void netDisconnect(void);
|
||||||
uint8_t netGetChannelFree(void);
|
uint8_t netGetChannelFree(void);
|
||||||
PacketDecodeDataT *netGetPacket(uint8_t channel);
|
PacketDecodeDataT *netGetPacket(uint8_t channel);
|
||||||
void netShutdown(void);
|
void netShutdown(void);
|
||||||
|
|
|
@ -95,30 +95,12 @@ static void btnOkayClick(WidgetT *widget) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void taskSettings(void *data) {
|
int8_t settingsScanComPorts(void) {
|
||||||
|
char buffer[1024] = { 0 };
|
||||||
int32_t rc;
|
uint8_t selected = 1;
|
||||||
uint32_t len;
|
int32_t rc = 0;
|
||||||
char buffer[1024];
|
uint32_t len = 0;
|
||||||
uint8_t selected = 1;
|
int8_t lastFound = -1;
|
||||||
|
|
||||||
_done = (widgetCallback)data;
|
|
||||||
|
|
||||||
TagItemT uiDetecting[] = {
|
|
||||||
T_START,
|
|
||||||
T_WINDOW, O(_winDetecting),
|
|
||||||
T_TITLE, P("Detecting Modems"),
|
|
||||||
T_WIDTH, 200, T_HEIGHT, 100,
|
|
||||||
T_LABEL, O(_lblOneMoment),
|
|
||||||
T_X, 25, T_Y, 25,
|
|
||||||
T_TITLE, P("One Moment Please!"),
|
|
||||||
T_LABEL, T_DONE,
|
|
||||||
T_WINDOW, T_DONE,
|
|
||||||
T_END
|
|
||||||
};
|
|
||||||
|
|
||||||
tagListRun(uiDetecting);
|
|
||||||
taskYield(); // Cause dialog to paint.
|
|
||||||
|
|
||||||
// Scan the COM ports for a compatable modem.
|
// Scan the COM ports for a compatable modem.
|
||||||
for (int x=0; x<4; x++) {
|
for (int x=0; x<4; x++) {
|
||||||
|
@ -134,7 +116,8 @@ void taskSettings(void *data) {
|
||||||
_port[x].status = PORT_GOOD_MODEM;
|
_port[x].status = PORT_GOOD_MODEM;
|
||||||
_port[x].selected = selected;
|
_port[x].selected = selected;
|
||||||
_port[x].enabled = 1;
|
_port[x].enabled = 1;
|
||||||
selected = 0;
|
selected = 0;
|
||||||
|
lastFound = x;
|
||||||
} else {
|
} else {
|
||||||
if (strstr(buffer, "ERROR")) {
|
if (strstr(buffer, "ERROR")) {
|
||||||
snprintf(_port[x].title, TITLE_LEN - 1, "COM%d - Incompatable Modem", x + 1);
|
snprintf(_port[x].title, TITLE_LEN - 1, "COM%d - Incompatable Modem", x + 1);
|
||||||
|
@ -157,6 +140,35 @@ void taskSettings(void *data) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return lastFound;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void taskSettings(void *data) {
|
||||||
|
|
||||||
|
int32_t rc;
|
||||||
|
uint32_t len;
|
||||||
|
|
||||||
|
_done = (widgetCallback)data;
|
||||||
|
|
||||||
|
TagItemT uiDetecting[] = {
|
||||||
|
T_START,
|
||||||
|
T_WINDOW, O(_winDetecting),
|
||||||
|
T_TITLE, P("Detecting Modems"),
|
||||||
|
T_WIDTH, 200, T_HEIGHT, 100,
|
||||||
|
T_LABEL, O(_lblOneMoment),
|
||||||
|
T_X, 25, T_Y, 25,
|
||||||
|
T_TITLE, P("One Moment Please!"),
|
||||||
|
T_LABEL, T_DONE,
|
||||||
|
T_WINDOW, T_DONE,
|
||||||
|
T_END
|
||||||
|
};
|
||||||
|
|
||||||
|
tagListRun(uiDetecting);
|
||||||
|
taskYield(); // Cause dialog to paint.
|
||||||
|
|
||||||
|
settingsScanComPorts();
|
||||||
|
|
||||||
guiDelete(D(_winDetecting));
|
guiDelete(D(_winDetecting));
|
||||||
|
|
||||||
TagItemT uiSettings[] = {
|
TagItemT uiSettings[] = {
|
||||||
|
|
|
@ -25,7 +25,8 @@
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
|
|
||||||
void taskSettings(void *data);
|
int8_t settingsScanComPorts(void);
|
||||||
|
void taskSettings(void *data);
|
||||||
|
|
||||||
|
|
||||||
#endif // SETTINGS_H
|
#endif // SETTINGS_H
|
||||||
|
|
|
@ -21,3 +21,15 @@
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
|
|
||||||
|
void osShutdown(void) {
|
||||||
|
#ifdef __linux__
|
||||||
|
linuxOsShutdown();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void osStartup(void) {
|
||||||
|
#ifdef __linux__
|
||||||
|
linuxOsStartup();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
|
@ -44,6 +44,10 @@
|
||||||
// Linux DOS replacements.
|
// Linux DOS replacements.
|
||||||
long biostime(int cmd, long newtime);
|
long biostime(int cmd, long newtime);
|
||||||
|
|
||||||
|
// Linux support functions.
|
||||||
|
void linuxOsShutdown(void);
|
||||||
|
void linuxOsStartup(void);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define BITS32
|
#define BITS32
|
||||||
|
@ -74,6 +78,9 @@ long biostime(int cmd, long newtime);
|
||||||
#define NEW(t,v) (v)=(t*)malloc(sizeof(t))
|
#define NEW(t,v) (v)=(t*)malloc(sizeof(t))
|
||||||
#define DEL(v) {free(v); v=NULL;}
|
#define DEL(v) {free(v); v=NULL;}
|
||||||
|
|
||||||
|
#define SUCCESS 1
|
||||||
|
#define FAIL 0
|
||||||
|
|
||||||
// Some helper defines.
|
// Some helper defines.
|
||||||
#define DIVISIBLE_BY_EIGHT(x) ((((x) >> 3) << 3) == (x))
|
#define DIVISIBLE_BY_EIGHT(x) ((((x) >> 3) << 3) == (x))
|
||||||
#define HIGH_BYTE(b) ((uint8_t)(((b) & 0xFF00) >> 8))
|
#define HIGH_BYTE(b) ((uint8_t)(((b) & 0xFF00) >> 8))
|
||||||
|
@ -86,4 +93,8 @@ typedef struct PacketThreadDataS PacketThreadDataT;
|
||||||
extern PacketThreadDataT *__packetThreadData; // Declared in main.c
|
extern PacketThreadDataT *__packetThreadData; // Declared in main.c
|
||||||
|
|
||||||
|
|
||||||
|
void osShutdown(void);
|
||||||
|
void osStartup(void);
|
||||||
|
|
||||||
|
|
||||||
#endif // OS_H
|
#endif // OS_H
|
||||||
|
|
|
@ -28,7 +28,6 @@
|
||||||
#include "comport.h"
|
#include "comport.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
#include "network.h"
|
#include "network.h"
|
||||||
#include "runtime.h"
|
|
||||||
|
|
||||||
#include "window.h"
|
#include "window.h"
|
||||||
#include "picture.h"
|
#include "picture.h"
|
||||||
|
@ -78,156 +77,6 @@ static void btnMsgBoxQuit(MsgBoxButtonT button) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void taskConnectClick(void *data) {
|
|
||||||
int32_t r = 0;
|
|
||||||
char buffer[1024] = { 0 };
|
|
||||||
PacketDecodeDataT *decoded = NULL;
|
|
||||||
PacketEncodeDataT encoded = { 0 };
|
|
||||||
int16_t timeout = 0;
|
|
||||||
uint8_t waiting = 1;
|
|
||||||
|
|
||||||
(void)data;
|
|
||||||
|
|
||||||
// Ghost all buttons.
|
|
||||||
widgetEnableSet(W(_btnConnect), 0);
|
|
||||||
widgetEnableSet(W(_btnSettings), 0);
|
|
||||||
widgetEnableSet(W(_btnQuit), 0);
|
|
||||||
|
|
||||||
// Hide welcome banner, show init.
|
|
||||||
widgetVisibleSet(W(_picLogo), 0);
|
|
||||||
widgetVisibleSet(W(_picInit), 1);
|
|
||||||
taskYield();
|
|
||||||
|
|
||||||
// Open COM port.
|
|
||||||
r = comOpen(__configData.serialCom - 1, 57600L, 8, 'n', 1, SER_HANDSHAKING_RTSCTS);
|
|
||||||
if (r != SER_SUCCESS) {
|
|
||||||
msgBoxOne("COM Problem", MSGBOX_ICON_ERROR, "Unable to open COM port!\nPlease check settings.", "Okay", btnMsgBox);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Send a CR to clear anything in the modem.
|
|
||||||
snprintf(buffer, 1023, "%c", 13);
|
|
||||||
comWrite(__configData.serialCom - 1, buffer, strlen(buffer));
|
|
||||||
// Wait roughly a second for anything.
|
|
||||||
comWaitWithTimeout(__configData.serialCom - 1, buffer, 1023, 4, "weExpectNothing");
|
|
||||||
// Send actual init
|
|
||||||
snprintf(buffer, 1023, "%s%c", "AT+SOCK1", 13);
|
|
||||||
comWrite(__configData.serialCom - 1, buffer, strlen(buffer));
|
|
||||||
// Wait roughly a second for "OK".
|
|
||||||
r = comWaitWithTimeout(__configData.serialCom - 1, buffer, 1023, 4, "OK");
|
|
||||||
if (r <= 0) {
|
|
||||||
comClose(__configData.serialCom - 1);
|
|
||||||
msgBoxOne("Modem Problem", MSGBOX_ICON_ERROR, "Modem does not support ENET!\nPlease check settings.", "Okay", btnMsgBox);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Flush COM port.
|
|
||||||
timerQuarterSecondsWait(4);
|
|
||||||
comReceiveBufferFlush(__configData.serialCom - 1);
|
|
||||||
|
|
||||||
// Show dialing, dial service.
|
|
||||||
widgetVisibleSet(W(_picDialing), 1);
|
|
||||||
taskYield();
|
|
||||||
snprintf(buffer, 1023, "ATDT%s:%d%c", __configData.serverHost, __configData.serverPort, 13);
|
|
||||||
comWrite(__configData.serialCom - 1, buffer, strlen(buffer));
|
|
||||||
// Wait 7 seconds for welcome banner.
|
|
||||||
r = comWaitWithTimeout(__configData.serialCom - 1, buffer, 1023, 4 * 7, "KPMPGSMKII\r");
|
|
||||||
if (r <= 0) {
|
|
||||||
comClose(__configData.serialCom - 1);
|
|
||||||
msgBoxOne("No Connection", MSGBOX_ICON_INFORMATION, "Unable to connect to server!\nPlease check settings or try later.", "Okay", btnMsgBox);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start packet handler and negotiate encryption.
|
|
||||||
netStartup();
|
|
||||||
packetEncryptionSetup(__packetThreadData);
|
|
||||||
timeout = 5;
|
|
||||||
do {
|
|
||||||
if (packetEncryptionReady()) break;
|
|
||||||
taskYield();
|
|
||||||
if (__timerSecondTick) timeout--;
|
|
||||||
} while (!guiHasStopped() && timeout >= 0);
|
|
||||||
if (timeout < 0) {
|
|
||||||
comClose(__configData.serialCom - 1);
|
|
||||||
msgBoxOne("Negotiation Error", MSGBOX_ICON_INFORMATION, "Unable to negotiate encryption settings!", "Okay", btnMsgBox);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ***TODO*** Should probably cleanly handle a full server here with some kind of SERVER_FULL packet.
|
|
||||||
|
|
||||||
// Wait for version and table packets to arrive.
|
|
||||||
timeout = 10;
|
|
||||||
do {
|
|
||||||
decoded = netGetPacket(0);
|
|
||||||
if (decoded) {
|
|
||||||
switch (decoded->packetType) {
|
|
||||||
case PACKET_TYPE_NUMBER:
|
|
||||||
// Store in number table.
|
|
||||||
shput(__runtimeData.integers, &decoded->data[4], (int32_t)decoded->data[0]);
|
|
||||||
// Reset timeout.
|
|
||||||
timeout = 10;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PACKET_TYPE_PROCEED:
|
|
||||||
waiting = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PACKET_TYPE_STRING:
|
|
||||||
// Store in string table.
|
|
||||||
//logWrite("Storing [%s]=[%s]\n", decoded->data, &decoded->data[strlen(decoded->data) + 1]);
|
|
||||||
shput(__runtimeData.strings, decoded->data, strdup(&decoded->data[strlen(decoded->data) + 1]));
|
|
||||||
// Reset timeout.
|
|
||||||
timeout = 10;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PACKET_TYPE_VERSION:
|
|
||||||
packetContentUnpack(decoded->data, "i", &__runtimeData.protocolVersion);
|
|
||||||
// Do we need to update?
|
|
||||||
if (PACKET_PROTOCOL_VERSION == __runtimeData.protocolVersion) {
|
|
||||||
// Nope, we're good.
|
|
||||||
encoded.packetType = PACKET_TYPE_VERSION_OKAY;
|
|
||||||
} else {
|
|
||||||
// Version mismatch - upgrade time!
|
|
||||||
encoded.packetType = PACKET_TYPE_VERSION_BAD;
|
|
||||||
//***TODO***
|
|
||||||
}
|
|
||||||
encoded.control = PACKET_CONTROL_DAT;
|
|
||||||
encoded.channel = 0;
|
|
||||||
encoded.encrypt = 0;
|
|
||||||
packetEncode(__packetThreadData, &encoded, NULL, 0);
|
|
||||||
// Send GOOD or BAD.
|
|
||||||
packetSend(__packetThreadData, &encoded);
|
|
||||||
// Reset timeout.
|
|
||||||
timeout = 10;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
logWrite("Unexpected packet received: %d\n", decoded->packetType);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
packetDecodeDataDestroy(&decoded);
|
|
||||||
}
|
|
||||||
taskYield();
|
|
||||||
if (__timerSecondTick) timeout--;
|
|
||||||
} while (!guiHasStopped() && timeout >= 0 && waiting);
|
|
||||||
if (timeout < 0) {
|
|
||||||
comClose(__configData.serialCom - 1);
|
|
||||||
msgBoxOne("Negotiation Error", MSGBOX_ICON_INFORMATION, "Unable to fetch client settings!", "Okay", btnMsgBox);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Connected! Show icon.
|
|
||||||
widgetVisibleSet(W(_picConnect), 1);
|
|
||||||
timeout = 6; // Roughly 1.5 seconds.
|
|
||||||
while (timeout > 0 && !guiHasStopped()) {
|
|
||||||
taskYield();
|
|
||||||
if (__timerQuarterSecondTick) timeout--;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Switch to Login window.
|
|
||||||
guiDelete(D(_winWelcome));
|
|
||||||
taskCreate(taskLogin, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void btnQuitClick(WidgetT *widget) {
|
static void btnQuitClick(WidgetT *widget) {
|
||||||
(void)widget;
|
(void)widget;
|
||||||
setButtons(0);
|
setButtons(0);
|
||||||
|
@ -312,3 +161,61 @@ void taskWelcome(void *data) {
|
||||||
|
|
||||||
tagListRun(uiWelcome);
|
tagListRun(uiWelcome);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void taskConnectClick(void *data) {
|
||||||
|
int32_t r = 0;
|
||||||
|
int16_t timeout = 0;
|
||||||
|
|
||||||
|
(void)data;
|
||||||
|
|
||||||
|
// Ghost all buttons.
|
||||||
|
widgetEnableSet(W(_btnConnect), 0);
|
||||||
|
widgetEnableSet(W(_btnSettings), 0);
|
||||||
|
widgetEnableSet(W(_btnQuit), 0);
|
||||||
|
|
||||||
|
// Hide welcome banner, show init.
|
||||||
|
widgetVisibleSet(W(_picLogo), 0);
|
||||||
|
widgetVisibleSet(W(_picInit), 1);
|
||||||
|
taskYield();
|
||||||
|
|
||||||
|
r = netConnectStep1();
|
||||||
|
if (r == NETWORK_CONNECT_OPEN_FAILED) {
|
||||||
|
msgBoxOne("COM Problem", MSGBOX_ICON_ERROR, "Unable to open COM port!\nPlease check settings.", "Okay", btnMsgBox);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (r == NETWORK_CONNECT_BAD_MODEM) {
|
||||||
|
msgBoxOne("Modem Problem", MSGBOX_ICON_ERROR, "Modem does not support ENET!\nPlease check settings.", "Okay", btnMsgBox);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show dialing, dial service.
|
||||||
|
widgetVisibleSet(W(_picDialing), 1);
|
||||||
|
taskYield();
|
||||||
|
|
||||||
|
r = netConnectStep2();
|
||||||
|
if (r == NETWORK_CONNECT_NO_CARRIER) {
|
||||||
|
msgBoxOne("No Connection", MSGBOX_ICON_INFORMATION, "Unable to connect to server!\nPlease check settings or try later.", "Okay", btnMsgBox);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (r == NETWORK_CONNECT_BAD_ENCRYPTION) {
|
||||||
|
msgBoxOne("Negotiation Error", MSGBOX_ICON_INFORMATION, "Unable to negotiate encryption settings!", "Okay", btnMsgBox);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (r == NETWORK_CONNECT_BAD_SETTINGS) {
|
||||||
|
msgBoxOne("Negotiation Error", MSGBOX_ICON_INFORMATION, "Unable to fetch client settings!", "Okay", btnMsgBox);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Connected! Show icon.
|
||||||
|
widgetVisibleSet(W(_picConnect), 1);
|
||||||
|
timeout = 6; // Roughly 1.5 seconds.
|
||||||
|
while (timeout > 0 && !guiHasStopped()) {
|
||||||
|
taskYield();
|
||||||
|
if (__timerQuarterSecondTick) timeout--;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Switch to Login window.
|
||||||
|
guiDelete(D(_winWelcome));
|
||||||
|
taskCreate(taskLogin, NULL);
|
||||||
|
}
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
|
|
||||||
void taskWelcome(void *data);
|
void taskWelcome(void *data);
|
||||||
|
|
||||||
|
|
||||||
#endif // WELCOME_H
|
#endif // WELCOME_H
|
||||||
|
|
BIN
font/data/vga8x14.dat
(Stored with Git LFS)
Normal file
BIN
font/data/vga8x14.dat
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
font/data/vga8x16.dat
(Stored with Git LFS)
Normal file
BIN
font/data/vga8x16.dat
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
font/data/vga8x8.dat
(Stored with Git LFS)
Normal file
BIN
font/data/vga8x8.dat
(Stored with Git LFS)
Normal file
Binary file not shown.
|
@ -53,8 +53,8 @@ void makeFont(char *source, char *target, int pixelsW, int pixelsH, int charsW,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Provide some metadata for enhancement later.
|
// Provide some metadata for enhancement later.
|
||||||
fputc(pixelsW, out); // Width of characters
|
fputc(pixelsW, out); // Width of characters in pixels
|
||||||
fputc(pixelsH, out); // Height of characters
|
fputc(pixelsH, out); // Height of characters in pixels
|
||||||
fputc(charsW, out); // Number of characters per row
|
fputc(charsW, out); // Number of characters per row
|
||||||
fputc(charCount, out); // Number of characters - 1
|
fputc(charCount, out); // Number of characters - 1
|
||||||
|
|
||||||
|
@ -82,9 +82,9 @@ int main(int argc, char *argv[]) {
|
||||||
(void)argc;
|
(void)argc;
|
||||||
(void)argv;
|
(void)argv;
|
||||||
|
|
||||||
makeFont("/home/scott/code/kpmpgsmkii/font/data/vga8x8.png", "/home/scott/code/kpmpgsmkii/bin/data/vga8x8.dat", 8, 8, 16, 255);
|
makeFont("/home/scott/code/kpmpgsmkii/font/assets/vga8x8.png", "/home/scott/code/kpmpgsmkii/font/data/vga8x8.dat", 8, 8, 16, 255);
|
||||||
makeFont("/home/scott/code/kpmpgsmkii/font/data/vga8x14.png", "/home/scott/code/kpmpgsmkii/bin/data/vga8x14.dat", 8, 14, 16, 255);
|
makeFont("/home/scott/code/kpmpgsmkii/font/assets/vga8x14.png", "/home/scott/code/kpmpgsmkii/font/data/vga8x14.dat", 8, 14, 16, 255);
|
||||||
makeFont("/home/scott/code/kpmpgsmkii/font/data/vga8x16.png", "/home/scott/code/kpmpgsmkii/bin/data/vga8x16.dat", 8, 16, 16, 255);
|
makeFont("/home/scott/code/kpmpgsmkii/font/assets/vga8x16.png", "/home/scott/code/kpmpgsmkii/font/data/vga8x16.dat", 8, 16, 16, 255);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,11 +16,23 @@
|
||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
TEMPLATE = subdirs
|
TEMPLATE = subdirs
|
||||||
CONFIG *= ORDERED
|
CONFIG *= ORDERED
|
||||||
|
|
||||||
SUBDIRS = \
|
SUBDIRS = \
|
||||||
client \
|
client \
|
||||||
server
|
server
|
||||||
# font \
|
# font
|
||||||
# primes
|
# primes
|
||||||
|
|
||||||
|
OTHER_FILES = \
|
||||||
|
.gitattributes \
|
||||||
|
.gitignore \
|
||||||
|
buildPrerequisites.sh \
|
||||||
|
LICENSE \
|
||||||
|
Makefile.djgpp \
|
||||||
|
build.sh \
|
||||||
|
get-sql.sh \
|
||||||
|
test.conf \
|
||||||
|
test.sh
|
||||||
|
|
|
@ -221,14 +221,15 @@ json_object *restRequest(char *command, char *format, ...) {
|
||||||
//logWrite("Request: %s\n", json_object_to_json_string_ext(request, JSON_C_TO_STRING_PRETTY));
|
//logWrite("Request: %s\n", json_object_to_json_string_ext(request, JSON_C_TO_STRING_PRETTY));
|
||||||
response = restUrlPost(request);
|
response = restUrlPost(request);
|
||||||
json_object_put(request);
|
json_object_put(request);
|
||||||
logWrite("Response: %s\n", json_object_to_json_string_ext(response, JSON_C_TO_STRING_PRETTY));
|
//logWrite("Response: %s\n", json_object_to_json_string_ext(response, JSON_C_TO_STRING_PRETTY));
|
||||||
|
|
||||||
if (response) {
|
if (response) {
|
||||||
string = (char *)json_object_get_string(json_object_object_get(response, "result"));
|
string = (char *)json_object_get_string(json_object_object_get(response, "result"));
|
||||||
result = (string[0] == 't' || string[0] == 'T') ? 1 : 0;
|
result = (string[0] == 't' || string[0] == 'T') ? 1 : 0;
|
||||||
if (result) {
|
if (!result) {
|
||||||
logWrite("restRequest: %s\n", json_object_get_string(json_object_object_get(response, "reason")));
|
logWrite("restRequest: %s\n", json_object_get_string(json_object_object_get(response, "reason")));
|
||||||
json_object_put(response);
|
json_object_put(response);
|
||||||
|
response = NULL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
logWrite("restRequest: No response.\n");
|
logWrite("restRequest: No response.\n");
|
||||||
|
|
Loading…
Add table
Reference in a new issue