From 1238047d47b96591994237b37019a7d81cde2230 Mon Sep 17 00:00:00 2001 From: RogueMaster Date: Fri, 2 Dec 2022 17:12:58 -0500 Subject: [PATCH] nrfupd and animation assets upd --- ReadMe.md | 4 +- applications/plugins/nrf24scan/README.md | 12 +- .../plugins/nrf24scan/Screenshot-1.png | Bin 2345 -> 2347 bytes .../plugins/nrf24scan/Screenshot-4.png | Bin 1521 -> 1664 bytes .../plugins/nrf24scan/Screenshot-5.png | Bin 3238 -> 7483 bytes applications/plugins/nrf24scan/addr.txt | 5 - applications/plugins/nrf24scan/addr1.txt | 3 - .../plugins/nrf24scan/nrf24_packet_decoder.py | 99 ++++++ applications/plugins/nrf24scan/nrf24scan.c | 312 ++++++++++++------ .../dolphin/Kuronons_RMCFW_128x64/meta.txt | 10 +- .../dolphin/L1_New_year_128x64/frame_0.bm | Bin 0 -> 804 bytes .../dolphin/L1_New_year_128x64/frame_1.bm | Bin 0 -> 827 bytes .../dolphin/L1_New_year_128x64/frame_2.bm | Bin 0 -> 813 bytes .../dolphin/L1_New_year_128x64/frame_3.bm | Bin 0 -> 813 bytes .../dolphin/L1_New_year_128x64/meta.txt | 14 + .../dolphin/Sasquach_Blaster_128x64/meta.txt | 8 +- .../Sasquach_CloudG0ku_128x64/meta.txt | 10 +- .../dolphin/Sasquach_Narut0_128x64/meta.txt | 8 +- .../dolphin/Sasquach_RMCF_128x64/meta.txt | 10 +- 19 files changed, 364 insertions(+), 131 deletions(-) delete mode 100644 applications/plugins/nrf24scan/addr.txt delete mode 100644 applications/plugins/nrf24scan/addr1.txt create mode 100644 applications/plugins/nrf24scan/nrf24_packet_decoder.py create mode 100644 assets/resources/dolphin/L1_New_year_128x64/frame_0.bm create mode 100644 assets/resources/dolphin/L1_New_year_128x64/frame_1.bm create mode 100644 assets/resources/dolphin/L1_New_year_128x64/frame_2.bm create mode 100644 assets/resources/dolphin/L1_New_year_128x64/frame_3.bm create mode 100644 assets/resources/dolphin/L1_New_year_128x64/meta.txt diff --git a/ReadMe.md b/ReadMe.md index 068fe3559..085afa3be 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -32,8 +32,8 @@ Thank you to all the supporters! - Renamed some FAPs to fix ordering in Applications, delete your `/ext/apps` folder to get rid of duplicates - Removed: [VB Lab Migration Assistant (By GMMan)](https://github.com/GMMan/flipperzero-vb-migrate) `Req: Vital Bracelet` (due to fap error) - Updated: [Dice (By Ka3u6y6a)](https://github.com/Ka3u6y6a/flipper-zero-dice) -- Updated: [NRF24 Scanner (By vad7)](https://github.com/vad7/nrf24scan) - Updated: [Wii EC Analyser (By csBlueChip)](https://github.com/csBlueChip/FlipperZero_WiiEC) +- Updated: [NRF24 Scanner v1.5 (By vad7)](https://github.com/vad7/nrf24scan) ## Install from Release FLASH STOCK FIRST BEFORE UPDATING TO CUSTOM FIRMWARE! @@ -225,7 +225,7 @@ $ ./fbt resources icons dolphin_ext - [Music Player (By DrZlo13)-OFW](https://github.com/flipperdevices/flipperzero-firmware/pull/1189) - [NFC Magic (By gornekich)](https://github.com/flipperdevices/flipperzero-firmware/pull/1966) - [NRF Sniff (By mothball187)](https://github.com/mothball187/flipperzero-nrf24/tree/main/nrfsniff) ([Pin Out](https://github.com/RogueMaster/flipperzero-firmware-wPlugins/tree/420/applications/nrfsniff) from nocomp/Frog/UberGuidoZ) `Req: NRF24` -- [NRF24 Scanner (By vad7)](https://github.com/vad7/nrf24scan) +- [NRF24 Scanner v1.5 (By vad7)](https://github.com/vad7/nrf24scan) - [Ocarina (By invalidna-me)](https://github.com/invalidna-me/flipperzero-ocarina) [Here are the LOTZ Songs](https://www.zeldadungeon.net/wiki/Ocarina_of_Time_Songs) - [Paint (By n-o-T-I-n-s-a-n-e)](https://github.com/n-o-T-I-n-s-a-n-e) - [Password Generator (By anakod)](https://github.com/anakod/flipper_passgen) diff --git a/applications/plugins/nrf24scan/README.md b/applications/plugins/nrf24scan/README.md index d47c97a6f..6c4d91a4e 100644 --- a/applications/plugins/nrf24scan/README.md +++ b/applications/plugins/nrf24scan/README.md @@ -1,7 +1,10 @@ # NRF24 scanner with logging and resend ability for Flipper Zero -An [NRF24](https://www.sparkfun.com/datasheets/Components/SMD/nRF24L01Pluss_Preliminary_Product_Specification_v1_0.pdf) driver for the [Flipper Zero](https://flipperzero.one/) device. The NRF24 is a popular line of 2.4GHz radio transceivers from Nordic Semiconductors. This library is not currently complete, but functional. - +An [NRF24](https://www.sparkfun.com/datasheets/Components/SMD/nRF24L01Pluss_Preliminary_Product_Specification_v1_0.pdf) driver for the [Flipper Zero](https://flipperzero.one/) device. The NRF24 is a popular line of 2.4GHz radio transceivers from Nordic Semiconductors.
+NRF24L01+ Enhanced ShockBurst packet decoder example using Python: [nrf24_packet_decoder.py](https://raw.githubusercontent.com/vad7/nrf24scan/master/nrf24_packet_decoder.py)
+
+Flipper Zero FAP file: [Nrf24_Scanner.fap](https://raw.githubusercontent.com/vad7/nrf24scan/master/Nrf24_Scanner.fap)
+ Settings file (default addr.txt) format:
Rate: 0/1/2 - rate in Mbps (=0.25/1/2)
@@ -31,15 +34,16 @@ Long press OK - view addresses.



-Decode the Packet Control Field (long press OK in the list and then press '>').
+Decode the Packet Control Field and check CRC (long press OK in the list and then press '<' / '>').
ESB (Enhanced Shockburst) option must be turned off. +Press '>' to decode CRC.



1 - pipe #
-2 - Payload length (for valide packet must be 1..20 hex, or 0x33 if not DPL)
+2 - Payload length (for valide packet must be 1..20 or 33 hex)
3 - PID (2 bit) + NO_ACK (1 bit)


diff --git a/applications/plugins/nrf24scan/Screenshot-1.png b/applications/plugins/nrf24scan/Screenshot-1.png index 082e7d5aff7efd158731aa9809a3cd672bc8246f..61ca892d8fd4025ace79f7c4558d6094187bd696 100644 GIT binary patch literal 2347 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 TCrKFN-3RjZ3^>I+8FlsF5slzD diff --git a/applications/plugins/nrf24scan/Screenshot-4.png b/applications/plugins/nrf24scan/Screenshot-4.png index 375f7b7778e3db3d00f2b9c443494214f524111e..6351cdd3fa6fe68461e5524a4bacd29d0d67cff7 100644 GIT binary patch literal 1664 zcmeHI>rYc>9DWOwTLqmis}~AO%yfw>U@N+|wCKVFG~RYeR!2ehp>z}!=opkMdCo66 z@B4e6=lwnBZ9IK4Cn0`kJOCgeFE{%g03z^L5{M1Mu_yd=9OBAz`4RvUN5c>4>wSs4 z0ElMfWgmI3M(de9qH49)p|&V1{ApPZUp zrwpx9ppHKMW&lZI!QsmQWOIcF&&t~8-6*zhz&P|~$;Yl%aX?joPN3A@`G-i04O z8;&lw>!sMuj>!VwH1emS-YSd&Tf)n6i!$I>ez948TuHCA%WFM~ddUvLN?g+wKcZeP zviD}xEyqa(+DIsd;7r&Lf!0WOR8&TVHNi3SV+u>c&0imR&$mjx>XP? zuzsI0BG=N{8Nlv=o%e`~0O1 z&vEOg2QX5p+B(ZfE2Vcy_}&=JKkZ9rXogc3Ga-pC#KNkS^+YV$c&cK5kEgib|?)Gk6Dj>Gd* z{15*bCl>bWZJmW#DxT`N|EWKKWFaAaT9$cyvN*|L5h3buI>oe#$(&%%ij!(5OkZv4 zI)izrB(-u_?~*z?5Ve=5pW>`fB`KbL%ocv|@3AYM4ai50%$dGWGiUCe687mrZTH#4 z5fntW4)saR2CEpU_WYm|Y!jMM0b6YGl^|JzH}~Zalw(;r%ohP=Kahbh{1b-WqBmwM zQrA?d!c(Q8BUFCCSRIsB77|i1%-yzH;`Tqne;-aPKEJF?Yj9m2$Sm}wBC_Aasx_7M g)HTAiE?l79?SHf7=Y%@^N&$IqpUm!k>)dC51IJugjsO4v literal 1521 zcmeAS@N?(olHy`uVBq!ia0y~yU;;8388|?c*QZDWAjMhW5n0T@z;^_M8K-LVNi#68 zF7|YB45^s&_U_5v+a3%KfvXo5$jompsOdXCW3`l<o?gM4p_1V7z66_T~fV{`YrF)#!&F$kyv zsq^2vzx1q2?O#`Weogi9zfL!2Rj!};e{=Lq%X1HR?UoT_n63^{{56;F!HM4=`|tb< z+qP@@KfT|q?^3_W+RahF@wbCvhYBM@hY&-u-?;x|zx@7i zReFuCjTwVo3j>1-CxgS4?d44JmG^&T{Iu;$@Be%4nr!azIgG5)wafS3`u$hq83Tg^ z&?pU{iB&t=xG$uzKwJuR@Yjm{C!XI^uRH$x<6l088(o474pX3JUir;1ZQtawmCEy3 zw>gmr<=9K#Xjs3=5W2Ovo2a3-&uUmfo8~2>kNM_%*ZoD4ze{QASnM>(s-`Cpy>U;le z@2y?l+nHn9kt{e|8r`6VWaRPRuHW__pOdU(>+XI3@9UVudnFjbAq4W2uPt}Rmpwn$ z-V4qCmtbGL-~YyLmIwQKkYf40xMcC!@5VpovYSXE^yPljSrGn?cYojB^R30a-&2u7 z?`=6l_PU38Uu|Zt?Q5^hp7)jI&U7T_0fW$OTUGiR%ZB7NKdr6ZKU5;wCb#Y(6S6hH zc!UQ1C^eEo!uGr!!-Ku+2kL(r9W8nb5FEo_Pc}c85m|LK?sr*dHUY`Z>L_L%Xtng!nW^n+y89tfjVIMDgrIG{xfunN={jPlkXa^ P3}^6k^>bP0l+XkK0%Zg1 diff --git a/applications/plugins/nrf24scan/Screenshot-5.png b/applications/plugins/nrf24scan/Screenshot-5.png index 0b4a59dd1a1cf3de6a4c5c3c91ff73d7ffb7ebbb..d9e3173a260ac6a61d6ad48e6db750d903b860bf 100644 GIT binary patch literal 7483 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 diff --git a/applications/plugins/nrf24scan/addr.txt b/applications/plugins/nrf24scan/addr.txt deleted file mode 100644 index a79064baf..000000000 --- a/applications/plugins/nrf24scan/addr.txt +++ /dev/null @@ -1,5 +0,0 @@ -Rate: 1 -Ch: 120 -P0: C8C801 -P1: C8C802 -P2: 03 diff --git a/applications/plugins/nrf24scan/addr1.txt b/applications/plugins/nrf24scan/addr1.txt deleted file mode 100644 index 5a10c4298..000000000 --- a/applications/plugins/nrf24scan/addr1.txt +++ /dev/null @@ -1,3 +0,0 @@ -Rate: 1 -Ch: 120 -P0: C8C8E5 diff --git a/applications/plugins/nrf24scan/nrf24_packet_decoder.py b/applications/plugins/nrf24scan/nrf24_packet_decoder.py new file mode 100644 index 000000000..9e1a42a18 --- /dev/null +++ b/applications/plugins/nrf24scan/nrf24_packet_decoder.py @@ -0,0 +1,99 @@ +# +# NRF24L01+ Enhanced ShockBurst packets decoder +# +payload_len_default = 4 +packets = \ +( + '10101010 11101110 00000011 00001000 00001011 01000111 000100 10 0 10101010 10101010 10101010 10101010 00011101', + '10101010 11001000 11001000 11000011 110011 10 0 00001011 00000011 00000101 00000000 0010001100100000', +) + +def bin2hex(x): + def bin2hex_helper(r): + while r: + yield r[0:2].upper() + r = r[2:] + + fmt = "{0:0" + str(int(len(x) / 8 * 2)) + "X}" + hex_data = fmt.format(int(x, 2)) + return list(bin2hex_helper(hex_data)) + + +def split_packet(packet, parts): + """Split a string of 1s and 0s into multiple substrings as specified by parts. + Example: "111000011000", (3, 4, 2) -> ["111", "0000", "11", "000"] + :param packet: String of 1s and 0s + :param parts: Tuple of length of substrings + :return: list of substrings + """ + out = [] + packet = packet.replace(' ', '') + for part_length in parts: + out.append(packet[0:part_length]) + packet = packet[part_length:] + out.append(packet) + return out + + +def parse_packet(packet, address_length): + """Split a packet into its fields and return them as tuple.""" + preamble, address, payload_length, pid, no_ack, rest = split_packet(packet=packet, + parts=(8, 8 * address_length, 6, 2, 1)) + payload, crc = split_packet(packet=rest, parts=((payload_len_default if int(payload_length, 2) > 32 else int(payload_length, 2)) * 8,)) + + assert preamble in ('10101010', '01010101') + assert len(crc) in (8, 16) + + return preamble, address, payload_length, pid, no_ack, payload, crc + + +def crc(bits, size=8): + """Calculate the crc value for the polynomial initialized with 0xFF/0xFFFF) + :param size: 8 or 16 bit crc + :param bits: String of 1s and 0s + :return: + :polynomial: 1 byte CRC - standard is 0x107 = 0b100000111 = x^8+x^2+x^1+1, result the same for 0x07 + :polynomial: 2 byte CRC - standard is 0x11021 = X^16+X^12+X^5+1, result the same for 0x1021 + """ + if size == 8: + polynomial = 0x107 + crc = 0xFF + else: + polynomial = 0x11021 + crc = 0xFFFF + max_crc_value = (1 << size) - 1 # e.g. 0xFF for mode 8bit-crc + for bit in bits: + bit = int(bit, 2) + crc <<= 1 + if (crc >> size) ^ bit: # top most lfsr bit xor current data bit + crc ^= polynomial + crc &= max_crc_value # trim the crc to reject carry over bits + return crc + + +if __name__ == '__main__': + for packet in packets: + fld = packet.split(' '); + address_length = -1 + for f in fld: + if len(f) == 6: break + address_length += 1 + preamble, address, payload_length, pid, no_ack, payload, crc_received = \ + parse_packet(packet=packet, address_length=address_length) + crc_size = len(crc_received) + crc_received = hex(int(crc_received, 2)) + print(f"Packet: {packet}") + print('\n'.join(( + f'Preamble: {preamble}', + f'Address: {address_length} bytes - {bin2hex(address)}', + f'Payload length in packet: {int(payload_length, 2)}, used: {(payload_len_default if int(payload_length, 2) > 32 else int(payload_length, 2))}', + f'Pid: {int(pid, 2)}', + f'No_ack: {int(no_ack, 2) == 1}', + f'Payload: {bin2hex(payload)}', + f'CRC{crc_size}: {crc_received}'))) + crc_calculated = hex(crc(address + payload_length + pid + no_ack + payload, size=crc_size)) + if crc_received == crc_calculated: + print('CRC is valid!') + else: + print(f'CRC mismatch! Calculated CRC is f{crc_calculated}.') + print('-------------') diff --git a/applications/plugins/nrf24scan/nrf24scan.c b/applications/plugins/nrf24scan/nrf24scan.c index 49aa7976d..9a62af271 100644 --- a/applications/plugins/nrf24scan/nrf24scan.c +++ b/applications/plugins/nrf24scan/nrf24scan.c @@ -11,9 +11,10 @@ #include #include #include +#include #define TAG "nrf24scan" -#define VERSION "1.4" +#define VERSION "1.5" #define MAX_CHANNEL 125 #define MAX_ADDR 6 @@ -61,6 +62,7 @@ uint8_t NRF_ESB = 0; // 0 - ShockBurst, 1 - Enhanced ShockBurst uint8_t NRF_DPL = 0; // 1 - Dynamic Payload Length uint8_t NRF_CRC = 0; // 1 - No, 1 - CRC 1byte, 2 - CRC 2byte uint8_t NRF_Payload = 32; // len in bytes, max 32 +uint8_t NRF_AA_OFF = 0; // Disable Auto Acknowledgement bool NRF_ERROR = 0; struct { @@ -86,6 +88,7 @@ uint8_t menu_selected = 0; uint32_t start_time; uint8_t view_log_decode_PCF = 0; // view log: 1 - decode packet control field (9b) when ESB off. After pipe # (hex): +uint8_t view_log_decode_CRC = 0; // CRC bytes - 1/2, 0 - none #define menu_selected_max 5 enum { @@ -138,7 +141,7 @@ static void add_to_str_hex_bytes_shift_9b(char* out, char* arr, int bytes) { out += strlen(out); arr++; // +8b do { - snprintf(out, 4, "%02X", (((*arr) & 0x7F) << 1) | (*(arr + 1) >> 7)); + snprintf(out, 4, "%02X", ((uint8_t)(*arr << 1)) | (*(arr + 1) >> 7)); arr++; out += 2; } while(--bytes); @@ -325,7 +328,7 @@ static uint8_t load_settings_file(Stream* file_stream) { FURI_LOG_D(TAG, "load failed. file_size: %d", file_size); return 1; } - file_size = MIN(file_size, LOG_REC_SIZE * MAX_LOG_RECORDS * 2 + 100); + file_size = MIN(file_size, (size_t)LOG_REC_SIZE * MAX_LOG_RECORDS * 2 + 100); file_buf = malloc(file_size + 1); if(file_buf == NULL) { FURI_LOG_D(TAG, "Memory low, need: %d", file_size); @@ -338,7 +341,7 @@ static uint8_t load_settings_file(Stream* file_stream) { int16_t line_num = 0; memset((uint8_t*)&addrs, 0, sizeof(addrs)); bool log_loaded = false; - while(line_ptr && line_ptr - file_buf < file_size) { + while(line_ptr && (size_t)(line_ptr - file_buf) < file_size) { char* end_ptr = strstr((char*)line_ptr, "\n"); if(end_ptr == NULL) end_ptr = file_buf + file_size; @@ -353,7 +356,7 @@ static uint8_t load_settings_file(Stream* file_stream) { *(end_ptr - 1) = '\0'; line_len--; } - FURI_LOG_D(TAG, " L#%d: [%d]%s", line_num, line_len, line_ptr); + //FURI_LOG_D(TAG, " L#%d: [%d]%s", line_num, line_len, line_ptr); if(strncmp(line_ptr, SettingsFld_Rate, sizeof(SettingsFld_Rate) - 1) == 0) { NRF_rate = atoi(line_ptr + sizeof(SettingsFld_Rate)); } else if(strncmp(line_ptr, SettingsFld_Ch, sizeof(SettingsFld_Ch) - 1) == 0) { @@ -373,23 +376,12 @@ static uint8_t load_settings_file(Stream* file_stream) { switch(a) { case '0': addrs.addr_len = ConvertHexToArray(line_ptr, addrs.addr_P0, 5); - FURI_LOG_D( - TAG, - " +Addr(%d): %02X%02X%02X...", - addrs.addr_len, - addrs.addr_P0[0], - addrs.addr_P0[1], - addrs.addr_P0[2]); + //FURI_LOG_D(TAG, " +Addr(%d): %02X%02X%02X...", addrs.addr_len, addrs.addr_P0[0], addrs.addr_P0[1], addrs.addr_P0[2]); if(addrs.addr_len >= 2) err = 0; break; case '1': ConvertHexToArray(line_ptr, addrs.addr_P1, 5); - FURI_LOG_D( - TAG, - " +Addr: %02X%02X%02X...", - addrs.addr_P0[1], - addrs.addr_P1[1], - addrs.addr_P1[2]); + //FURI_LOG_D(TAG, " +Addr: %02X%02X%02X...", addrs.addr_P0[1], addrs.addr_P1[1], addrs.addr_P1[2]); break; case '2': ConvertHexToArray(line_ptr, &addrs.addr_P2, 1); @@ -416,7 +408,9 @@ static uint8_t load_settings_file(Stream* file_stream) { } if(log_arr_idx < MAX_LOG_RECORDS - 1) { ConvertHexToArray( - line_ptr, APP->log_arr + log_arr_idx * LOG_REC_SIZE, MIN(NRF_Payload, 32)); + line_ptr, + APP->log_arr + log_arr_idx * LOG_REC_SIZE, + MIN(NRF_Payload + 1, LOG_REC_SIZE)); log_arr_idx++; } } @@ -447,14 +441,15 @@ static void prepare_nrf24() { 0x70 | ((NRF_CRC == 1 ? 0b1000 : NRF_CRC == 2 ? 0b1100 : 0))); // Mask all interrupts - nrf24_write_reg(nrf24_HANDLE, REG_SETUP_RETR, NRF_ESB ? 1 : 0); // Automatic Retransmission - nrf24_write_reg(nrf24_HANDLE, REG_EN_AA, 0); // Disable auto acknowledgement + nrf24_write_reg(nrf24_HANDLE, REG_SETUP_RETR, NRF_ESB ? 0x11 : 0); // Automatic Retransmission + nrf24_write_reg( + nrf24_HANDLE, REG_EN_AA, NRF_AA_OFF || !NRF_ESB ? 0 : 0x3F); // Auto acknowledgement nrf24_write_reg( nrf24_HANDLE, REG_FEATURE, - 1 + (NRF_DPL ? - 4 : - 1)); // Enables the W_TX_PAYLOAD_NOACK command, Disable Payload with ACK, set Dynamic Payload + NRF_DPL ? + 4 + 1 : + 1); // Enables the W_TX_PAYLOAD_NOACK command, Disable Payload with ACK, set Dynamic Payload nrf24_set_maclen(nrf24_HANDLE, addrs.addr_len); for(int i = 0; i < addrs.addr_len; i++) addr[i] = addrs.addr_P0[addrs.addr_len - i - 1]; nrf24_write_buf_reg(nrf24_HANDLE, REG_RX_ADDR_P0, addr, addrs.addr_len); @@ -525,7 +520,6 @@ bool nrf24_read_newpacket() { if(APP->log_arr == NULL) return false; bool found = false; uint8_t packetsize; - uint8_t packet[32] = {0}; uint8_t* ptr = APP->log_arr + log_arr_idx * LOG_REC_SIZE; uint8_t status = nrf24_rxpacket(nrf24_HANDLE, ptr + 1, &packetsize, !NRF_DPL); if(status & RX_DR) { @@ -561,6 +555,37 @@ bool nrf24_send_packet() { return last_packet_send_st; } +uint16_t calc_crc(uint32_t crc, uint8_t* ptr, uint8_t bitnum, uint16_t bits) { + //uint8_t bitnum = 7; + uint32_t crc_high, polynom; + if(view_log_decode_CRC == 2) { + crc_high = (1 << 16); + polynom = 0x11021; // X^16+X^12+X^5+1 + } else { + crc_high = (1 << 8); + polynom = 0x107; // x^8+x^2+x^1+1 + } + while(bits--) { + crc <<= 1; + if(((crc & crc_high) != 0) ^ ((*ptr >> bitnum) & 1)) crc ^= polynom; + if(bitnum == 0) { + ptr++; + bitnum = 7; + } else + bitnum--; + } + return crc & (view_log_decode_CRC == 2 ? 0xFFFF : 0xFF); +} + +// shifted 1 bit right +uint16_t get_shifted_crc(uint8_t* pcrc) { + uint16_t crc = ((uint8_t)(*pcrc << 1)) | (*(pcrc + 1) >> 7); + if(view_log_decode_CRC == 2) { + crc = (crc << 8) | (((uint8_t)(*(pcrc + 1) << 1))) | (*(pcrc + 2) >> 7); + } + return crc; +} + static void render_callback(Canvas* const canvas, void* ctx) { const PluginState* plugin_state = acquire_mutex((ValueMutex*)ctx, 25); if(plugin_state == NULL) return; @@ -580,6 +605,10 @@ static void render_callback(Canvas* const canvas, void* ctx) { if(NRF_DPL) strcat(screen_buf, " DPL"); canvas_draw_str(canvas, 80, 20, screen_buf); } + if(NRF_AA_OFF) { + canvas_draw_str(canvas, 61, 20, "AA"); + canvas_draw_line(canvas, 60, 21, 72, 12); + } snprintf( screen_buf, sizeof(screen_buf), @@ -588,21 +617,19 @@ static void render_callback(Canvas* const canvas, void* ctx) { NRF_rate == 1 ? "1M" : "250K"); // menu_selected = 2 canvas_draw_str(canvas, 10, 30, screen_buf); - canvas_set_font(canvas, FontBatteryPercent); - snprintf(screen_buf, sizeof(screen_buf), "R:%d", NRF_Payload); + snprintf(screen_buf, sizeof(screen_buf), "Payload: %d", NRF_Payload); canvas_draw_str(canvas, 80, 30, screen_buf); - if(NRF_CRC == 1) - canvas_draw_str(canvas, 105, 30, "CRC1"); - else if(NRF_CRC == 2) - canvas_draw_str(canvas, 105, 30, "CRC2"); - canvas_set_font(canvas, FontSecondary); - strcpy(screen_buf, "Find channel period: "); // menu_selected = 3 + strcpy(screen_buf, "Next Ch time: "); // menu_selected = 3 if(find_channel_period == 0) strcat(screen_buf, "off"); else snprintf( screen_buf + strlen(screen_buf), sizeof(screen_buf), "%d s", find_channel_period); canvas_draw_str(canvas, 10, 40, screen_buf); + if(NRF_CRC == 1) + canvas_draw_str(canvas, 99, 40, "CRC1"); + else if(NRF_CRC == 2) + canvas_draw_str(canvas, 99, 40, "CRC2"); snprintf( screen_buf, sizeof(screen_buf), @@ -649,8 +676,6 @@ static void render_callback(Canvas* const canvas, void* ctx) { if(view_log_arr_idx >= log_arr_idx) view_log_arr_idx = log_arr_idx - 1; uint16_t page = view_log_arr_idx & ~7; for(uint8_t i = 0; i < 8 && page + i < log_arr_idx; i++) { - snprintf(screen_buf, sizeof(screen_buf), "%d:", page + i + 1); - canvas_draw_str(canvas, 0, 14 + i * 7, screen_buf); screen_buf[0] = (view_log_arr_idx & 7) != i ? ' ' : last_packet_send != view_log_arr_idx ? '>' : last_packet_send_st ? '*' : @@ -661,31 +686,110 @@ static void render_callback(Canvas* const canvas, void* ctx) { uint8_t pipe = dpl & 7; dpl >>= 3; if(dpl == 0) dpl = 32; - if(view_log_decode_PCF && dpl == 32) dpl -= 2; int count = dpl - view_log_arr_x; - uint8_t max_width = view_log_arr_x == 0 && addrs.addr_count > 1 ? - view_log_decode_PCF ? VIEW_LOG_WIDTH_B - 3 : - VIEW_LOG_WIDTH_B - 1 : - VIEW_LOG_WIDTH_B; + if(view_log_decode_PCF) count--; + uint8_t max_width = VIEW_LOG_WIDTH_B; + if(view_log_arr_x == 0) { + if(addrs.addr_count > 1) max_width--; + if(view_log_decode_PCF) max_width -= 2; + } if(count > max_width) count = max_width; ptr += view_log_arr_x; + uint8_t* crcptr = NULL; + uint8_t pre = 0; if(count > 0) { + if(view_log_decode_CRC) { + static uint16_t prev_addr_CRC; + static int8_t prev_pipe = -1; + uint8_t* pcrc = APP->log_arr + (page + i) * LOG_REC_SIZE + 1; + uint16_t crc; + if(prev_pipe == pipe) { + crc = prev_addr_CRC; + } else { + crc = view_log_decode_CRC == 2 ? 0xFFFF : 0xFF; + if(pipe <= 1) { + crc = calc_crc( + crc, + pipe == 0 ? addrs.addr_P0 : addrs.addr_P1, + 7, + addrs.addr_len * 8); + } else { + crc = calc_crc(crc, addrs.addr_P1, 7, (addrs.addr_len - 1) * 8); + crc = calc_crc( + crc, + pipe == 2 ? &addrs.addr_P2 : + pipe == 3 ? &addrs.addr_P3 : + pipe == 4 ? &addrs.addr_P4 : + &addrs.addr_P5, + 7, + 8); + } + prev_addr_CRC = crc; + prev_pipe = pipe; + } + if(view_log_decode_PCF) { + crc = calc_crc(crc, pcrc++, 7, 9); + if(crc == get_shifted_crc(pcrc)) crcptr = pcrc; + if(crcptr == NULL) { + for(int8_t j = 0; j < (int8_t)dpl - view_log_decode_CRC - 1; j++) { + crc = calc_crc(crc, pcrc++, 6, 8); + if(crc == get_shifted_crc(pcrc)) { + crcptr = pcrc; + break; + } + } + } + } else { + for(int8_t j = 0; j < (int8_t)dpl - view_log_decode_CRC; j++) { + crc = calc_crc(crc, pcrc++, 7, 8); + if((view_log_decode_CRC == 1 && crc == *pcrc) || + (view_log_decode_CRC == 2 && + crc == ((*pcrc << 8) | *(pcrc + 1)))) { + crcptr = pcrc; + break; + } + } + } + } if(max_width < VIEW_LOG_WIDTH_B) { - snprintf(screen_buf + 1, 10, "%X-", pipe); - if(view_log_decode_PCF) - snprintf( + pre += snprintf(screen_buf + 1, 10, "%X-", pipe); + if(view_log_decode_PCF) { + pre += snprintf( screen_buf + strlen(screen_buf), 10, "%02X%01X-", *ptr >> 2, ((*ptr & 3) << 1) | (*(ptr + 1) >> 7)); + } } if(view_log_decode_PCF) add_to_str_hex_bytes_shift_9b(screen_buf, ptr, count); else add_to_str_hex_bytes(screen_buf, ptr, count); } - canvas_draw_str(canvas, 3 * 5, 14 + i * 7, screen_buf); + uint16_t y = 14 + i * 7; + canvas_draw_str(canvas, 3 * 5, y, screen_buf); + uint16_t x = snprintf(screen_buf, sizeof(screen_buf), "%d", page + i + 1); + canvas_draw_str(canvas, 0, y, screen_buf); + if(crcptr) { // 5x7 font, 9 lines + canvas_draw_str(canvas, x * 5, y, "="); + int n = crcptr - (uint8_t*)ptr - 1; + if(n > -view_log_decode_CRC && n < count) { + int len; + x = (4 + pre) * 5; + if(n < 0) { + len = view_log_decode_CRC + n; + n = 0; + } else { + len = MIN(view_log_decode_CRC, count - n); + x += n * 2 * 5; + canvas_draw_line(canvas, x - 1, y, x - 1, y - 1); + } + canvas_draw_line(canvas, x - 1, y, n = x + len * 2 * 5 - 1, y); + canvas_draw_line(canvas, n, y, n, y - 1); + } + } else + canvas_draw_str(canvas, x * 5, y, ":"); } } } else { @@ -723,7 +827,15 @@ static void render_callback(Canvas* const canvas, void* ctx) { screen_buf[0] = 'v'; strcpy(screen_buf + 1, VERSION); canvas_draw_str(canvas, 108, 7, screen_buf); - if(view_log_decode_PCF) canvas_draw_str(canvas, 78, 64, "Decode PCF"); + if(view_log_decode_PCF || view_log_decode_CRC) { + strcpy(screen_buf, "Decode: "); + if(view_log_decode_PCF) strcat(screen_buf, "PCF "); + if(view_log_decode_CRC == 1) + strcat(screen_buf, "CRC1"); + else if(view_log_decode_CRC == 2) + strcat(screen_buf, "CRC2"); + canvas_draw_str(canvas, 0, 64, screen_buf); + } } release_mutex((ValueMutex*)ctx, plugin_state); } @@ -809,39 +921,6 @@ int32_t nrf24scan_app(void* p) { } } break; - case InputKeyRight: - if(event.input.type == InputTypePress || event.input.type == InputTypeRepeat) { - if(what_doing == 0) { - switch(menu_selected) { - case Menu_open_file: - save_settings ^= 1; - break; - case Menu_enter_channel: - NRF_channel += event.input.type == InputTypeRepeat ? 10 : 1; - if(NRF_channel > MAX_CHANNEL) NRF_channel = 0; - break; - case Menu_enter_rate: - NRF_rate++; - if(NRF_rate > 2) NRF_rate = 0; - break; - case Menu_enter_scan_period: - find_channel_period += event.input.type == InputTypeRepeat ? 10 : - 1; - break; - case Menu_log: - if(++log_to_file > 2) log_to_file = -1; - break; - case Menu_ok: - what_to_do = !what_to_do; - break; - } - } else if(what_doing == 1) { - if(view_log_arr_x < VIEW_LOG_MAX_X) view_log_arr_x++; - } else if(what_doing == 2) { - if(NRF_ESB == 0) view_log_decode_PCF ^= 1; - } - } - break; case InputKeyLeft: if(event.input.type == InputTypePress || event.input.type == InputTypeRepeat) { if(what_doing == 0) { @@ -852,7 +931,7 @@ int32_t nrf24scan_app(void* p) { break; case Menu_enter_rate: NRF_Payload -= event.input.type == InputTypeRepeat ? 10 : 1; - if(NRF_Payload == 0 || NRF_Payload > 32) NRF_Payload = 32; + if(NRF_Payload == 0 || NRF_Payload > 32) NRF_Payload = 1; break; case Menu_enter_scan_period: find_channel_period -= event.input.type == InputTypeRepeat ? 10 : @@ -868,6 +947,42 @@ int32_t nrf24scan_app(void* p) { } } else if(what_doing == 1) { if(view_log_arr_x > 0) view_log_arr_x--; + } else if(what_doing == 2) { + //if(NRF_ESB == 0) + view_log_decode_PCF ^= 1; + } + } + break; + case InputKeyRight: + if(event.input.type == InputTypePress || event.input.type == InputTypeRepeat) { + if(what_doing == 0) { + switch(menu_selected) { + case Menu_open_file: + save_settings ^= 1; + break; + case Menu_enter_channel: + NRF_channel += event.input.type == InputTypeRepeat ? 10 : 1; + if(NRF_channel > MAX_CHANNEL) NRF_channel = 0; + break; + case Menu_enter_rate: + NRF_Payload += event.input.type == InputTypeRepeat ? 10 : 1; + if(NRF_Payload == 0 || NRF_Payload > 32) NRF_Payload = 32; + break; + case Menu_enter_scan_period: + find_channel_period += event.input.type == InputTypeRepeat ? 10 : + 1; + break; + case Menu_log: + if(++log_to_file > 2) log_to_file = -1; + break; + case Menu_ok: + what_to_do = !what_to_do; + break; + } + } else if(what_doing == 1) { + if(view_log_arr_x < VIEW_LOG_MAX_X) view_log_arr_x++; + } else if(what_doing == 2) { + if(++view_log_decode_CRC > 2) view_log_decode_CRC = 0; } } break; @@ -895,29 +1010,23 @@ int32_t nrf24scan_app(void* p) { stream_free(file_stream); } break; - case Menu_enter_channel: - if(NRF_ESB) { - if(NRF_DPL) - NRF_DPL = NRF_ESB = 0; - else - NRF_DPL = 1; - } else - NRF_ESB = 1; - if(NRF_ESB) view_log_decode_PCF = 0; - break; case Menu_enter_rate: + NRF_rate++; + if(NRF_rate > 2) NRF_rate = 0; + break; + case Menu_enter_scan_period: if(++NRF_CRC > 2) NRF_CRC = 0; break; case Menu_ok: if(what_to_do) { if(addrs.addr_count) { - what_doing = 1; if(log_to_file == -1) { clear_log(); save_to_new_log = true; } else if(log_to_file == 1) save_to_new_log = true; start_scanning(); + if(!NRF_ERROR) what_doing = 1; } } else what_doing = 1; @@ -927,19 +1036,34 @@ int32_t nrf24scan_app(void* p) { } } else if(event.input.type == InputTypeLong) { if(what_doing == 0) { - if(menu_selected == Menu_log) { // Log + if(menu_selected == Menu_enter_channel) { + NRF_AA_OFF ^= 1; + key_press_seq_ok = event.input.sequence; + } else if(menu_selected == Menu_log) { // Log if(log_arr_idx && (log_to_file == 1 || log_to_file == 2)) { write_to_log_file(APP->storage, false); clear_log(); } } - nrf24_set_idle(nrf24_HANDLE); } else if(what_doing == 1) { what_doing = 2; } } else if(event.input.type == InputTypeRelease) { - if(what_doing == 1 && key_press_seq_ok != event.input.sequence) { // Send - nrf24_send_packet(); + if(key_press_seq_ok != event.input.sequence) { + if(what_doing == 0) { + if(menu_selected == Menu_enter_channel) { + if(NRF_ESB) { + if(NRF_DPL) + NRF_DPL = NRF_ESB = 0; + else + NRF_DPL = 1; + } else + NRF_ESB = 1; + //if(NRF_ESB) view_log_decode_PCF = 0; + } + } else if(what_doing == 1) { // Send + nrf24_send_packet(); + } } key_press_seq_ok--; } diff --git a/assets/resources/dolphin/Kuronons_RMCFW_128x64/meta.txt b/assets/resources/dolphin/Kuronons_RMCFW_128x64/meta.txt index aa9584f03..3154d0aef 100644 --- a/assets/resources/dolphin/Kuronons_RMCFW_128x64/meta.txt +++ b/assets/resources/dolphin/Kuronons_RMCFW_128x64/meta.txt @@ -3,12 +3,12 @@ Version: 1 Width: 128 Height: 64 -Passive frames: 10 -Active frames: 42 -Frames order: 11 11 12 13 14 15 14 13 12 11 0 1 1 1 2 2 3 4 4 5 6 7 7 8 8 9 10 10 10 11 11 11 11 11 11 12 12 13 13 14 14 15 15 15 15 15 16 16 17 18 18 18 -Active cycles: 1 +Passive frames: 54 +Active frames: 0 +Frames order: 0 0 0 0 1 1 1 2 2 3 4 4 5 6 7 7 8 8 9 10 10 10 11 11 11 11 11 11 12 12 13 13 14 14 15 15 15 15 15 16 16 17 18 18 18 18 18 18 18 18 18 18 18 18 +Active cycles: 0 Frame rate: 6 Duration: 3600 -Active cooldown: 4 +Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/L1_New_year_128x64/frame_0.bm b/assets/resources/dolphin/L1_New_year_128x64/frame_0.bm new file mode 100644 index 0000000000000000000000000000000000000000..17f53095e95ad5056d4fefcf68b443325c4383b1 GIT binary patch literal 804 zcmV+<1Ka!o03ZYZ|L^~R82|nNG5|mG^Z)+?&i)X8hu`iJ5Csb?0Ab7kcmu!>{Ri?C z$v65mx)@OhzxLqIFaF=p#e;wPz(2zC?EBMWPv`l;LwJCH0E6HA^?~E!`ThC$e~jaS zNHGt;-VZDfgZG|+_~*I^4>R`z;B~Fre-DQDo`CVAu?QX$;i2VDbNv6GhFdl(pF9LG z9|z%r=zwRRpLo1@fBD{U9(&fI z`|ba}AAa;y5_w)j;~4mMfARPSeVqs2_cw3*EZe>H+i5l?F-v zkNz>4nVnodUB9n?`|pxXUG zgu((4`g2AjUVn&iV;|4#1%A{2gyeWP;%Ycse?QOl|0prmYPC?IAmJeY3;0NMU?HD~ ziXH+OAMfA)7B2h{F#3&pl}+^j|9JRrxE3}KzYIQCu=wBqnD|v&^Y!=sH?aIzJYe?? zHuzd!3csl=D+1krr~RLmh6k|teZ=E-fs#jeeuDkIz8D?D^H=n5@4vt7e|3JEgU3Sx z*nWfKzrX7Lq4L`PerDsV`fvB(`2S~j+%Ny`4>0(n3K@Wn-$Y~S!^7F*SG04dA!4oH zPXoon!oObMw7&@u|7ZF2u<*scSP=NtV80Ia?jKv|M&q9d&)WeF{Zm6@bLT>L_W0jp z?;rPI1LE8%4iXVx>&ELJSpRzhKO2mYBz^wHFR}EW&&%Zh7$gD#2nh|Ywe|uI8XJ0! zN&)8&z)JgQ(!#^>*PV&h<8zu}-?p?Lg1AoJz^!^4lmz<-m8#R7>$FOOHZ z-CK{q9zUtX)4}!s!olOaw|!tA{5%XkS_rHF9#^}1zPA@TAL%DdI|8^k`v;V+zT`M;Zw(n(aR)nPN61Zo+eKnMd?;sD<~ i=RN1RfQIv!^WFfX2>}f9AM&1ac5}{uzyv=qSb&6cYr0?n literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/L1_New_year_128x64/frame_1.bm b/assets/resources/dolphin/L1_New_year_128x64/frame_1.bm new file mode 100644 index 0000000000000000000000000000000000000000..a8c1277fe8ea2735d95588fc1f7b59a166033e56 GIT binary patch literal 827 zcmV-B1H}9R05=2wfDiMZ10VsvzyE+8FW~kL55OcK3Wtlt9bobRX)^#GWuONBKfss2 zf>ZPkiT&^jTmNnkx~pIO`*}b71xM=u6DMcE_q_AD{%}CvARocN_x}B0c=`5!etsY0 zIN)ABzyD9at?B#b|DU|{563;wUU{GR2Lr8c+qK5`o`CVAu?n6O@u1~SbNunx%Vx&5 zg!mgtZJR&<34jF;*aSX4{dRSCx!vykGoZ)5KW_j3!}Gq+yPyJshz4Q#_lL)W;hpCJ z=Y<6ihyU-}|9E;I&U}h=@(Fx9Joxw!e)Rrse&=?x1cs;g^I_-ef#=!vz5A`6t{xc2 z!#{_=$v@Hm#&tB1?C_3xvGN&g=qv_s}@AG`zKukQ0p<(UZ&ckM3=7yEyAgQJG; zFb|A#;THd2pcm`^a|$0W0BCF9aCpz-AHm5l)_?Gv_viQT2we>~P| zwNR)G1L+6&U+4eL7~E&V0*8Qx_xooI@K&4fK*Q=a>(w{X6C890Tnifq--aJiaO2<= zWSIN^8`yp?=Sv@soBZ@G{a@ApzK4dxf(8#~fRgie(as2(R^PUB$Tk59K(Tc|Je*SUh)j@2ms*Um*DDA`k$1UhVHO;~&UAI!c9Z z7g6fMs~_EeTMq*dmVzQ5KVR>EFX!RlA@b0DN8?@U`lEjU`9MSEKrf_k`M;Zw#snW3 zB|@uJgwAXcsAho9B!If9=79AN?Vpiw6JofE$nf+4uebJU)Mn5;uqkun0Z>zgQkVeV^Zh zhxpDg1rqoB!R4Fwe((@K9QFZu=KkRP4z;^)Z~xx%P#!dP0dvBCH2kT~f1Yj`Y}vqO zF?tV!^ZEbyfA-n5005W(sQtbG@~+OV-~#KsMm_Ndmk(BACPw(8%)CGRi|AgoNo$IKC0E6NGx`%)7|FOsKKh|os zP@y3GAU_NEP;_7+pRNV=AR)QF0SSkP52)9y6dzCj_m76lztH;!&w3v#5AR=p z{$t@$W`O(r7ubF*UNC=#oBTaGzpBG_S(fM+J)f0^2Qd8y$7g+k5=VD_!u&iw7#+j= zSM+b^|Bvi{b$;4|$3p_Z2g?6G)PH~Tuz3DbL^&F{oNvFNd0#N8u|F7mKw|?RjBfZ7 zA5I=0{2z^@oX8*l_P2cc`}nvxR%_e#m*FA_LBLkS!`As=VerbV7vbK$r^`1ScaPr# z4TV#G+54Y56aW84`(Jwhy9W=>Hwr_9ga^vC_3!tv@UPXzNbg=>Yw13pm&t-KNCW~A z`~BMMUtn0_p|_~ypdMxMmG=JN@xsIJfbkcezg3Hk{5{wFF#KL54^Ch2|L@0-%5gZR zQ7Dj#|5vx&TaUvJ4gF3go=>m-77rcWyXye|hto+FfCI|+Z&(c&{z385Rcmm%k5&~} z{_FC=_^tJQf4%&^o_`VhS9-pqc3%1zHz(e;%^4R56VeYs?}jLn*?eZp#R_h r$e{otNV(uaTZjXE_nhzu;W_I);0iDh5YIXPIUopUknj-m073{L+(WzB literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/L1_New_year_128x64/frame_3.bm b/assets/resources/dolphin/L1_New_year_128x64/frame_3.bm new file mode 100644 index 0000000000000000000000000000000000000000..4b89c67a65663a6849861e7c2bca8116b963517d GIT binary patch literal 813 zcmV+|1Je8f04W3ifD_;bPy*lo!1bSl+I#%}en96R3y1+H|G+wf++IO-B3J{!1}9(w z|3jVl2lng#&o3|pfCInw;PBwpBM$z4EF1sU0fq;kXW#ey@%jF6K++%_z##Yj{a|?c z_J1CJAL9Vv6ieUl2bOQy@XtW}a9suGoBMh1t8z8?P``2DZ{jvxN}KJI`DdLJ3*=N=C^ z-f$j!(a4g9AGeM`Hy^zEsRQE}_(Fg4`6u)5Pv+-tcWXEQhfw>i2LB}gbL9Ho?bgj# z4~#?LDJduZKN!|#W_57*vq$US0t^9+G5_%W!Q*#;d$;k@`Qt)E-TOw*S*tkr6v zLP7dL{ul6g=)vPZbPD7^Lwo)E|NOy9`}lDBje7M>^#6Z&_-?p1C4t_<{~`0g|1t2W zxBu^l{9j@C0C{5(Dw9Kw54 z^l$I~zwASGe%kyjItUiRb@U^R`&aS!2ghsqnVyROR`mbxq4E6A@2oMKgUG%pasR-< z0~@~ofA*X(AbquaM>=vAD&6<%@8aR$AFprPUxbK%lw(T|4_oDjfd4A6Ux#}3zbqVa z-YKDg{;9w0{m-2VAs1`!-}hnR?Zc4aAs_$lF17UU_ptD<)y7B?HURSbUrGG@K0VLO z{s{np2gm z7g6fMs~_EdSpGrx_5Szr`gr~;y<1dk;SUdx{ENb0IN$Ss7aydOsa2}NXEq4bGeJN9 r{Lw-L5CY%--}ShFH_v&%0ERv0yyO6*o&g;5pYs6>%mhCGK}i8*@7>IY literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/L1_New_year_128x64/meta.txt b/assets/resources/dolphin/L1_New_year_128x64/meta.txt new file mode 100644 index 000000000..542392c19 --- /dev/null +++ b/assets/resources/dolphin/L1_New_year_128x64/meta.txt @@ -0,0 +1,14 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 4 +Active frames: 0 +Frames order: 0 1 2 3 +Active cycles: 0 +Frame rate: 2 +Duration: 3600 +Active cooldown: 0 + +Bubble slots: 0 diff --git a/assets/resources/dolphin/Sasquach_Blaster_128x64/meta.txt b/assets/resources/dolphin/Sasquach_Blaster_128x64/meta.txt index 63d6e4750..4d5cb4433 100644 --- a/assets/resources/dolphin/Sasquach_Blaster_128x64/meta.txt +++ b/assets/resources/dolphin/Sasquach_Blaster_128x64/meta.txt @@ -3,12 +3,12 @@ Version: 1 Width: 128 Height: 64 -Passive frames: 10 -Active frames: 40 +Passive frames: 50 +Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 -Active cycles: 1 +Active cycles: 0 Frame rate: 6 Duration: 3600 -Active cooldown: 4 +Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/Sasquach_CloudG0ku_128x64/meta.txt b/assets/resources/dolphin/Sasquach_CloudG0ku_128x64/meta.txt index e780d7e95..cb006d0e0 100644 --- a/assets/resources/dolphin/Sasquach_CloudG0ku_128x64/meta.txt +++ b/assets/resources/dolphin/Sasquach_CloudG0ku_128x64/meta.txt @@ -3,12 +3,12 @@ Version: 1 Width: 128 Height: 64 -Passive frames: 10 -Active frames: 38 -Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 46 -Active cycles: 1 +Passive frames: 47 +Active frames: 0 +Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 +Active cycles: 0 Frame rate: 5 Duration: 3600 -Active cooldown: 1 +Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/Sasquach_Narut0_128x64/meta.txt b/assets/resources/dolphin/Sasquach_Narut0_128x64/meta.txt index 1c4b1c117..7e7e55b26 100644 --- a/assets/resources/dolphin/Sasquach_Narut0_128x64/meta.txt +++ b/assets/resources/dolphin/Sasquach_Narut0_128x64/meta.txt @@ -3,12 +3,12 @@ Version: 1 Width: 128 Height: 64 -Passive frames: 10 -Active frames: 20 +Passive frames: 30 +Active frames: 0 Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 -Active cycles: 1 +Active cycles: 0 Frame rate: 6 Duration: 3600 -Active cooldown: 4 +Active cooldown: 0 Bubble slots: 0 diff --git a/assets/resources/dolphin/Sasquach_RMCF_128x64/meta.txt b/assets/resources/dolphin/Sasquach_RMCF_128x64/meta.txt index ffc01409d..b6b3fdf3e 100644 --- a/assets/resources/dolphin/Sasquach_RMCF_128x64/meta.txt +++ b/assets/resources/dolphin/Sasquach_RMCF_128x64/meta.txt @@ -3,13 +3,13 @@ Version: 1 Width: 128 Height: 64 -Passive frames: 9 -Active frames: 99 -Frames order: 0 1 2 3 4 3 2 1 0 1 2 3 4 5 6 7 8 9 10 11 11 11 11 11 11 11 11 11 11 11 11 12 12 12 12 12 12 12 13 14 15 16 17 18 17 18 17 18 19 20 19 20 19 20 19 20 19 20 21 22 21 22 22 22 23 24 25 26 27 28 29 30 31 32 33 0 34 35 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 37 38 -Active cycles: 1 +Passive frames: 100 +Active frames: 0 +Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 11 11 11 11 11 11 11 11 11 11 11 12 12 12 12 12 12 12 13 14 15 16 17 18 17 18 17 18 19 20 19 20 19 20 19 20 19 20 21 22 21 22 22 22 23 24 25 26 27 28 29 30 31 32 33 0 34 35 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 37 38 +Active cycles: 0 Frame rate: 4 Duration: 3600 -Active cooldown: 4 +Active cooldown: 0 Bubble slots: 1