From ed82795e5f719f2eccc6296411bbc0a3449b2596 Mon Sep 17 00:00:00 2001 From: Nic Limper Date: Mon, 2 Oct 2023 11:54:36 +0200 Subject: [PATCH] tweak timings --- .../OpenEPaperLink_esp32_C6_AP/main/main.c | 120 ++++++++++-------- .../OpenEPaperLink_esp32_C6_AP/main/radio.c | 78 ++++++------ 2 files changed, 106 insertions(+), 92 deletions(-) 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 1d2c5e9e..0e163e50 100644 --- a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/main.c +++ b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/main.c @@ -326,15 +326,15 @@ void processSerial(uint8_t lastchar) { } goto SCPfailed; SCPchannelFound: - pr("ACK>"); - if (curChannel != scp->channel) { - radioSetChannel(scp->channel); - curChannel = scp->channel; - } - curPower = scp->power; + pr("ACK>"); + if (curChannel != scp->channel) { + radioSetChannel(scp->channel); + curChannel = scp->channel; + } + curPower = scp->power; radioSetTxPower(scp->power); ESP_LOGI(TAG, "Set channel: %d power: %d", curChannel, curPower); - } else { + } else { SCPfailed: pr("NOK>"); } @@ -412,27 +412,27 @@ void espNotifyAPInfo() { } 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; + 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); - } + 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); + 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]); - } + 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 @@ -492,7 +492,7 @@ void processBlockRequest(const uint8_t *buffer, uint8_t forceBlockDownload) { if (blockStartTimer == 0) { if (requestDataDownload) { if (highspeedSerial == true) { - blockRequestAck->pleaseWaitMs = 220; + blockRequestAck->pleaseWaitMs = 140; } else { blockRequestAck->pleaseWaitMs = 550; } @@ -583,23 +583,23 @@ 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); + 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); + 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)); + espNotifyTagReturnData(rxframe->src, len - (sizeof(struct MacFrameBcast) + 1)); } // send block data to the tag @@ -628,6 +628,18 @@ void sendBlockData() { pr("Invalid block request received, 0 parts..\n"); requestedData.requestedParts[0] |= 0x01; } + + pr("Sending parts:"); + for (uint8_t c = 0; (c < BLOCK_MAX_PARTS); c++) { + if (c % 10 == 0) pr(" "); + if (requestedData.requestedParts[c / 8] & (1 << (c % 8))) { + pr("X"); + } else { + pr("."); + } + } + pr("\n"); + uint8_t partNo = 0; while (partNo < BLOCK_MAX_PARTS) { for (uint8_t c = 0; (c < BLOCK_MAX_PARTS) && (partNo < BLOCK_MAX_PARTS); c++) { @@ -684,24 +696,24 @@ void sendPong(void *buf) { } void app_main(void) { - esp_event_loop_create_default(); - + esp_event_loop_create_default(); + init_nvs(); - init_led(); + init_led(); init_second_uart(); requestedData.blockId = 0xFF; // clear the array with pending information memset(pendingDataArr, 0, sizeof(pendingDataArr)); - radio_init(curChannel); + radio_init(curChannel); radioSetTxPower(10); pr("RES>"); pr("RDY>"); - ESP_LOGI(TAG, "C6 ready!"); + ESP_LOGI(TAG, "C6 ready!"); - housekeepingTimer = getMillis(); + housekeepingTimer = getMillis(); while (1) { while ((getMillis() - housekeepingTimer) < ((1000 * HOUSEKEEPING_INTERVAL) - 100)) { int8_t ret = commsRxUnencrypted(radiorxbuffer); @@ -741,11 +753,11 @@ void app_main(void) { processAvailDataReq(radiorxbuffer); } break; - case PKT_TAG_RETURN_DATA: - processTagReturnData(radiorxbuffer, ret); - 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) { @@ -763,8 +775,8 @@ void app_main(void) { } } - memset(&lastTagReturn, 0, 8); - 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/radio.c b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/radio.c index f40f9e43..41f7a13c 100644 --- a/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/radio.c +++ b/ARM_Tag_FW/OpenEPaperLink_esp32_C6_AP/main/radio.c @@ -14,6 +14,8 @@ #include "main.h" #include "proto.h" #include "sdkconfig.h" +// if you get an error about soc/lp_uart_reg.h not being found, +// you didn't choose the right build target. :-) #include "soc/lp_uart_reg.h" #include "soc/uart_struct.h" #include "utils.h" @@ -48,62 +50,62 @@ void esp_ieee802154_transmit_done(const uint8_t *frame, const uint8_t *ack, esp_ } void radio_init(uint8_t ch) { - if (packet_buffer == NULL) packet_buffer = xQueueCreate(32, 130); + if (packet_buffer == NULL) packet_buffer = xQueueCreate(32, 130); - // this will trigger a "IEEE802154 MAC sleep init failed" when called a second time, but it works - esp_ieee802154_enable(); - esp_ieee802154_set_channel(ch); - // esp_ieee802154_set_txpower(int8_t power); - esp_ieee802154_set_panid(PROTO_PAN_ID); + // this will trigger a "IEEE802154 MAC sleep init failed" when called a second time, but it works + esp_ieee802154_enable(); + esp_ieee802154_set_channel(ch); + // esp_ieee802154_set_txpower(int8_t power); + esp_ieee802154_set_panid(PROTO_PAN_ID); esp_ieee802154_set_promiscuous(false); esp_ieee802154_set_coordinator(false); esp_ieee802154_set_pending_mode(ESP_IEEE802154_AUTO_PENDING_ZIGBEE); - // esp_ieee802154_set_extended_address needs the MAC in reversed byte order - esp_read_mac(mSelfMac, ESP_MAC_IEEE802154); - uint8_t eui64_rev[8] = {0}; - for (int i = 0; i < 8; i++) { - eui64_rev[7 - i] = mSelfMac[i]; - } - esp_ieee802154_set_extended_address(eui64_rev); - esp_ieee802154_get_extended_address(mSelfMac); + // esp_ieee802154_set_extended_address needs the MAC in reversed byte order + esp_read_mac(mSelfMac, ESP_MAC_IEEE802154); + uint8_t eui64_rev[8] = {0}; + for (int i = 0; i < 8; i++) { + eui64_rev[7 - i] = mSelfMac[i]; + } + esp_ieee802154_set_extended_address(eui64_rev); + esp_ieee802154_get_extended_address(mSelfMac); - esp_ieee802154_set_short_address(0xFFFE); + esp_ieee802154_set_short_address(0xFFFE); esp_ieee802154_set_rx_when_idle(true); esp_ieee802154_receive(); - led_flash(1); - vTaskDelay(100 / portTICK_PERIOD_MS); - led_flash(0); - vTaskDelay(100 / portTICK_PERIOD_MS); - led_flash(1); - vTaskDelay(100 / portTICK_PERIOD_MS); - led_flash(0); + led_flash(1); + vTaskDelay(100 / portTICK_PERIOD_MS); + led_flash(0); + vTaskDelay(100 / portTICK_PERIOD_MS); + led_flash(1); + vTaskDelay(100 / portTICK_PERIOD_MS); + led_flash(0); - ESP_LOGI(TAG, "Receiver ready, panId=0x%04x, channel=%d, long=%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x, short=%04x", - esp_ieee802154_get_panid(), esp_ieee802154_get_channel(), - mSelfMac[0], mSelfMac[1], mSelfMac[2], mSelfMac[3], - mSelfMac[4], mSelfMac[5], mSelfMac[6], mSelfMac[7], - esp_ieee802154_get_short_address()); + ESP_LOGI(TAG, "Receiver ready, panId=0x%04x, channel=%d, long=%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x, short=%04x", + esp_ieee802154_get_panid(), esp_ieee802154_get_channel(), + mSelfMac[0], mSelfMac[1], mSelfMac[2], mSelfMac[3], + mSelfMac[4], mSelfMac[5], mSelfMac[6], mSelfMac[7], + esp_ieee802154_get_short_address()); } -uint32_t lastZbTx = 0; +// uint32_t lastZbTx = 0; bool radioTx(uint8_t *packet) { static uint8_t txPKT[130]; - while (isInTransmit) { - } - while (getMillis() - lastZbTx < 6) { - } led_flash(1); - memcpy(txPKT, packet, packet[0]); - isInTransmit = 1; - lastZbTx = getMillis(); - esp_ieee802154_transmit(txPKT, false); - return true; + while (isInTransmit) { + } + // while (getMillis() - lastZbTx < 6) { + // } + // lastZbTx = getMillis(); + memcpy(txPKT, packet, packet[0]); + isInTransmit = 1; + esp_ieee802154_transmit(txPKT, false); + return true; } void radioSetChannel(uint8_t ch) { - radio_init(ch); + radio_init(ch); } void radioSetTxPower(uint8_t power) {}