mirror of
https://github.com/autc04/Retro68.git
synced 2025-03-30 20:34:41 +00:00
LaunchAPPL/Serial: split up source, fix bug
This commit is contained in:
parent
89c6471153
commit
e2967f3bb9
@ -50,7 +50,7 @@ void ReliableStream::ack()
|
||||
kAck, (uint8_t)~kAck, (uint8_t)receivedInputPacket, (uint8_t)~receivedInputPacket
|
||||
};
|
||||
stream.write(packet, 8);
|
||||
printf("ack sent\n");
|
||||
//printf("ack sent\n");
|
||||
}
|
||||
|
||||
void ReliableStream::nack()
|
||||
@ -60,7 +60,7 @@ void ReliableStream::nack()
|
||||
kNack, (uint8_t)~kNack, (uint8_t)receivedInputPacket, (uint8_t)~receivedInputPacket
|
||||
};
|
||||
stream.write(packet, 8);
|
||||
printf("nack sent\n");
|
||||
//printf("nack sent\n");
|
||||
}
|
||||
|
||||
void ReliableStream::gotAck(uint8_t id)
|
||||
@ -232,8 +232,7 @@ void ReliableStream::write(const void* p, size_t n)
|
||||
|
||||
size_t ReliableStream::onReceive(const uint8_t* p, size_t n)
|
||||
{
|
||||
printf("data available (%d) - state %d\n", (int)n, (int)state);
|
||||
|
||||
//printf("data available (%d) - state %d\n", (int)n, (int)state);
|
||||
switch(state)
|
||||
{
|
||||
case State::waiting:
|
||||
@ -303,6 +302,7 @@ size_t ReliableStream::onReceive(const uint8_t* p, size_t n)
|
||||
return 8;
|
||||
}
|
||||
state = State::receiving;
|
||||
inputMatchMagic1 = inputMatchMagic2 = 0;
|
||||
return 8;
|
||||
default:
|
||||
state = State::skipping;
|
||||
@ -336,17 +336,15 @@ size_t ReliableStream::onReceive(const uint8_t* p, size_t n)
|
||||
|
||||
case State::receiving:
|
||||
{
|
||||
int match = 0, match2 = 0;
|
||||
int i;
|
||||
int consumed = 0;
|
||||
|
||||
for(i = 0; i < n; i++)
|
||||
{
|
||||
incomingPacket.push_back(p[i]);
|
||||
|
||||
if(match2 == 4)
|
||||
if(inputMatchMagic2 == 4)
|
||||
{
|
||||
match2 = 0;
|
||||
inputMatchMagic2 = 0;
|
||||
incomingPacket.pop_back();
|
||||
switch(p[i])
|
||||
{
|
||||
@ -367,26 +365,23 @@ size_t ReliableStream::onReceive(const uint8_t* p, size_t n)
|
||||
}
|
||||
}
|
||||
|
||||
if(p[i] != magic1[match])
|
||||
match = 0;
|
||||
if(p[i] == magic1[match])
|
||||
match++;
|
||||
if(p[i] != magic2[match2])
|
||||
match2 = 0;
|
||||
if(p[i] == magic2[match2])
|
||||
match2++;
|
||||
if(p[i] != magic1[inputMatchMagic1])
|
||||
inputMatchMagic1 = 0;
|
||||
if(p[i] == magic1[inputMatchMagic1])
|
||||
inputMatchMagic1++;
|
||||
if(p[i] != magic2[inputMatchMagic2])
|
||||
inputMatchMagic2 = 0;
|
||||
if(p[i] == magic2[inputMatchMagic2])
|
||||
inputMatchMagic2++;
|
||||
|
||||
if(match == 4)
|
||||
if(inputMatchMagic1 == 4)
|
||||
{
|
||||
state = State::waiting;
|
||||
nack();
|
||||
return i-3;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
return n - std::max(match, match2);
|
||||
return n;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -36,6 +36,7 @@ class ReliableStream : public Stream, public StreamListener
|
||||
|
||||
State state = State::waiting;
|
||||
std::vector<uint8_t> incomingPacket;
|
||||
int inputMatchMagic1, inputMatchMagic2;
|
||||
|
||||
std::list<std::vector<uint8_t>> packetsToSend;
|
||||
std::list<std::vector<uint8_t>> sentPackets;
|
||||
|
@ -1,2 +1,6 @@
|
||||
add_application(LaunchAPPLServer CONSOLE main.cc)
|
||||
add_application(LaunchAPPLServer CONSOLE
|
||||
main.cc
|
||||
MacSerialStream.h
|
||||
MacSerialStream.cc)
|
||||
|
||||
target_link_libraries(LaunchAPPLServer LaunchAPPLCommon)
|
||||
|
69
LaunchAPPL/Server/MacSerialStream.cc
Normal file
69
LaunchAPPL/Server/MacSerialStream.cc
Normal file
@ -0,0 +1,69 @@
|
||||
#include "MacSerialStream.h"
|
||||
|
||||
#include <Serial.h>
|
||||
#include <Devices.h>
|
||||
|
||||
#include <string.h>
|
||||
|
||||
MacSerialStream::MacSerialStream()
|
||||
{
|
||||
OSErr err;
|
||||
err = OpenDriver("\p.AOut", &outRefNum);
|
||||
err = OpenDriver("\p.AIn", &inRefNum);
|
||||
SerSetBuf(inRefNum, inputBuffer, kInputBufferSize);
|
||||
|
||||
|
||||
SerShk shk;
|
||||
memset(&shk, 0, sizeof(shk));
|
||||
shk.fCTS = true;
|
||||
Control(outRefNum, kSERDHandshake, &shk);
|
||||
|
||||
SerReset(outRefNum, baud19200 | data8 | noParity | stop10);
|
||||
}
|
||||
|
||||
void MacSerialStream::close()
|
||||
{
|
||||
if(inRefNum == 0)
|
||||
return;
|
||||
SerSetBuf(inRefNum, NULL, 0);
|
||||
|
||||
CloseDriver(inRefNum);
|
||||
CloseDriver(outRefNum);
|
||||
inRefNum = outRefNum = 0;
|
||||
}
|
||||
|
||||
MacSerialStream::~MacSerialStream()
|
||||
{
|
||||
close();
|
||||
}
|
||||
|
||||
void MacSerialStream::write(const void* p, size_t n)
|
||||
{
|
||||
ParamBlockRec pb;
|
||||
memset(&pb, 0, sizeof(pb));
|
||||
pb.ioParam.ioRefNum = outRefNum;
|
||||
pb.ioParam.ioBuffer = (Ptr)p;
|
||||
pb.ioParam.ioReqCount = n;
|
||||
OSErr err = PBWriteSync(&pb);
|
||||
}
|
||||
|
||||
void MacSerialStream::idle()
|
||||
{
|
||||
long count = 0;
|
||||
SerGetBuf(inRefNum, &count);
|
||||
while(count > 0)
|
||||
{
|
||||
long count1 = count > kReadBufferSize ? kReadBufferSize : count;
|
||||
ParamBlockRec pb;
|
||||
memset(&pb, 0, sizeof(pb));
|
||||
pb.ioParam.ioRefNum = inRefNum;
|
||||
pb.ioParam.ioBuffer = (Ptr)&readBuffer;
|
||||
pb.ioParam.ioReqCount = count1;
|
||||
OSErr err = PBReadSync(&pb);
|
||||
if(err)
|
||||
return;
|
||||
count -= count1;
|
||||
|
||||
notifyReceive((uint8_t*)readBuffer, count1);
|
||||
}
|
||||
}
|
25
LaunchAPPL/Server/MacSerialStream.h
Normal file
25
LaunchAPPL/Server/MacSerialStream.h
Normal file
@ -0,0 +1,25 @@
|
||||
#ifndef MACSERIALSTREAM_H_
|
||||
#define MACSERIALSTREAM_H_
|
||||
|
||||
#include <Stream.h>
|
||||
|
||||
class MacSerialStream : public Stream
|
||||
{
|
||||
static const long kInputBufferSize = 4096;
|
||||
static const long kReadBufferSize = 4096;
|
||||
char inputBuffer[kInputBufferSize];
|
||||
char readBuffer[kReadBufferSize];
|
||||
|
||||
short outRefNum, inRefNum;
|
||||
public:
|
||||
virtual void write(const void* p, size_t n) override;
|
||||
|
||||
void idle();
|
||||
|
||||
MacSerialStream();
|
||||
~MacSerialStream();
|
||||
|
||||
void close();
|
||||
};
|
||||
|
||||
#endif
|
@ -1,99 +1,14 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <Serial.h>
|
||||
#include <Devices.h>
|
||||
#include <Events.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <Stream.h>
|
||||
#include "MacSerialStream.h"
|
||||
#include <ReliableStream.h>
|
||||
#include <Processes.h>
|
||||
|
||||
#include <UnreliableStream.h>
|
||||
|
||||
class MacSerialStream : public Stream
|
||||
{
|
||||
static const long kInputBufferSize = 4096;
|
||||
static const long kReadBufferSize = 4096;
|
||||
char inputBuffer[kInputBufferSize];
|
||||
char readBuffer[kReadBufferSize];
|
||||
|
||||
short outRefNum, inRefNum;
|
||||
public:
|
||||
virtual void write(const void* p, size_t n) override;
|
||||
|
||||
void idle();
|
||||
|
||||
MacSerialStream();
|
||||
~MacSerialStream();
|
||||
|
||||
void close();
|
||||
};
|
||||
|
||||
MacSerialStream::MacSerialStream()
|
||||
{
|
||||
OSErr err;
|
||||
err = OpenDriver("\p.AOut", &outRefNum);
|
||||
err = OpenDriver("\p.AIn", &inRefNum);
|
||||
SerSetBuf(inRefNum, inputBuffer, kInputBufferSize);
|
||||
|
||||
|
||||
SerShk shk;
|
||||
memset(&shk, 0, sizeof(shk));
|
||||
shk.fCTS = true;
|
||||
Control(outRefNum, kSERDHandshake, &shk);
|
||||
|
||||
SerReset(outRefNum, baud19200 | data8 | noParity | stop10);
|
||||
}
|
||||
|
||||
void MacSerialStream::close()
|
||||
{
|
||||
if(inRefNum == 0)
|
||||
return;
|
||||
SerSetBuf(inRefNum, NULL, 0);
|
||||
|
||||
CloseDriver(inRefNum);
|
||||
CloseDriver(outRefNum);
|
||||
inRefNum = outRefNum = 0;
|
||||
}
|
||||
|
||||
MacSerialStream::~MacSerialStream()
|
||||
{
|
||||
close();
|
||||
}
|
||||
|
||||
void MacSerialStream::write(const void* p, size_t n)
|
||||
{
|
||||
ParamBlockRec pb;
|
||||
memset(&pb, 0, sizeof(pb));
|
||||
pb.ioParam.ioRefNum = outRefNum;
|
||||
pb.ioParam.ioBuffer = (Ptr)p;
|
||||
pb.ioParam.ioReqCount = n;
|
||||
OSErr err = PBWriteSync(&pb);
|
||||
}
|
||||
|
||||
void MacSerialStream::idle()
|
||||
{
|
||||
long count = 0;
|
||||
SerGetBuf(inRefNum, &count);
|
||||
while(count > 0)
|
||||
{
|
||||
printf("something received.\n");
|
||||
long count1 = count > kReadBufferSize ? kReadBufferSize : count;
|
||||
ParamBlockRec pb;
|
||||
memset(&pb, 0, sizeof(pb));
|
||||
pb.ioParam.ioRefNum = inRefNum;
|
||||
pb.ioParam.ioBuffer = (Ptr)&readBuffer;
|
||||
pb.ioParam.ioReqCount = count1;
|
||||
OSErr err = PBReadSync(&pb);
|
||||
if(err)
|
||||
return;
|
||||
count -= count1;
|
||||
|
||||
notifyReceive((uint8_t*)readBuffer, count1);
|
||||
Delay(20,nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
class DumpToConsole : public StreamListener
|
||||
|
Loading…
x
Reference in New Issue
Block a user