From b5a3c8db24eddff077da4715a8b4a20d9b3dd105 Mon Sep 17 00:00:00 2001 From: atc1441 Date: Sun, 5 May 2024 15:52:14 +0200 Subject: [PATCH] BLE Fix --- .../out/TLSR_OpenEPaperLink.elf | Bin 128734 -> 128734 bytes ARM_Tag_FW/OpenEPaperLink_TLSR/src/zigbee.c | 2 +- ESP32_AP-Flasher/src/ble_filter.cpp | 150 +++++++++++++----- ESP32_AP-Flasher/src/ble_writer.cpp | 5 +- binaries/Tag/CC1310_2.9BWR_1.7.0.bin | Bin 58464 -> 58496 bytes binaries/Tag/TLSR_HS_BWY_35_ALPHA.bin | Bin 52896 -> 52912 bytes oepl-definitions.h | 1 + resources/tagtypes/B0.json | 79 ++++++++- resources/tagtypes/B1.json | 79 ++++++++- resources/tagtypes/BA.json | 81 ++++++++++ 10 files changed, 340 insertions(+), 57 deletions(-) create mode 100644 resources/tagtypes/BA.json diff --git a/ARM_Tag_FW/OpenEPaperLink_TLSR/out/TLSR_OpenEPaperLink.elf b/ARM_Tag_FW/OpenEPaperLink_TLSR/out/TLSR_OpenEPaperLink.elf index eb60cce8fcc1344c27202ee4623e467d70c39c5a..338ada135b059f6c6935bd87b37518b9945e473f 100644 GIT binary patch delta 7655 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 Sih-V4=yy*2&F`V5?|%Vl7v3lU diff --git a/ARM_Tag_FW/OpenEPaperLink_TLSR/src/zigbee.c b/ARM_Tag_FW/OpenEPaperLink_TLSR/src/zigbee.c index 6f835f2c..05d6dc03 100644 --- a/ARM_Tag_FW/OpenEPaperLink_TLSR/src/zigbee.c +++ b/ARM_Tag_FW/OpenEPaperLink_TLSR/src/zigbee.c @@ -154,7 +154,7 @@ bool radioInit(void) int32_t radioRxDequeuePkt(uint8_t *dstBuf, uint32_t maxLen, int8_t *rssiP, uint8_t *lqiP) { u8 curr_rx = getRxBuffer(dstBuf, lqiP); - *rssiP = lqiP; + *rssiP = *lqiP; /*if (curr_rx) { diff --git a/ESP32_AP-Flasher/src/ble_filter.cpp b/ESP32_AP-Flasher/src/ble_filter.cpp index a4cb8ad0..c950eb89 100644 --- a/ESP32_AP-Flasher/src/ble_filter.cpp +++ b/ESP32_AP-Flasher/src/ble_filter.cpp @@ -17,6 +17,8 @@ uint8_t gicToOEPLtype(uint8_t gicType) { switch (gicType) { case 0xA0: + return GICI_BLE_TFT_21_BW; + break; case 0x08: return GICI_BLE_EPD_21_BW; break; @@ -55,7 +57,7 @@ uint8_t gicToOEPLtype(uint8_t gicType) { return GICI_BLE_EPD_BWR_29_SILABS; break; default: - return GICI_BLE_UNKNOWN; // Should never happen, return 1.54" + return GICI_BLE_UNKNOWN; break; } } @@ -96,7 +98,7 @@ bool BLE_filter_add_device(BLEAdvertisedDevice advertisedDevice) { theAdvData.src[4] = macReversed[1]; theAdvData.src[5] = macReversed[0]; theAdvData.src[6] = manuData[2]; // We use this do find out what type of display we got for compression^^ - theAdvData.src[7] = 0x00; + theAdvData.src[7] = manuData[6]; theAdvData.adr.batteryMv = manuData[3] * 100; theAdvData.adr.lastPacketRSSI = advertisedDevice.getRSSI(); theAdvData.adr.hwType = gicToOEPLtype(manuData[2]); @@ -120,7 +122,7 @@ bool BLE_filter_add_device(BLEAdvertisedDevice advertisedDevice) { theAdvData.src[3] = macReversed[2]; theAdvData.src[4] = macReversed[1]; theAdvData.src[5] = macReversed[0]; - theAdvData.src[6] = 0x00; // We use this do find out what type of display we got for compression^^ + theAdvData.src[6] = 0x00; theAdvData.src[7] = 0x00; theAdvData.adr.batteryMv = payloadData[14] << 8 | payloadData[15]; theAdvData.adr.temperature = (payloadData[10] << 8 | payloadData[11]) / 10; @@ -169,21 +171,34 @@ uint32_t compress_image(uint8_t address[8], uint8_t* buffer, uint32_t max_len) { file.close(); } - uint8_t giciType = address[6]; // here we "extract" the display info again + uint16_t giciType = (address[7] << 8) | address[6]; // here we "extract" the display info again + + uint8_t screenResolution = (giciType >> 5) & 63; + uint8_t dispPtype = (giciType >> 3) & 3; + uint8_t availColors = ((giciType >> 1) & 3); + uint8_t special_color = ((giciType >> 10) & 12); + uint8_t singleDoubleMirror = giciType & 1; + uint8_t canDoCompression = (giciType & 0x4000) ? 0 : 1; + Serial.printf("BLE Filter options:\r\n"); + Serial.printf("screenResolution %d\r\n", screenResolution); + Serial.printf("dispPtype %d\r\n", dispPtype); + Serial.printf("availColors %d\r\n", availColors); + Serial.printf("special_color %d\r\n", special_color); + Serial.printf("singleDoubleMirror %d\r\n", singleDoubleMirror); + Serial.printf("canDoCompression %d\r\n", canDoCompression); bool extra_color = false; uint16_t width_display = 104; uint16_t height_display = 212; - switch ((giciType >> 5) & 7) // Resolution - { - default: + + switch (screenResolution) { case 0: width_display = 104; height_display = 212; break; case 1: - width_display = 296; - height_display = 128; + width_display = 128; + height_display = 296; break; case 2: width_display = 300; @@ -193,45 +208,78 @@ uint32_t compress_image(uint8_t address[8], uint8_t* buffer, uint32_t max_len) { width_display = 384; height_display = 640; break; - case 5:// TFT 2.1" - width_display = 104; - height_display = 212; + case 4: + width_display = 640; + height_display = 960; + break; + case 5: + width_display = 132; + height_display = 256; + break; + case 6: + width_display = 96; + height_display = 196; break; case 7: - width_display = 168; - height_display = 384; + width_display = 480; + height_display = 640; break; - } - switch ((giciType >> 1) & 3) // Extra color - { - default: - case 0: - extra_color = false; + case 8: + width_display = 128; + height_display = 256; break; - case 1: - case 2: - extra_color = true; + case 9: + width_display = 480; + height_display = 800; + break; + case 10: + width_display = 480; + height_display = 280; break; } - // Yeah, this is no real compression, but maybe it will be solved in the future to the "real" RLE Compression - uint32_t len_compressed = 4; + switch (dispPtype) { + case 0: // TFT + break; + case 1: // EPA + break; + case 2: // EPA1 + break; + case 3: // EPA2 + break; + } + + switch (availColors) { + case 0: // BW + extra_color = false; + break; + case 1: // BWR + extra_color = true; + break; + case 2: // BWY + extra_color = true; + break; + case 3: // BWRY + extra_color = true; + break; + case 4: // BWRGBYO + extra_color = true; + break; + } + switch (singleDoubleMirror) { + case 0: // Single image + break; + case 1: // 2 Images + break; + } + + uint32_t len_compressed = 0; + if (canDoCompression) + len_compressed = 4; uint32_t curr_input_posi = 0; uint32_t byte_per_line = (height_display / 8); for (int i = 0; i < width_display; i++) { - buffer[len_compressed++] = 0x75; - buffer[len_compressed++] = byte_per_line + 7; - buffer[len_compressed++] = byte_per_line; - buffer[len_compressed++] = 0x00; - buffer[len_compressed++] = 0x00; - buffer[len_compressed++] = 0x00; - buffer[len_compressed++] = 0x00; - for (int b = 0; b < byte_per_line; b++) { - buffer[len_compressed++] = ~queueItem->data[curr_input_posi++]; - } - } - if (extra_color) { - for (int i = 0; i < width_display; i++) { + if (canDoCompression) { buffer[len_compressed++] = 0x75; buffer[len_compressed++] = byte_per_line + 7; buffer[len_compressed++] = byte_per_line; @@ -239,6 +287,22 @@ uint32_t compress_image(uint8_t address[8], uint8_t* buffer, uint32_t max_len) { buffer[len_compressed++] = 0x00; buffer[len_compressed++] = 0x00; buffer[len_compressed++] = 0x00; + } + for (int b = 0; b < byte_per_line; b++) { + buffer[len_compressed++] = ~queueItem->data[curr_input_posi++]; + } + } + if (extra_color) { + for (int i = 0; i < width_display; i++) { + if (canDoCompression) { + buffer[len_compressed++] = 0x75; + buffer[len_compressed++] = byte_per_line + 7; + buffer[len_compressed++] = byte_per_line; + buffer[len_compressed++] = 0x00; + buffer[len_compressed++] = 0x00; + buffer[len_compressed++] = 0x00; + buffer[len_compressed++] = 0x00; + } for (int b = 0; b < byte_per_line; b++) { if (queueItem->len <= curr_input_posi) buffer[len_compressed++] = 0x00; @@ -247,10 +311,12 @@ uint32_t compress_image(uint8_t address[8], uint8_t* buffer, uint32_t max_len) { } } } - buffer[0] = len_compressed & 0xff; - buffer[1] = (len_compressed >> 8) & 0xff; - buffer[2] = (len_compressed >> 16) & 0xff; - buffer[3] = (len_compressed >> 24) & 0xff; + if (canDoCompression) { + buffer[0] = len_compressed & 0xff; + buffer[1] = (len_compressed >> 8) & 0xff; + buffer[2] = (len_compressed >> 16) & 0xff; + buffer[3] = (len_compressed >> 24) & 0xff; + } return len_compressed; } diff --git a/ESP32_AP-Flasher/src/ble_writer.cpp b/ESP32_AP-Flasher/src/ble_writer.cpp index 299e4a2d..8f4df471 100644 --- a/ESP32_AP-Flasher/src/ble_writer.cpp +++ b/ESP32_AP-Flasher/src/ble_writer.cpp @@ -92,7 +92,10 @@ bool BLE_connect(uint8_t addr[8]) { pClient->disconnect(); return false; } - vTaskDelay(100 / portTICK_PERIOD_MS); + uint32_t timeStart = millis(); + while (millis() - timeStart <= 5000) {// We wait for a few seconds as otherwise the connection might not be ready! + delay(100); + } if (!BLE_connected) return false; Serial.printf("BLE starting to get service\r\n"); diff --git a/binaries/Tag/CC1310_2.9BWR_1.7.0.bin b/binaries/Tag/CC1310_2.9BWR_1.7.0.bin index 1b53f2706d60d98e89340537d94428b251efd807..00af9845366156e533a118f68d330aa651191dc8 100644 GIT binary patch delta 6449 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 JVB`JX{{^9QIuQT> delta 6406 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 diff --git a/binaries/Tag/TLSR_HS_BWY_35_ALPHA.bin b/binaries/Tag/TLSR_HS_BWY_35_ALPHA.bin index 297ea657e0423ad577099db5b229cd7c75294e91..f45598c67b240db9144752cb2c5e8ffdc4813808 100644 GIT binary patch delta 4707 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

aXUcceJKoa z^f%55-{TzR$6*I0^J^*bN)mY&BuN`bgGA)c?PH(ec7u@P=&-2t4wveULpR%FT6G9h zBImH=U=R1dEQxM>k})&)6Rcj;;)8=Y&luHA!Y0sj;7Ke zlrzAo=03HGIJaLnJ4mKyJo@I%p<>D9vAA9iX2$mmI;$L@}mR`xZA+1gmHk^ z@p}as;I+I=@Bv=QXG-BLrX<815<;@pRR8;;6sU_F7^t!x-|_yCLLQxCnEloRSo*%LH{2vG5_M|M>1jC zO+1pMnziPQuBotdAwpLG-imb5WJar}1p{!_xVA|#tZ>mjT;%r4ijlXOS>(+D3op4) z=`7hSEGyGexj@fx#lW}F72~&4xI`i4NaPq?$k!rAp*t3{WJ~X|K%P)&;PzQeW!E02 z=Q-b?`)YVoq-Axn+jz5Ac~{(lI+&W{>hUkQpA?lf@F8i7q=IC)YlpI#Q5n!d6gqDy zsHIBPcg6Wj31z9&eB#89Q0P62#b*OYw=80<7hC3H2RUIWNq0H>mTPxbNXtdOWWCuB zi$=}Nf}jknuO$iFHQMdYi695iV_3W%7QaoH%yhA@kqO&};b~;S_6&24Gr`no`A zf|O~ISI?m%D0C%SJR@1SGjURz^Osec&52d&x-I74?)+bkrg5(;_e5*-8%tL0e8wWx zXb%bOoS}K(5Np&Dt&z*p#r~dX8f$QntZYnG{lyXAx`+|;c966*YLy>2`ZnVGB+xk8 z`~z3Tq~2X&Rrs=?I%fD?(8ca|JYyAWx8BjW26?oTi9D-A{1F78$52JRcMtPD0a@H~RrR=s1ta zr|dc@M$x)Rr`RLpfi+X}okxsN7me_V@QD41H4U?Q4|DZ^N%tA#mp{r;M@rL1qi=dHb)j_%XVof}&BV Zu&8u&L22=rK>hx`qw#Bj?n}R;{tMLN(E|Vg delta 4686 zcmZWte_T^nmcRGCmq$WC(C9!wB>WO6q6k_Ass<}I3}b~VE&hfA3Sty(yREI7sA#0s zHG0Q=$xB}HLa@>mM{RViqpnG9>yOTipSH7Gceb{5)=p8=6}2LuC41frWjdez~p?)RSiBRM9}qCi{Yv3Oj26yqSdj5D$5yN4e|V59GrYL)^kec3T5u{y!ELG3oo z78O=6xfOc~k0G9sGcs1XS?jNCC6Tk$2^F*DFKtHFJ2oR*92MgJ+ocpEtg{I{>Xxc) z3qr~_TG4yt;i#i{9yzEFI`u-zrve+y$YQJ)g-+EVCpze$p3M&C2M4(;!fqvFeUAuf zvnI7U%h`AXV|DY$t1i;$>Gl_>h~fl&mdIF%Z1;QN0}Er_V`qbm^{+&oo||dmQ6~$&Q)eZR#;%H%_KKta>2LGX`qh~f;*p94szc(Q?jNiM-*W%vR-!li)ij) ztXG}m)D9MV7qc4uB(S|l_GL`dZUVSsGZC@@?*MANh|r%CThSD9BSVvm_97Go^rN;F zy#c%vs3^A;odA9b=xAIkdK&t_1O63B8Lu&QfseC5H-UC(5Q+z@EFk}%F=}b}sH3At zS{BB7)Kw6jV~Bm%N9X8uK@7|HiT&GQt?0@znA$byXWa*ON|Z+Z)-_(OHBjx5^r+rZ zg9&;{#30RaNnBw)Xy0WzXza<71DIS%QE3JrouWoPZ9 zv7emD5pX(LG$8{oC#DHgp?z|~0;oq-?ggAN=Kw+#K-EC?KrKLtDKUX5&5pbrdX zPFqj8rA45v#5o!kfq~gdKueMd&JTyJI^6jN@ltjzRg00i(&6MW5oo5^r%a zw)(y)zK%0OeBy`#!x_2&ke7Vg`K%xfT;pmzctl!IF-I-=BL_3W7hLxLXrq;FWWdC1~8 z`FLg;KJ2?Sb5aCu^l9goGx(CP;n#^YV83;qTLHb41!pkmt}kq6uz{20EOTb{A;2Uev7o9D?FOUtp6BrhA2{gVyXJhR5i+SzvYFxz9SQaJ@SqKgPq;*~Y*{X@ChsguF8ENmX{iF)99LR3_N7(elckC~fhXKTfH35> zv8ZT2J1ufQ^Y)?h_Y~%qq$k`Ya($UL*(pfvWEVbhmbwe}6Ws?a*$}}hM>tQ$EYGE$ z2xRxNar0LWh3FRkF+`t$AnCb!9~!uz~Z0#Q9>)a1QZ06KLYv+=oruufaX9d zLQZmgc^Q6}JYK#)UE`XrERV5+K0?6A)QhfnlM=I;faTyWnvvCi(Sf8v-7fxI7iFC;M8U5!wP&?}A zwCKP-o`mYh%=n<9GOPq^>C&e@6B+m1(=&26hq4 zKsFa`s52t)du3rzDpfzZ+mxc&%fBC8!EP_l(bopibV>d$Nn2fj*N~T1C*v*T_0<`; zi3qDp@zdmgRa{E;JWlCwbId zF0K2T4EzddS~Fi&Y`p65kbP1#@;1+I45C6QmqvF5`)v8)p*i()HDtaq30D%MaY4jIVFYA& zf?PCaVs!#EqfZa)eLgG1t!?y>F1V`xV2^KRYI~7Z)70CHqyMd zFsalQs~%TD)$|x+z~@XG8$IaF(f_+83VPE>U~O9AP4Fmr{s6cLgc?}2wwjHE%c5d{ zOW+5%BA~fEf}=^tno%fZ3ZaI6jwVU#a!g+cDrHKrpS$ZG;BMIA&=P4+YH)xnh2wjG z`__)yDRlxIe9RSuDj`Y>9DoDdC|=QtKTlv7fV&t1XF| zb_eQ;4p5$GIvY+~Np2@UwIt$qh<1Ics>4Z(^8vtmvTA*)sl<^7`f(2F7Nuz|*h~GV z9T&wBV3Q9#2KYqBRgkJ3bnn2&pF)du;9vppRC#oWH+e9U#w84m`;|k|KH#xBUXP5& z;24W-$P;V8lgjal*b7_%{E?^M#9@cNLvntdXQ%=HWoTXFaWEhFkNg$*eg?hCz<=Pw z18?zpq7EE<$H&6;vQs<*?Qi&PU~yJXLu!4=Ti|C`JZ6+l9iL+DL#gD zY$UXys&*bE?vVrgLAR3s&VmN~J)_nBZrU)GX7txB=slJH9O$O=44ncAO6?c;&nyz3 zI6PYFJ;#4yk-Vf0SxW60zLT$PX5+qg(Vl3O9XyUAPz+rNZgjyu?g1%#lc?KVDM5_R ziG3X05^ok1yzTPCTcMBJ=^6nqg@3b*fM-%F9eyp;Qoq5e@L=+T^^5X2skPoW@2zAU z_l~WfD|g2lXL)I4>$%WPMcTRtxc?;EH_e;0SAe&#U!<{AI}rMika;o}$~_C(TLt8` zDWU>ltt0_#Hq9v6C`=K}kjQI-TAU7iy|7!PfExu$YzN*XWXg#)2w5_(6|!Z%On6G> zi^%59nUhKd6Qr0bU@uLL3rvdg>gPZ|L8#G3dgGC@bB-T*)ASt%+!Yt-2dJNOi!*sTYB>=$dq-1LnybD)s&B&>8jI`uc z)5Y<((YREo776Ys2Q{<{ zRfAGLoqWG_p8C4HouqyrnYC@7cD|!)L|%pdJUwl^SP3~C;=|tIXZE(7d3*SA-byz7 z{O8%PWx%)dSO$Cn8wUI>UV^up56_b-8YyEY$=34dC<^>x2=7&-c6(grA;&NAUdT&$ z_jOBX^NzoxZ6NOLadk8GJw3O|eDE7E*~z{ojB#X0ay*?(}}1f%~u@ZdV3S=;vPJX*l@W z9Z$eaYl|HoCiN%VVvTtX@saWHS4%(VhxZ)smgEYXPEJ{JFZGkiLrb=%+byO0b5c*l zM_h