diff --git a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/main.c b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/main.c index 3ddbb350..568aaf3d 100644 --- a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/main.c +++ b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/main.c @@ -40,7 +40,7 @@ const uint8_t channelList[6] = {11, 15, 20, 25, 26, 27}; struct pendingData pendingDataArr[MAX_PENDING_MACS]; // VERSION GOES HERE! -uint16_t version = 0x0018; +uint16_t version = 0x0019; #define RAW_PKT_PADDING 2 @@ -64,6 +64,7 @@ uint8_t lastAckMac[8] = {0}; #define CONCURRENT_REQUEST_DELAY 1200UL uint32_t lastBlockRequest = 0; uint8_t lastBlockMac[8]; +uint8_t lastTagReturn[8]; uint8_t curChannel = 11; uint8_t curPower = 10; @@ -408,6 +409,30 @@ void espNotifyAPInfo() { pr("NOP>%02X", curNoUpdate); } +void espNotifyTagReturnData(uint8_t *src, uint8_t len) { + struct tagReturnData *trd = (struct tagReturnData *)(radiorxbuffer + sizeof(struct MacFrameBcast) + 1); // oh how I'd love to pass this as an argument, but sdcc won't let me + struct espTagReturnData *etrd = (struct espTagReturnData *)radiotxbuffer; + + if (memcmp((void *) & trd->dataVer, lastTagReturn, 8) == 0) { + return; + } else { + memcpy(lastTagReturn, &trd->dataVer, 8); + } + + memcpy(etrd->src, src, 8); + etrd->len = len; + memcpy(&etrd->returnData, trd, len); + addCRC(etrd, len + 10); + + uartTx('T'); + uartTx('R'); + uartTx('D'); + uartTx('>'); + for (uint8_t c = 0; c < len + 10; c++) { + uartTx(((uint8_t *)etrd)[c]); + } +} + // process data from tag void processBlockRequest(const uint8_t *buffer, uint8_t forceBlockDownload) { struct MacFrameNormal *rxHeader = (struct MacFrameNormal *) buffer; @@ -555,6 +580,26 @@ void processXferComplete(uint8_t *buffer) { } } +void processTagReturnData(uint8_t *buffer, uint8_t len) { + struct MacFrameBcast *rxframe = (struct MacFrameBcast *)buffer; + struct MacFrameNormal *frameHeader = (struct MacFrameNormal *)(radiotxbuffer + 1); + + if (!checkCRC((buffer + sizeof(struct MacFrameBcast) + 1), len - (sizeof(struct MacFrameBcast) + 1))) { + return; + } + radiotxbuffer[sizeof(struct MacFrameNormal) + 1] = PKT_TAG_RETURN_DATA_ACK; + radiotxbuffer[0] = sizeof(struct MacFrameNormal) + 1 + RAW_PKT_PADDING; + memcpy(frameHeader->src, mSelfMac, 8); + memcpy(frameHeader->dst, rxframe->src, 8); + radiotxbuffer[1] = 0x41; // fast way to set the appropriate bits + radiotxbuffer[2] = 0xCC; // normal frame + frameHeader->seq = seq++; + frameHeader->pan = rxframe->srcPan; + radioTx(radiotxbuffer); + + espNotifyTagReturnData(rxframe->src, len - (sizeof(struct MacFrameBcast) + 1)); +} + // send block data to the tag void sendPart(uint8_t partNo) { struct MacFrameNormal *frameHeader = (struct MacFrameNormal *) (radiotxbuffer + 1); @@ -695,8 +740,11 @@ void app_main(void) { processAvailDataReq(radiorxbuffer); } break; - default: - ESP_LOGI(TAG, "t=%02X" , getPacketType(radiorxbuffer)); + case PKT_TAG_RETURN_DATA: + processTagReturnData(radiorxbuffer, ret); + break; + default: + ESP_LOGI(TAG, "t=%02X" , getPacketType(radiorxbuffer)); break; } } else if (blockStartTimer == 0) { @@ -714,7 +762,8 @@ void app_main(void) { } } - for (uint8_t cCount = 0; cCount < MAX_PENDING_MACS; cCount++) { + memset(&lastTagReturn, 0, 8); + for (uint8_t cCount = 0; cCount < MAX_PENDING_MACS; cCount++) { if (pendingDataArr[cCount].attemptsLeft == 1) { if (pendingDataArr[cCount].availdatainfo.dataType != DATATYPE_NOUPDATE) { espNotifyTimeOut(pendingDataArr[cCount].targetMac); diff --git a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/proto.h b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/proto.h index 29921872..83cd0a4c 100644 --- a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/proto.h +++ b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/proto.h @@ -58,6 +58,8 @@ struct MacFrameBcast { uint8_t src[8]; } __attribute__((packed, aligned(1))); +#define PKT_TAG_RETURN_DATA 0xE1 +#define PKT_TAG_RETURN_DATA_ACK 0xE2 #define PKT_AVAIL_DATA_SHORTREQ 0xE3 #define PKT_AVAIL_DATA_REQ 0xE5 #define PKT_AVAIL_DATA_INFO 0xE6 @@ -125,9 +127,14 @@ struct blockData { uint8_t data[]; } __attribute__((packed, aligned(1))); -struct burstMacData { - uint16_t offset; - uint8_t targetMac[8]; +#define TAG_RETURN_DATA_SIZE 90 + +struct tagReturnData { + uint8_t checksum; + uint8_t partId; + uint64_t dataVer; + uint8_t dataType; + uint8_t data[TAG_RETURN_DATA_SIZE]; } __attribute__((packed, aligned(1))); #define BLOCK_PART_DATA_SIZE 99 @@ -173,4 +180,11 @@ struct espSetChannelPower { uint8_t power; } __attribute__((packed, aligned(1))); +struct espTagReturnData { + uint8_t checksum; + uint8_t src[8]; + uint8_t len; + struct tagReturnData returnData; +} __attribute__((packed, aligned(1))); + #endif