221 lines
5.4 KiB
C
221 lines
5.4 KiB
C
/*
|
|
* 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 "settings.h"
|
|
#include "welcome.h"
|
|
|
|
#include "taglist.h"
|
|
#include "task.h"
|
|
#include "comport.h"
|
|
#include "timer.h"
|
|
#include "config.h"
|
|
|
|
#include "window.h"
|
|
#include "button.h"
|
|
#include "frame.h"
|
|
#include "radio.h"
|
|
#include "textbox.h"
|
|
#include "updown.h"
|
|
#include "label.h"
|
|
|
|
|
|
#define GROUP_COM 1
|
|
|
|
#define PORT_NONE 0
|
|
#define PORT_NO_MODEM 1
|
|
#define PORT_BAD_MODEM 2
|
|
#define PORT_GOOD_MODEM 3
|
|
|
|
#define TITLE_LEN 80
|
|
|
|
|
|
typedef struct PortS {
|
|
uint8_t status;
|
|
char title[TITLE_LEN];
|
|
uint8_t selected;
|
|
uint8_t enabled;
|
|
RadioT *rdoCOM;
|
|
} PortT;
|
|
|
|
|
|
static WindowT *_winDetecting;
|
|
static LabelT *_lblOneMoment;
|
|
static WindowT *_winSettings;
|
|
static FrameT *_frmComPorts;
|
|
static FrameT *_frmServer;
|
|
static ButtonT *_btnOkay;
|
|
static TextboxT *_txtServer;
|
|
static UpdownT *_updPort;
|
|
static PortT _port[4];
|
|
static widgetCallback _done;
|
|
|
|
|
|
static void btnOkayClick(WidgetT *widget);
|
|
|
|
|
|
static void btnOkayClick(WidgetT *widget) {
|
|
uint8_t x;
|
|
RadioT *selected = radioSelectedGet(_port[0].rdoCOM);
|
|
|
|
(void)widget;
|
|
|
|
// Save selected COM port.
|
|
for (x=0; x<4; x++) {
|
|
if (selected == _port[x].rdoCOM) {
|
|
__configData.serialCom = x + 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Save server info.
|
|
free(__configData.serverHost);
|
|
__configData.serverHost = strdup(textboxValueGet(_txtServer));
|
|
__configData.serverPort = updownValueGet(_updPort);
|
|
|
|
// Return to calling routine.
|
|
guiDelete(D(_winSettings));
|
|
_done(NULL);
|
|
}
|
|
|
|
|
|
void taskSettings(void *data) {
|
|
|
|
int32_t rc;
|
|
uint32_t len;
|
|
char buffer[1024];
|
|
uint8_t selected = 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.
|
|
for (int x=0; x<4; x++) {
|
|
rc = comOpen(x, 57600L, 8, 'n', 1, SER_HANDSHAKING_RTSCTS);
|
|
if (rc == SER_SUCCESS) {
|
|
snprintf(buffer, 1023, "%s%c", "AT+SOCK1", 13);
|
|
comWrite(x, buffer, strlen(buffer));
|
|
timerQuarterSecondsWait(4);
|
|
len = comRead(x, buffer, 1023);
|
|
buffer[len] = 0;
|
|
if (strstr(buffer, "OK")) {
|
|
snprintf(_port[x].title, TITLE_LEN - 1, "COM%d - SoftModem Found!", x + 1);
|
|
_port[x].status = PORT_GOOD_MODEM;
|
|
_port[x].selected = selected;
|
|
_port[x].enabled = 1;
|
|
selected = 0;
|
|
} else {
|
|
if (strstr(buffer, "ERROR")) {
|
|
snprintf(_port[x].title, TITLE_LEN - 1, "COM%d - Incompatable Modem", x + 1);
|
|
_port[x].status = PORT_BAD_MODEM;
|
|
_port[x].selected = 0;
|
|
_port[x].enabled = 0;
|
|
} else {
|
|
snprintf(_port[x].title, TITLE_LEN - 1, "COM%d - No Modem", x + 1);
|
|
_port[x].status = PORT_NO_MODEM;
|
|
_port[x].selected = 0;
|
|
_port[x].enabled = 0;
|
|
}
|
|
}
|
|
comClose(x);
|
|
} else {
|
|
snprintf(_port[x].title, TITLE_LEN - 1, "COM%d - Not Present", x + 1);
|
|
_port[x].status = PORT_NONE;
|
|
_port[x].selected = 0;
|
|
_port[x].enabled = 0;
|
|
}
|
|
}
|
|
|
|
guiDelete(D(_winDetecting));
|
|
|
|
TagItemT uiSettings[] = {
|
|
T_START,
|
|
T_WINDOW, O(_winSettings),
|
|
T_TITLE, P("Settings"),
|
|
T_WIDTH, 300, T_HEIGHT, 295,
|
|
|
|
T_FRAME, O(_frmComPorts),
|
|
T_X, 10, T_Y, 5, T_WIDTH, 266, T_HEIGHT, 100,
|
|
T_TITLE, P("COM Ports"),
|
|
T_FRAME, T_DONE,
|
|
|
|
T_FRAME, O(_frmServer),
|
|
T_X, 10, T_Y, 110, T_WIDTH, 266, T_HEIGHT, 100,
|
|
T_TITLE, P("Server"),
|
|
T_TEXTBOX, O(_txtServer),
|
|
T_X, 5, T_WIDTH, 250,
|
|
T_TITLE, P("Address:"),
|
|
T_VALUE, P(__configData.serverHost),
|
|
T_TEXTBOX, T_DONE,
|
|
T_UPDOWN, O(_updPort),
|
|
T_X, 5, T_Y, 30, T_WIDTH, 250,
|
|
T_TITLE, P(" Port:"),
|
|
T_VALUE, __configData.serverPort,
|
|
T_MINIMUM, 1,
|
|
T_MAXIMUM, 65535,
|
|
T_UPDOWN, T_DONE,
|
|
T_FRAME, T_DONE,
|
|
|
|
T_BUTTON, O(_btnOkay),
|
|
T_X, 225, T_Y, 225,
|
|
T_TITLE, P("Okay"),
|
|
T_CLICK, P(btnOkayClick),
|
|
T_BUTTON, T_DONE,
|
|
|
|
T_WINDOW, T_DONE,
|
|
T_END
|
|
};
|
|
|
|
tagListRun(uiSettings);
|
|
|
|
// If we found more than one, use the last selected.
|
|
if (__configData.serialCom > 0 && __configData.serialCom < 4) {
|
|
if (_port[__configData.serialCom - 1].enabled) {
|
|
for (len=0; len<4; len++) {
|
|
_port[len].selected = 0;
|
|
}
|
|
_port[__configData.serialCom - 1].selected = 1;
|
|
}
|
|
}
|
|
|
|
// Add COM discovery to GUI.
|
|
rc = 0;
|
|
for (len=0; len<4; len++) {
|
|
_port[len].rdoCOM = radioNew(5, rc, _port[len].title, GROUP_COM);
|
|
if (_port[len].selected) radioSelectedSet(_port[len].rdoCOM);
|
|
widgetEnableSet(W(_port[len].rdoCOM), _port[len].enabled);
|
|
guiAttach(W(_frmComPorts), W(_port[len].rdoCOM));
|
|
rc += 20;
|
|
}
|
|
}
|