LaunchAPPL/Serial: split up source, fix bug

This commit is contained in:
Wolfgang Thaller 2018-04-23 01:11:56 +02:00
parent 89c6471153
commit e2967f3bb9
6 changed files with 117 additions and 108 deletions

View File

@ -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;
}

View File

@ -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;

View File

@ -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)

View 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);
}
}

View 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

View File

@ -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