Skip to content

Commit abbc87c

Browse files
committed
Fix a bunch of problems with packet decoding
1 parent 0a8be99 commit abbc87c

File tree

4 files changed

+25
-4
lines changed

4 files changed

+25
-4
lines changed

lib/bus/rs232/FujiBusPacket.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,9 @@ bool FujiBusPacket::parse(const std::string &input)
114114
if (decoded.size() < sizeof(fujibus_header))
115115
return false;
116116
hdr = (fujibus_header *) &decoded[0];
117+
Debug_printv("Header: dev:%02x cmd:%02x len:%d chk:%02x fld:%02x",
118+
hdr->device, hdr->command, hdr->length, hdr->checksum, hdr->fields);
119+
117120
if (hdr->length != decoded.size())
118121
return false;
119122

@@ -131,7 +134,8 @@ bool FujiBusPacket::parse(const std::string &input)
131134
fieldCount = numFieldsTable[hdr->fields & FUJI_FIELD_COUNT_MASK];
132135
if (fieldCount)
133136
{
134-
_fieldSize = fieldSizeTable[fieldCount];
137+
_fieldSize = fieldSizeTable[hdr->fields & FUJI_FIELD_COUNT_MASK];
138+
135139
for (idx = 0; idx < fieldCount; idx++)
136140
{
137141
for (val = jdx = 0; jdx < _fieldSize; jdx++)
@@ -161,6 +165,7 @@ std::string FujiBusPacket::serialize()
161165
hdr.command = _command;
162166
hdr.length = sizeof(hdr);
163167
hdr.checksum = 0;
168+
hdr.fields = 0;
164169

165170
std::string output(sizeof(hdr), '\0');
166171

lib/bus/rs232/FujiBusPacket.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class FujiBusPacket
4242
fujiDeviceID_t device() { return _device; }
4343
fujiCommandID_t command() { return _command; }
4444
unsigned int param(unsigned int index) { return _params[index]; }
45+
unsigned int paramCount() { return _params.size(); }
4546
std::optional<std::string> data() const { return _data; }
4647
};
4748

lib/bus/rs232/rs232.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,9 +145,13 @@ uint8_t virtualDevice::bus_to_peripheral(uint8_t *buf, unsigned short len)
145145
// RS232 NAK
146146
void virtualDevice::rs232_nak()
147147
{
148+
#ifdef OBSOLETE
148149
SYSTEM_BUS.write('N');
149150
SYSTEM_BUS.flushOutput();
150151
Debug_println("NAK!");
152+
#else
153+
rs232_error();
154+
#endif /* OBSOLETE */
151155
}
152156

153157
// RS232 ACK
@@ -176,10 +180,13 @@ void virtualDevice::rs232_complete()
176180
// RS232 ERROR
177181
void virtualDevice::rs232_error()
178182
{
179-
abort();
183+
#ifdef OBSOLETE
180184
fnSystem.delay_microseconds(DELAY_T5);
181185
SYSTEM_BUS.write('E');
182186
Debug_println("ERROR!");
187+
#else
188+
SYSTEM_BUS.sendReplyPacket(_devnum, false, nullptr, 0);
189+
#endif /* OBSOLETE */
183190
}
184191

185192
#ifdef OBSOLETE

lib/device/rs232/network.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,10 @@ void rs232Network::rs232_read(uint16_t length)
246246

247247
// And send off to the computer
248248
bus_to_computer((uint8_t *)receiveBuffer->data(), length, err);
249-
receiveBuffer->clear();
249+
250+
// Remove from receive buffer and shrink.
251+
receiveBuffer->erase(0, length);
252+
receiveBuffer->shrink_to_fit();
250253
}
251254

252255
/**
@@ -870,7 +873,12 @@ void rs232Network::rs232_process(FujiBusPacket &packet)
870873
rs232_write(packet.param(0));
871874
break;
872875
case FUJICMD_STATUS:
873-
rs232_status(static_cast<FujiStatusReq>(packet.param(0)));
876+
{
877+
FujiStatusReq reqType = STATUS_NETWORK_CONNERR;
878+
if (packet.paramCount() >= 2)
879+
reqType = (FujiStatusReq) packet.param(1);
880+
rs232_status(reqType);
881+
}
874882
break;
875883
case FUJICMD_PARSE:
876884
rs232_ack();

0 commit comments

Comments
 (0)