Fixed GBT multiframe

This commit is contained in:
Gunnar Skjold
2022-05-13 09:16:40 +02:00
parent b2e144efcf
commit fab637cf60
3 changed files with 13 additions and 8 deletions

View File

@@ -858,8 +858,7 @@ bool readHanPort() {
if(ga == NULL) {
ga = new GBTAssembler();
}
ga->init((uint8_t *) hanBuffer, &context);
if(ga->append((uint8_t *) hanBuffer+context.apduStart, len, &Debug) < 0) {
if(ga->append(&context, (uint8_t *) hanBuffer, len, &Debug) < 0) {
debugE("GBT assembler failed");
len = 0;
return false;
@@ -876,7 +875,7 @@ bool readHanPort() {
debugD("Final block dump (%db):", len);
debugPrint(hanBuffer, 0, len);
}
if(ga->append((uint8_t *) hanBuffer+context.apduStart, len, &Debug) >= 0) {
if(ga->append(&context, (uint8_t *) hanBuffer, len, &Debug) >= 0) {
len = ga->write((uint8_t *) hanBuffer);
pos = HDLC_validate((uint8_t *) hanBuffer, len, hc, &timestamp, &context);
} else {

View File

@@ -17,15 +17,21 @@ void GBTAssembler::init(const uint8_t* d, HDLCContext* context) {
lastSequenceNumber = 0;
}
int GBTAssembler::append(const uint8_t* d, int length, Print* debugger) {
GBTHeader* h = (GBTHeader*) d;
int GBTAssembler::append(HDLCContext* context, const uint8_t* d, int length, Print* debugger) {
GBTHeader* h = (GBTHeader*) (d+context->apduStart);
h->sequence = ntohs(h->sequence);
h->sequenceAck = ntohs(h->sequenceAck);
uint8_t* ptr = (uint8_t*) &h[1];
//debugger->printf("F: %02X, C: %02X, S: %d, A: %d, L: %d, X: %d\n", h->flag, h->control, h->sequence, h->sequenceAck, h->size, lastSequenceNumber);
if(h->flag != 0xE0) return -9;
if(lastSequenceNumber != h->sequence-1) return -1;
if(h->sequence == 1) {
init(d, context);
} else if(lastSequenceNumber != h->sequence-1) {
return -1;
}
uint8_t* ptr = (uint8_t*) &h[1];
memcpy(buf + pos, ptr, h->size);
pos += h->size;
lastSequenceNumber = h->sequence;

View File

@@ -16,7 +16,7 @@ class GBTAssembler {
public:
GBTAssembler();
void init(const uint8_t* d, HDLCContext* context);
int append(const uint8_t* d, int length, Print* debugger);
int append(HDLCContext* context, const uint8_t* d, int length, Print* debugger);
uint16_t write(const uint8_t* d);
private: