diff --git a/.github/workflows/autobuild.yml b/.github/workflows/autobuild.yml index 8e48da85c..abe68e0bc 100644 --- a/.github/workflows/autobuild.yml +++ b/.github/workflows/autobuild.yml @@ -28,6 +28,7 @@ jobs: - COCO - IEC-LOLIN-D32 - IEC-NUGGET + - LYNX - RS232 steps: diff --git a/.github/workflows/platformio.release-LYNX.ini b/.github/workflows/platformio.release-LYNX.ini new file mode 100644 index 000000000..5331d3114 --- /dev/null +++ b/.github/workflows/platformio.release-LYNX.ini @@ -0,0 +1,13 @@ +[fujinet] +build_platform = BUILD_LYNX +build_bus = comlynx +build_board = fujinet-lynx-prototype + +[env:fujinet-lynx-prototype] +platform = espressif32@${fujinet.esp32_platform_version} +platform_packages = ${fujinet.esp32_platform_packages} +board = fujinet-v1 +build_type = debug +build_flags = + ${env.build_flags} + -D PINMAP_LYNX diff --git a/include/fujiDeviceID.h b/include/fujiDeviceID.h index 68175afac..61b8afadd 100644 --- a/include/fujiDeviceID.h +++ b/include/fujiDeviceID.h @@ -1,6 +1,21 @@ #ifndef FUJI_DEVICES_H #define FUJI_DEVICES_H +#if defined(BUILD_ADAM) || defined(BUILD_LYNX) +enum fujiDeviceID_t { + FUJI_DEVICEID_FUJINET = 0x0F, + + FUJI_DEVICEID_KEYBOARD = 0x01, + FUJI_DEVICEID_PRINTER = 0x02, + FUJI_DEVICEID_DISK = 0x04, + FUJI_DEVICEID_DISK2 = 0x05, + FUJI_DEVICEID_DISK3 = 0x06, + FUJI_DEVICEID_DISK4 = 0x07, + FUJI_DEVICEID_TAPE = 0x08, + FUJI_DEVICEID_NETWORK_TEMP = 0x09, + FUJI_DEVICEID_NETWORK = 0x0E, +}; +#else enum fujiDeviceID_t { FUJI_DEVICEID_FUJINET = 0x70, @@ -23,5 +38,6 @@ enum fujiDeviceID_t { FUJI_DEVICEID_NETWORK_LAST = 0x78, FUJI_DEVICEID_MIDI = 0x99, }; +#endif /* BUILD_ADAM || BUILD_LYNX */ #endif /* FUJI_DEVICES_H */ diff --git a/lib/bus/comlynx/comlynx.cpp b/lib/bus/comlynx/comlynx.cpp index 7dc80a920..2d272e4e8 100755 --- a/lib/bus/comlynx/comlynx.cpp +++ b/lib/bus/comlynx/comlynx.cpp @@ -81,11 +81,11 @@ uint8_t comlynx_checksum(uint8_t *buf, unsigned short len) void virtualDevice::comlynx_send(uint8_t b) { Debug_printf("comlynx_send_buffer: %X\n", b); - + // Wait for idle only when in UDPStream mode if (SYSTEM_BUS._udpDev->udpstreamActive) SYSTEM_BUS.wait_for_idle(); - + // Write the byte SYSTEM_BUS.write(b); SYSTEM_BUS.flush(); @@ -94,7 +94,7 @@ void virtualDevice::comlynx_send(uint8_t b) void virtualDevice::comlynx_send_buffer(uint8_t *buf, unsigned short len) { - + //buf[len] = '\0'; //Debug_printf("comlynx_send_buffer: %d %s\n", len, buf); // causes out of bounds write in disk routines @@ -104,7 +104,7 @@ void virtualDevice::comlynx_send_buffer(uint8_t *buf, unsigned short len) // Wait for idle only when in UDPStream mode if (SYSTEM_BUS._udpDev->udpstreamActive) SYSTEM_BUS.wait_for_idle(); - + SYSTEM_BUS.write(buf, len); SYSTEM_BUS.read(buf, len); } @@ -116,7 +116,7 @@ bool virtualDevice::comlynx_recv_ck() while (SYSTEM_BUS.available() <= 0) fnSystem.yield(); - + // get checksum recv_ck = SYSTEM_BUS.read(); @@ -203,7 +203,7 @@ unsigned short virtualDevice::comlynx_recv_buffer(uint8_t *buf, unsigned short l unsigned short b; b = SYSTEM_BUS.read(buf, len); - + // Add to receive buffer memcpy(&recvbuffer[recvbuffer_len], buf, len); recvbuffer_len += len; @@ -321,7 +321,7 @@ void systemBus::_comlynx_process_cmd() b = SYSTEM_BUS.read(); d = b & 0x0F; - + // Find device ID and pass control to it if (_daisyChain.count(d) < 1) { @@ -331,12 +331,12 @@ void systemBus::_comlynx_process_cmd() #ifdef DEBUG if ((b & 0xF0) == (MN_ACK<<4)) Debug_println("Lynx sent ACK"); - else { + else { Debug_println("---"); Debug_printf("comlynx_process_cmd: dev:%X cmd:%X\n", d, (b & 0xF0)>>4); } - #endif - + #endif + // turn on Comlynx Indicator LED fnLedManager.set(eLed::LED_BUS, true); _daisyChain[d]->comlynx_process(b); @@ -382,7 +382,7 @@ void systemBus::setup() _port.begin(ChannelConfig() .deviceID(FN_UART_BUS) .baud(COMLYNX_BAUDRATE) - .parity(UART_PARITY_ODD) + .parity(UART_PARITY_ODD) ); } @@ -396,7 +396,7 @@ void systemBus::shutdown() Debug_printf("All devices shut down.\n"); } -void systemBus::addDevice(virtualDevice *pDevice, uint8_t device_id) +void systemBus::addDevice(virtualDevice *pDevice, fujiDeviceID_t device_id) { Debug_printf("Adding device: %02X\n", device_id); pDevice->_devnum = device_id; @@ -404,21 +404,23 @@ void systemBus::addDevice(virtualDevice *pDevice, uint8_t device_id) switch (device_id) { - case 0x02: + case FUJI_DEVICEID_PRINTER: _printerDev = (lynxPrinter *)pDevice; break; - case 0x0f: + case FUJI_DEVICEID_FUJINET: _fujiDev = (lynxFuji *)pDevice; break; + default: + break; } } -bool systemBus::deviceExists(uint8_t device_id) +bool systemBus::deviceExists(fujiDeviceID_t device_id) { return _daisyChain.find(device_id) != _daisyChain.end(); } -bool systemBus::deviceEnabled(uint8_t device_id) +bool systemBus::deviceEnabled(fujiDeviceID_t device_id) { if (deviceExists(device_id)) return _daisyChain[device_id]->device_active; @@ -430,7 +432,7 @@ void systemBus::remDevice(virtualDevice *pDevice) { } -void systemBus::remDevice(uint8_t device_id) +void systemBus::remDevice(fujiDeviceID_t device_id) { if (deviceExists(device_id)) { @@ -443,7 +445,7 @@ int systemBus::numDevices() return _daisyChain.size(); } -void systemBus::changeDeviceId(virtualDevice *p, uint8_t device_id) +void systemBus::changeDeviceId(virtualDevice *p, fujiDeviceID_t device_id) { for (auto devicep : _daisyChain) { @@ -452,7 +454,7 @@ void systemBus::changeDeviceId(virtualDevice *p, uint8_t device_id) } } -virtualDevice *systemBus::deviceById(uint8_t device_id) +virtualDevice *systemBus::deviceById(fujiDeviceID_t device_id) { for (auto devicep : _daisyChain) { @@ -468,7 +470,7 @@ void systemBus::reset() devicep.second->reset(); } -void systemBus::enableDevice(uint8_t device_id) +void systemBus::enableDevice(fujiDeviceID_t device_id) { Debug_printf("Enabling Comlynx Device %d\n", device_id); @@ -476,7 +478,7 @@ void systemBus::enableDevice(uint8_t device_id) _daisyChain[device_id]->device_active = true; } -void systemBus::disableDevice(uint8_t device_id) +void systemBus::disableDevice(fujiDeviceID_t device_id) { Debug_printf("Disabling Comlynx Device %d\n", device_id); @@ -545,7 +547,7 @@ void systemBus::setRedeyeMode(bool enable) void systemBus::setRedeyeGameRemap(uint32_t remap) { Debug_printf("setRedeyeGameRemap, %d\n", remap); - + // handle pure updstream games if ((remap >> 8) == 0xE1) { _udpDev->redeye_mode = false; // turn off redeye @@ -555,7 +557,7 @@ void systemBus::setRedeyeGameRemap(uint32_t remap) // handle redeye game that need remapping if (remap != 0xFFFF) { - _udpDev->remap_game_id = true; + _udpDev->remap_game_id = true; _udpDev->new_game_id = remap; } else { @@ -569,7 +571,7 @@ void systemBus::setRedeyeGameRemap(uint32_t remap) { Debug_printf("setComlynxIdleTime, %d\n", idle_time); - SYSTEM_BUS.comlynx_idle_time = idle_time; + SYSTEM_BUS.comlynx_idle_time = idle_time; }*/ #endif /* BUILD_LYNX */ diff --git a/lib/bus/comlynx/comlynx.h b/lib/bus/comlynx/comlynx.h index dc832b02d..5a9a07fd5 100755 --- a/lib/bus/comlynx/comlynx.h +++ b/lib/bus/comlynx/comlynx.h @@ -6,6 +6,7 @@ */ #include "UARTChannel.h" +#include "fujiDeviceID.h" #include #include @@ -31,13 +32,6 @@ #define NM_SEND 0x0B // response.data (send) #define NM_NACK 0x0C // response.control (nack) -#define COMLYNX_DEVICE_ID_KEYBOARD 0x01 -#define COMLYNX_DEVICE_ID_PRINTER 0x02 -#define COMLYNX_DEVICEID_DISK 0x04 -#define COMLYNX_DEVICE_TAPE 0x08 -#define COMLYNX_DEVICE_NETWORK 0x0E -#define COMLYNX_DEVICE_FUJINET 0x0F - #define COMLYNX_RESET_DEBOUNCE_PERIOD 100 // in ms union cmdFrame_t @@ -161,7 +155,7 @@ class virtualDevice /** * @brief Device Number: 0-15 */ - uint8_t _devnum; + fujiDeviceID_t _devnum; virtual void shutdown() {} @@ -233,7 +227,7 @@ class virtualDevice * @brief return the device number (0-15) of this device * @return the device # (0-15) of this device */ - uint8_t id() { return _devnum; } + fujiDeviceID_t id() { return _devnum; } }; diff --git a/lib/device/comlynx/lynxFuji.cpp b/lib/device/comlynx/lynxFuji.cpp index 6d1391528..9b1bcec5c 100644 --- a/lib/device/comlynx/lynxFuji.cpp +++ b/lib/device/comlynx/lynxFuji.cpp @@ -656,11 +656,11 @@ void lynxFuji::image_rotate() count--; // Save the device ID of the disk in the last slot - int last_id = _fnDisks[count].disk_dev.id(); + fujiDeviceID_t last_id = _fnDisks[count].disk_dev.id(); for (int n = count; n > 0; n--) { - int swap = _fnDisks[n - 1].disk_dev.id(); + fujiDeviceID_t swap = _fnDisks[n - 1].disk_dev.id(); Debug_printf("setting slot %d to ID %hx\n", n, swap); SYSTEM_BUS.changeDeviceId(&_fnDisks[n].disk_dev, swap); } @@ -1273,7 +1273,7 @@ void lynxFuji::insert_boot_device(uint8_t d) void lynxFuji::comlynx_enable_device() { - unsigned char d = comlynx_recv(); + fujiDeviceID_t d = (fujiDeviceID_t) comlynx_recv(); Debug_printf("FUJI ENABLE DEVICE %02x\n",d); // Get packet checksum @@ -1284,21 +1284,23 @@ void lynxFuji::comlynx_enable_device() switch(d) { - case 0x02: - Config.store_printer_enabled(true); - break; - case 0x04: - Config.store_device_slot_enable_1(true); - break; - case 0x05: - Config.store_device_slot_enable_2(true); - break; - case 0x06: - Config.store_device_slot_enable_3(true); - break; - case 0x07: - Config.store_device_slot_enable_4(true); - break; + case FUJI_DEVICEID_PRINTER: + Config.store_printer_enabled(true); + break; + case FUJI_DEVICEID_DISK: + Config.store_device_slot_enable_1(true); + break; + case FUJI_DEVICEID_DISK2: + Config.store_device_slot_enable_2(true); + break; + case FUJI_DEVICEID_DISK3: + Config.store_device_slot_enable_3(true); + break; + case FUJI_DEVICEID_DISK4: + Config.store_device_slot_enable_4(true); + break; + default: + break; } Config.save(); @@ -1308,7 +1310,7 @@ void lynxFuji::comlynx_enable_device() void lynxFuji::comlynx_disable_device() { - unsigned char d = comlynx_recv(); + fujiDeviceID_t d = (fujiDeviceID_t) comlynx_recv(); Debug_printf("FUJI DISABLE DEVICE %02x\n",d); // Get packet checksum @@ -1319,21 +1321,23 @@ void lynxFuji::comlynx_disable_device() switch(d) { - case 0x02: - Config.store_printer_enabled(false); - break; - case 0x04: - Config.store_device_slot_enable_1(false); - break; - case 0x05: - Config.store_device_slot_enable_2(false); - break; - case 0x06: - Config.store_device_slot_enable_3(false); - break; - case 0x07: - Config.store_device_slot_enable_4(false); - break; + case FUJI_DEVICEID_PRINTER: + Config.store_printer_enabled(false); + break; + case FUJI_DEVICEID_DISK: + Config.store_device_slot_enable_1(false); + break; + case FUJI_DEVICEID_DISK2: + Config.store_device_slot_enable_2(false); + break; + case FUJI_DEVICEID_DISK3: + Config.store_device_slot_enable_3(false); + break; + case FUJI_DEVICEID_DISK4: + Config.store_device_slot_enable_4(false); + break; + default: + break; } Config.save(); @@ -1351,10 +1355,10 @@ void lynxFuji::setup() // Disable status_wait if our settings say to turn it off status_wait_enabled = false; - SYSTEM_BUS.addDevice(&_fnDisks[0].disk_dev, 4); - SYSTEM_BUS.addDevice(theFuji, 0x0F); // Fuji becomes the gateway device. + SYSTEM_BUS.addDevice(&_fnDisks[0].disk_dev, FUJI_DEVICEID_DISK); + SYSTEM_BUS.addDevice(theFuji, FUJI_DEVICEID_FUJINET); // Fuji becomes the gateway device. theNetwork = new lynxNetwork(); - SYSTEM_BUS.addDevice(theNetwork, 0x09); // temporary. + SYSTEM_BUS.addDevice(theNetwork, FUJI_DEVICEID_NETWORK_TEMP); // temporary. } void lynxFuji::comlynx_random_number() @@ -1408,7 +1412,7 @@ void lynxFuji::comlynx_get_time() void lynxFuji::comlynx_device_enable_status() { - uint8_t d = comlynx_recv(); + fujiDeviceID_t d = (fujiDeviceID_t) comlynx_recv(); // Get packet checksum if (!comlynx_recv_ck()) { diff --git a/lib/device/comlynx/lynxFuji.h b/lib/device/comlynx/lynxFuji.h index 4c219f5f7..f7090d06a 100644 --- a/lib/device/comlynx/lynxFuji.h +++ b/lib/device/comlynx/lynxFuji.h @@ -9,6 +9,7 @@ #include "fujiHost.h" #include "fujiDisk.h" +#include "fujiDevice.h" class lynxFuji : public virtualDevice { diff --git a/lib/device/comlynx/network.cpp b/lib/device/comlynx/network.cpp index 08ff10837..d45bec697 100644 --- a/lib/device/comlynx/network.cpp +++ b/lib/device/comlynx/network.cpp @@ -643,10 +643,10 @@ void lynxNetwork::comlynx_special_inquiry() { } -void lynxNetwork::do_inquiry(unsigned char inq_cmd) +void lynxNetwork::do_inquiry(fujiCommandID_t inq_cmd) { // Reset inq_dstats - inq_dstats = 0xff; + inq_dstats = SIO_DIRECTION_INVALID; cmdFrame.comnd = inq_cmd; @@ -659,34 +659,34 @@ void lynxNetwork::do_inquiry(unsigned char inq_cmd) { switch (inq_cmd) { - case 0x20: - case 0x21: - case 0x23: - case 0x24: - case 0x2A: - case 0x2B: - case 0x2C: - case 0xFD: - case 0xFE: - inq_dstats = 0x80; + case FUJICMD_RENAME: + case FUJICMD_DELETE: + case FUJICMD_LOCK: + case FUJICMD_UNLOCK: + case FUJICMD_MKDIR: + case FUJICMD_RMDIR: + case FUJICMD_CHDIR: + case FUJICMD_USERNAME: + case FUJICMD_PASSWORD: + inq_dstats = SIO_DIRECTION_WRITE; break; - case 0x30: - inq_dstats = 0x40; + case FUJICMD_GETCWD: + inq_dstats = SIO_DIRECTION_READ; break; - case 'Z': // Set interrupt rate - inq_dstats = 0x00; + case FUJICMD_TIMER: // Set interrupt rate + inq_dstats = SIO_DIRECTION_NONE; break; - case 'T': // Set Translation - inq_dstats = 0x00; + case FUJICMD_TRANSLATION: // Set Translation + inq_dstats = SIO_DIRECTION_NONE; break; - case 0x80: // JSON Parse - inq_dstats = 0x00; + case FUJICMD_JSON_PARSE: // JSON Parse + inq_dstats = SIO_DIRECTION_NONE; break; - case 0x81: // JSON Query - inq_dstats = 0x80; + case FUJICMD_JSON_QUERY: // JSON Query + inq_dstats = SIO_DIRECTION_WRITE; break; default: - inq_dstats = 0xFF; // not supported + inq_dstats = SIO_DIRECTION_INVALID; // not supported break; } } @@ -782,57 +782,57 @@ void lynxNetwork::comlynx_control_ack() void lynxNetwork::comlynx_control_send() { uint16_t s = comlynx_recv_length(); // receive length - uint8_t c = comlynx_recv(); // receive command + fujiCommandID_t c = (fujiCommandID_t) comlynx_recv(); // receive command s--; // Because we've popped the command off the stack switch (c) { - case ' ': + case FUJICMD_RENAME: rename(s); break; - case '!': + case FUJICMD_DELETE: del(s); break; - case '*': + case FUJICMD_MKDIR: mkdir(s); break; - case ',': + case FUJICMD_CHDIR: set_prefix(s); break; - case '0': + case FUJICMD_GETCWD: get_prefix(); break; - case 'O': + case FUJICMD_OPEN: open(s); break; - case 'C': + case FUJICMD_CLOSE: close(); break; - case 'S': + case FUJICMD_STATUS: status(); break; - case 'W': + case FUJICMD_WRITE: write(s); break; - case 0xFC: + case FUJICMD_GET_SCAN_RESULT: channel_mode(); break; - case 0xFD: // login + case FUJICMD_USERNAME: // login set_login(s); break; - case 0xFE: // password + case FUJICMD_PASSWORD: // password set_password(s); break; default: switch (channelMode) { case PROTOCOL: - if (inq_dstats == 0x00) + if (inq_dstats == SIO_DIRECTION_NONE) comlynx_special_00(s); - else if (inq_dstats == 0x40) + else if (inq_dstats == SIO_DIRECTION_READ) comlynx_special_40(s); - else if (inq_dstats == 0x80) + else if (inq_dstats == SIO_DIRECTION_WRITE) comlynx_special_80(s); else Debug_printf("comlynx_control_send() - Unknown Command: %02x\n", c); @@ -840,12 +840,14 @@ void lynxNetwork::comlynx_control_send() case JSON: switch (c) { - case 'P': + case FUJICMD_PUT: json_parse(); break; - case 'Q': + case FUJICMD_QUERY: json_query(s); break; + default: + break; } break; default: diff --git a/lib/device/comlynx/network.h b/lib/device/comlynx/network.h index e0df68c80..3c80831c3 100644 --- a/lib/device/comlynx/network.h +++ b/lib/device/comlynx/network.h @@ -254,7 +254,7 @@ class lynxNetwork : public virtualDevice /** * Return value for DSTATS inquiry */ - uint8_t inq_dstats = 0xFF; + AtariSIODirection inq_dstats = SIO_DIRECTION_INVALID; /** * The login to use for a protocol action @@ -403,7 +403,7 @@ class lynxNetwork : public virtualDevice * @brief Perform the inquiry, handle both local and protocol commands. * @param inq_cmd the command to check against. */ - void do_inquiry(unsigned char inq_cmd); + void do_inquiry(fujiCommandID_t inq_cmd); /** * @brief set translation specified by aux1 to aux2_translation mode.