Compare commits

..
222 Commits
Author SHA1 Message Date
Andreas Fruhwirt 5b934dfc1b changed name to mount 2024-01-19 18:02:41 +01:00
Andreas Fruhwirt f9a6c74a23 removed backgrounds and added custom background 2024-01-19 17:55:16 +01:00
Andreas Fruhwirt f199beafb2 removed github folder 2024-01-19 17:20:10 +01:00
Aleksandr Kutuzov d1832d5e90 Merge remote-tracking branch 'origin/release-candidate' into release 2023-12-23 11:08:50 +00:00
Aleksandr Kutuzov ad66d3b3c6 Merge remote-tracking branch 'origin/dev' into release-candidate 2023-12-22 11:10:18 +00:00
あく 531ba24e9a Rollback #3305 and #3297 fix various rendering issues (#3307)
* Revert "[FL-3729, FL-3730] Gui: fix string width calculation (#3305)"
* Revert "Added UTF-8 support to Flipper Zero canvas API (#3297)"
2023-12-22 11:08:46 +00:00
あく 1543170f4c [FL-3729, FL-3730] Gui: fix string width calculation (#3305) 2023-12-21 16:43:11 +00:00
Aleksandr Kutuzov c0be669a30 Merge remote-tracking branch 'origin/dev' into release-candidate 2023-12-19 14:17:20 +00:00
Skorpionmandあく 17b122990f USART Bridge: added support for software control of DE/RE pins (#3280)
* USART Bridge: added support for software control of DE/RE pins
* USART Bridge: fix syntax
* UsbUsartBridge: add TODO ticket
* UsbUsartBridge: add second TODO ticket
* GpioUartBridge: human readable configuration
* GpioUartBridge: rename `Soft DE/RE` to `DE/RE Pin`
* GpioUartBridge: push pull for DE/RE pin

Co-authored-by: あく <alleteam@gmail.com>
2023-12-19 14:13:37 +00:00
hedger 1e1d9fcb69 ufbt: changed toolchain environment invocation; updated .gitignore for app template (#3300) 2023-12-19 12:43:06 +00:00
gornekich 6f6074dc01 Keys Dict: fix PVS warnings (#3299)
* keys dict: fix PVS warnings
* nfc app: suppress PVS warning
2023-12-19 12:11:35 +00:00
Evgeny Stepanischevandあく 25d24f1e4c Added UTF-8 support to Flipper Zero canvas API (#3297)
* Added UTF-8 support to Flipper Zero canvas API
* Add unicode example

Co-authored-by: あく <alleteam@gmail.com>
2023-12-18 18:36:50 +00:00
Andrea Maugeri 7642d67cae NfcDict Refactoring (#3271)
* toolbox(keys_dict): generalize nfc_dict
* nfc: rework nfc app and tests
* toolbox(keys_dict): improve code readability
2023-12-18 14:30:56 +00:00
Aleksandr Kutuzov 5dbe1cf0bc Merge remote-tracking branch 'origin/release-candidate' into release 2023-12-08 16:08:51 +09:00
Aleksandr Kutuzov 8a3142da04 Merge remote-tracking branch 'origin/dev' into release-candidate 2023-12-05 22:43:06 +09:00
Aleksandr Kutuzov b0dc8a3940 Merge remote-tracking branch 'origin/dev' into release-candidate 2023-12-04 15:35:41 +09:00
Aleksandr Kutuzov f711b3f929 Merge remote-tracking branch 'origin/release-candidate' into release 2023-11-22 04:49:24 +09:00
Aleksandr Kutuzov 9524a5ef74 Merge remote-tracking branch 'origin/dev' into release-candidate 2023-11-16 01:53:37 +09:00
Aleksandr Kutuzov e487bcd2f8 Merge remote-tracking branch 'origin/release-candidate' into release 2023-11-01 15:48:39 +09:00
Aleksandr Kutuzov 880e7bb1a8 Merge remote-tracking branch 'origin/dev' into release-candidate 2023-10-28 23:47:59 +09:00
Aleksandr Kutuzov fa2d516017 Merge remote-tracking branch 'origin/dev' into release-candidate 2023-10-24 12:14:29 +09:00
Aleksandr Kutuzov e8c6e70a5f Merge remote-tracking branch 'origin/release-candidate' into release 2023-10-12 10:42:41 +09:00
Aleksandr Kutuzov 333f45d2c6 Merge remote-tracking branch 'origin/dev' into release-candidate 2023-10-10 07:01:58 +09:00
Aleksandr Kutuzov 4fc6f3b245 Merge remote-tracking branch 'origin/release-candidate' into release 2023-09-26 23:24:34 +09:00
Aleksandr Kutuzov a3e07586ee Merge remote-tracking branch 'origin/dev' into release-candidate 2023-09-26 16:29:58 +09:00
Aleksandr Kutuzov 9fd8d30b6f Merge remote-tracking branch 'origin/dev' into release-candidate 2023-09-25 17:31:33 +09:00
Aleksandr Kutuzov 81e490117a Merge remote-tracking branch 'origin/dev' into release-candidate 2023-09-21 23:35:58 +09:00
Aleksandr Kutuzov 176c3618b1 Merge remote-tracking branch 'origin/release-candidate' into release 2023-09-15 19:44:19 +09:00
Aleksandr Kutuzov dba34f25fe Merge remote-tracking branch 'origin/dev' into release-candidate 2023-09-14 18:35:28 +09:00
Aleksandr Kutuzov 6ceb71e327 Merge remote-tracking branch 'origin/dev' into release-candidate 2023-09-12 10:21:06 +09:00
Aleksandr Kutuzov 60c96b97c6 Merge remote-tracking branch 'origin/dev' into release-candidate 2023-09-12 01:36:34 +09:00
Aleksandr Kutuzov ff41b65077 Merge remote-tracking branch 'origin/dev' into release-candidate 2023-09-12 01:18:41 +09:00
Aleksandr Kutuzov fe637da8fc Merge remote-tracking branch 'origin/dev' into release-candidate 2023-09-12 00:40:01 +09:00
Aleksandr Kutuzov baf661d47d Merge remote-tracking branch 'origin/dev' into release-candidate 2023-09-11 22:37:30 +09:00
Aleksandr Kutuzov 384e950ab3 Merge remote-tracking branch 'origin/release-candidate' into release 2023-08-31 14:49:45 +09:00
Aleksandr Kutuzov 0d991e6960 Merge remote-tracking branch 'origin/dev' into release-candidate 2023-08-29 21:19:47 +09:00
Aleksandr Kutuzov d874fcd5cb Merge remote-tracking branch 'origin/dev' into release-candidate 2023-08-24 05:53:38 +09:00
Aleksandr Kutuzov 5a58004bbb Merge remote-tracking branch 'origin/release-candidate' into release 2023-08-16 21:53:56 +09:00
Aleksandr Kutuzov 4b5f829375 Merge remote-tracking branch 'origin/dev' into release-candidate 2023-08-11 03:09:30 +09:00
Aleksandr Kutuzov 357fbfe63b Merge remote-tracking branch 'origin/release-candidate' into release 2023-08-04 22:29:19 +09:00
Aleksandr Kutuzov 45e78fbdc2 Merge remote-tracking branch 'origin/dev' into release-candidate 2023-08-03 16:29:04 +09:00
Aleksandr Kutuzov bf262efed5 Merge remote-tracking branch 'origin/release-candidate' into release 2023-07-20 15:21:02 +04:00
Aleksandr Kutuzov 12f898f0ff Merge remote-tracking branch 'origin/dev' into release-candidate 2023-07-18 15:05:17 +04:00
Aleksandr Kutuzov c29941aefb Merge remote-tracking branch 'origin/release-candidate' into release 2023-07-12 18:24:01 +04:00
Skorpionmandあく 06b8b9bf1e SubGhz: fix check connect cc1101_ext (#2857)
* SubGhz: fix check connect cc1101_ext
* SubGhz: fix syntax
* SubGhz: enable interface pin pullups
* SubGhz: fix syntax
* SubGhz: fix CLI check connect CC1101_ext
* SubGhz: fix CLI display of the selected device

Co-authored-by: あく <alleteam@gmail.com>
2023-07-12 15:09:55 +04:00
Aleksandr Kutuzov 3991db4b36 Merge remote-tracking branch 'origin/release-candidate' into release 2023-07-06 21:01:41 +09:00
Aleksandr Kutuzov 279a33dc8c Merge remote-tracking branch 'origin/dev' into release-candidate 2023-07-06 02:01:48 +09:00
Aleksandr Kutuzov 948dafc434 Merge remote-tracking branch 'origin/dev' into release-candidate 2023-07-02 04:43:52 +09:00
Aleksandr Kutuzov 27a8f29a68 Merge remote-tracking branch 'origin/release-candidate' into release 2023-06-16 16:28:58 +09:00
Aleksandr Kutuzov 7081d76e7b Merge remote-tracking branch 'origin/dev' into release-candidate 2023-06-15 21:27:44 +09:00
Aleksandr Kutuzov 60baf2a608 Merge remote-tracking branch 'origin/dev' into release-candidate 2023-06-14 20:50:13 +09:00
Aleksandr Kutuzov 1ac1f0b441 Merge remote-tracking branch 'origin/dev' into release-candidate 2023-06-09 22:22:59 +09:00
Aleksandr Kutuzov 406cb8b711 Merge remote-tracking branch 'origin/release-candidate' into release 2023-06-03 06:21:05 +09:00
Aleksandr Kutuzov dc3d56523a Merge remote-tracking branch 'origin/dev' into release-candidate 2023-06-03 06:03:02 +09:00
Aleksandr Kutuzov e4830a6ebc Merge remote-tracking branch 'origin/release-candidate' into release 2023-06-03 01:14:42 +09:00
Aleksandr Kutuzov 2d8f262dd4 Merge remote-tracking branch 'origin/dev' into release-candidate 2023-06-01 21:50:05 +09:00
Aleksandr Kutuzov 96d97af4e6 Merge remote-tracking branch 'origin/dev' into release-candidate 2023-05-30 01:48:41 +09:00
Aleksandr Kutuzov 16b976478c Merge remote-tracking branch 'origin/release-candidate' into release 2023-05-17 18:28:55 +09:00
Aleksandr Kutuzov 9cedac9adf Merge remote-tracking branch 'origin/dev' into release-candidate 2023-05-15 20:55:58 +09:00
Aleksandr Kutuzov 508dbe4984 Merge remote-tracking branch 'origin/dev' into release-candidate 2023-05-11 19:13:36 +09:00
Aleksandr Kutuzov b7f406d43b Merge branch 'release-candidate' into release 2023-04-28 00:46:14 +09:00
Aleksandr Kutuzov 849aa0f784 Merge remote-tracking branch 'origin/dev' into release-candidate 2023-04-27 23:01:55 +09:00
Aleksandr Kutuzov df78ba8e09 Merge remote-tracking branch 'origin/dev' into release-candidate 2023-04-26 15:39:56 +09:00
Aleksandr Kutuzov 31e47e97bd Merge remote-tracking branch 'origin/dev' into release-candidate 2023-04-24 16:39:53 +09:00
Aleksandr Kutuzov 085c8008db Merge remote-tracking branch 'origin/dev' into release-candidate 2023-04-20 22:10:24 +09:00
Aleksandr Kutuzov 376319cbc8 Merge remote-tracking branch 'origin/release-candidate' into release 2023-04-12 23:13:23 +09:00
Aleksandr Kutuzov 728320b713 Merge remote-tracking branch 'origin/dev' into release-candidate 2023-04-12 15:12:01 +09:00
Aleksandr Kutuzov b55677673f Merge remote-tracking branch 'origin/dev' into release-candidate 2023-04-07 11:05:52 +08:00
Aleksandr Kutuzov c41fe8e4e4 Merge remote-tracking branch 'origin/release-candidate' into release 2023-03-28 14:13:19 +09:00
Aleksandr Kutuzov 9b9dce3676 Merge remote-tracking branch 'origin/dev' into release-candidate 2023-03-27 16:42:32 +09:00
Aleksandr Kutuzov e52e30c56d Merge remote-tracking branch 'origin/dev' into release-candidate 2023-03-23 05:27:22 +09:00
Aleksandr Kutuzov b698126c36 Merge remote-tracking branch 'origin/release-candidate' into release 2023-03-13 16:04:36 +09:00
Aleksandr Kutuzov f141a67788 Merge remote-tracking branch 'origin/dev' into release-candidate 2023-03-10 20:15:19 +09:00
Aleksandr Kutuzov dec00feb7b Merge remote-tracking branch 'origin/dev' into release-candidate 2023-03-10 18:26:49 +09:00
Aleksandr Kutuzov 61744b8d01 Merge remote-tracking branch 'origin/release-candidate' into release 2023-02-28 00:59:33 +09:00
Aleksandr Kutuzov 119c7fe5f1 Merge remote-tracking branch 'origin/dev' into release-candidate 2023-02-27 23:59:52 +09:00
Aleksandr Kutuzov e9984f8b4c Merge branch 'dev' into release-candidate 2023-02-27 15:25:21 +09:00
Aleksandr Kutuzov a38a62fe79 Merge remote-tracking branch 'origin/release-candidate' into release 2023-02-14 18:53:04 +09:00
Aleksandr Kutuzov e2e4dcc2f8 Merge remote-tracking branch 'origin/dev' into release-candidate 2023-02-14 00:44:31 +09:00
Aleksandr Kutuzov ea5fe0ec86 Merge remote-tracking branch 'origin/dev' into release-candidate 2023-02-09 14:45:49 +09:00
Aleksandr Kutuzov 8a08fd5da9 Merge remote-tracking branch 'origin/dev' into release-candidate 2023-02-09 14:10:01 +09:00
Aleksandr Kutuzov 13a0a92f0d Merge branch 'release-candidate' into release 2023-02-02 21:22:44 +07:00
Aleksandr Kutuzov 48eb15c79c Merge remote-tracking branch 'origin/dev' into release-candidate 2023-01-30 16:57:20 +07:00
Aleksandr Kutuzov 8ee66c3e9b Merge remote-tracking branch 'origin/release-candidate' into release 2023-01-09 02:02:31 +09:00
Aleksandr Kutuzov e18056ba78 Merge remote-tracking branch 'origin/dev' into release-candidate 2023-01-08 20:19:22 +09:00
Aleksandr Kutuzov b60ba76551 Merge remote-tracking branch 'origin/release-candidate' into release 2022-12-24 00:34:50 +09:00
Aleksandr Kutuzov 5670397c3b Merge remote-tracking branch 'origin/dev' into release-candidate 2022-12-23 22:47:02 +09:00
Aleksandr Kutuzov 6ff3f821b2 Merge remote-tracking branch 'origin/dev' into release-candidate 2022-12-23 19:37:55 +09:00
Aleksandr Kutuzov 8bc7723faa Merge remote-tracking branch 'origin/dev' into release-candidate 2022-12-21 00:08:55 +09:00
Aleksandr Kutuzov 09f3dc74bc Merge remote-tracking branch 'origin/release-candidate' into release 2022-12-10 04:43:41 +09:00
Aleksandr Kutuzov 0d7f305da1 Merge remote-tracking branch 'origin/dev' into release-candidate 2022-12-10 04:32:10 +09:00
Aleksandr Kutuzov c7bf3d3066 Merge remote-tracking branch 'origin/dev' into release-candidate 2022-12-08 18:32:17 +09:00
Aleksandr Kutuzov 579e3b5f26 Merge remote-tracking branch 'origin/release-candidate' into release 2022-12-02 23:19:51 +09:00
gornekich a74bcbaeb6 NFC: fix NTAG203 info scene #2078 2022-12-02 21:44:23 +09:00
Aleksandr Kutuzov 3c1d59f152 Merge remote-tracking branch 'origin/release-candidate' into release 2022-12-01 05:17:10 +09:00
Aleksandr Kutuzov ec218060ac Merge remote-tracking branch 'origin/dev' into release-candidate 2022-11-30 20:42:10 +09:00
Aleksandr Kutuzov 303c266eba Merge branch 'release-candidate' into release 2022-11-14 21:01:50 +09:00
Aleksandr Kutuzov f3904dc5a4 Merge remote-tracking branch 'origin/dev' into release-candidate 2022-11-14 17:12:42 +09:00
Aleksandr Kutuzov 04c780f48a Merge branch 'dev' into release-candidate 2022-11-11 02:54:41 +09:00
Aleksandr Kutuzov 8d0faae820 Merge remote-tracking branch 'origin/release-candidate' into release 2022-11-01 23:20:27 +09:00
Aleksandr Kutuzov a50fb2ac5e Merge remote-tracking branch 'origin/dev' into release-candidate 2022-11-01 19:28:10 +09:00
Aleksandr Kutuzov fd0dd34a03 Merge remote-tracking branch 'origin/dev' into release-candidate 2022-10-29 04:00:13 +09:00
Aleksandr Kutuzov 3ab17e596b Merge branch 'release-candidate' into release 2022-10-19 20:32:45 +09:00
hedgerandあく 33a7478b0a scripts: fixed c2 bundle format (#1889)
* scripts: fixed c2 bundle format
* scripts: copro.py: small refactoring

Co-authored-by: あく <alleteam@gmail.com>
2022-10-18 21:14:25 +09:00
Aleksandr Kutuzov 747e81fe1e Merge remote-tracking branch 'origin/release-candidate' into release 2022-10-18 01:19:05 +09:00
Aleksandr Kutuzov cfde6350a6 Merge remote-tracking branch 'origin/dev' into release-candidate 2022-10-15 03:27:47 +09:00
Aleksandr Kutuzov 5c52bb7621 Merge remote-tracking branch 'origin/release-candidate' into release 2022-10-03 00:45:53 +09:00
Aleksandr Kutuzov e40349350d Merge branch 'dev' into release-candidate 2022-09-30 22:06:09 +09:00
Aleksandr Kutuzov a0f6a23062 Merge remote-tracking branch 'origin/dev' into release-candidate 2022-09-29 20:02:13 +09:00
Aleksandr Kutuzov 3481252ef7 Merge remote-tracking branch 'origin/release-candidate' into release 2022-09-24 01:17:00 +09:00
Aleksandr Kutuzov 14a180975a Merge remote-tracking branch 'origin/dev' into release-candidate 2022-09-23 02:53:12 +09:00
Aleksandr Kutuzov bb9b52ad3e Merge remote-tracking branch 'origin/dev' into release-candidate 2022-09-22 01:57:30 +09:00
Aleksandr Kutuzov 7e86f634ba Merge remote-tracking branch 'origin/dev' into release-candidate 2022-09-20 14:44:52 +09:00
Aleksandr Kutuzov 55b463248c Merge remote-tracking branch 'origin/release-candidate' into release 2022-09-07 00:06:42 +09:00
Aleksandr Kutuzov 09148b2d6e Merge branch 'dev' into release-candidate 2022-09-05 22:47:13 +09:00
Aleksandr Kutuzov 3d9efa98d4 Merge branch 'dev' into release-candidate 2022-09-05 20:45:58 +09:00
Aleksandr Kutuzov ae9038da36 Merge remote-tracking branch 'origin/release-candidate' into release 2022-08-25 19:26:42 +09:00
Aleksandr Kutuzov 8fb679e098 Merge remote-tracking branch 'origin/dev' into release-candidate 2022-08-25 01:26:34 +09:00
Aleksandr Kutuzov af891bdd4a Merge branch 'dev' into release-candidate 2022-08-24 02:58:31 +09:00
Aleksandr Kutuzov f6d6a626ea Merge branch 'dev' into release-candidate 2022-08-24 01:21:50 +09:00
Aleksandr Kutuzov bf236f5e15 Merge branch 'release-candidate' into release 2022-08-16 21:39:00 +09:00
Aleksandr Kutuzov 2fc2486b91 Merge branch 'dev' into release-candidate 2022-08-16 00:54:27 +09:00
Aleksandr Kutuzov 7a6720384f Merge branch 'release-candidate' into release 2022-08-13 18:21:46 +09:00
Aleksandr Kutuzov be0aa536ba Merge remote-tracking branch 'origin/dev' into release-candidate 2022-08-13 18:12:26 +09:00
Aleksandr Kutuzov df6b81274b Merge remote-tracking branch 'origin/dev' into release-candidate 2022-08-12 22:50:53 +09:00
Aleksandr Kutuzov f785ce1f91 Merge remote-tracking branch 'origin/dev' into release-candidate 2022-08-12 01:11:41 +09:00
Aleksandr Kutuzov 0c592ff84a Merge branch 'release-candidate' into release 2022-08-03 08:50:08 +09:00
Aleksandr Kutuzov 8bcd76636e Merge remote-tracking branch 'origin/dev' into release-candidate 2022-08-02 23:12:13 +09:00
Aleksandr Kutuzov 86c9b0077c Merge remote-tracking branch 'origin/dev' into release-candidate 2022-07-28 21:36:31 +09:00
Aleksandr Kutuzov e28446de49 Merge remote-tracking branch 'origin/dev' into release-candidate 2022-07-27 02:29:17 +09:00
Aleksandr Kutuzov 52434f77a3 Merge remote-tracking branch 'origin/dev' into release-candidate 2022-07-27 00:45:52 +09:00
Aleksandr Kutuzov 3e5d499b44 Merge branch 'release-candidate' into release 2022-07-13 18:49:21 +09:00
Aleksandr Kutuzov 577a4ba5a5 Merge remote-tracking branch 'origin/dev' into release-candidate 2022-07-12 23:57:39 +09:00
Aleksandr Kutuzov 996b15e204 Merge remote-tracking branch 'origin/dev' into release-candidate 2022-07-10 21:53:42 +09:00
Aleksandr Kutuzov fc15d5ccce Merge branch 'release-candidate' into release 2022-06-28 23:47:38 +09:00
Aleksandr Kutuzov 1edc74acff Merge branch 'dev' into release-candidate 2022-06-28 22:06:48 +09:00
Aleksandr Kutuzov c5fd214f80 Merge remote-tracking branch 'origin/dev' into release-candidate 2022-06-26 21:18:09 +09:00
Aleksandr Kutuzov e82001aaa6 Merge branch 'release-candidate' into release 2022-06-15 20:00:39 +09:00
Aleksandr Kutuzov e682e02bca Merge remote-tracking branch 'origin/dev' into release-candidate 2022-06-14 12:08:22 +09:00
Aleksandr Kutuzov ae95d75d2e Merge remote-tracking branch 'origin/dev' into release-candidate 2022-06-13 11:45:08 +09:00
Aleksandr Kutuzov 84cc3816c4 Merge remote-tracking branch 'origin/dev' into release-candidate 2022-06-10 11:15:08 +09:00
Aleksandr Kutuzov 94bb1ad354 Merge branch 'release-candidate' into release 2022-06-03 23:03:06 +09:00
Aleksandr Kutuzov be4dec77da Merge remote-tracking branch 'origin/dev' into release-candidate 2022-06-03 16:49:35 +09:00
Aleksandr Kutuzov 287defdfc5 Merge remote-tracking branch 'origin/dev' into release-candidate 2022-06-01 04:44:44 +09:00
Aleksandr Kutuzov cb6cf95714 Merge branch 'release-candidate' into release 2022-05-12 17:45:25 +03:00
Aleksandr Kutuzov f82484d447 Merge remote-tracking branch 'origin/dev' into release-candidate 2022-05-12 17:00:05 +03:00
Aleksandr Kutuzov e64de44b73 Merge remote-tracking branch 'origin/dev' into release-candidate 2022-05-11 19:42:05 +03:00
Aleksandr Kutuzov d3c0618699 Merge branch 'release-candidate' into release 2022-05-05 00:41:18 +03:00
Aleksandr Kutuzov b501d47943 Merge branch 'dev' into release-candidate 2022-04-29 17:27:23 +03:00
Aleksandr Kutuzov d21e5bd56e Merge branch 'release-candidate' into release 2022-04-25 15:50:08 +03:00
Aleksandr Kutuzov 1ad81aaf1f Merge remote-tracking branch 'origin/dev' into release-candidate 2022-04-24 01:12:36 +03:00
Aleksandr Kutuzov 5435679420 Merge remote-tracking branch 'origin/dev' into release-candidate 2022-04-21 19:26:45 +03:00
Aleksandr Kutuzov d294b5e256 Merge branch 'release-candidate' into release 2022-04-18 16:21:59 +03:00
Aleksandr Kutuzov bc77681e65 Merge remote-tracking branch 'origin/dev' into release-candidate 2022-04-15 21:00:34 +03:00
Aleksandr Kutuzov 460f573446 Merge branch 'dev' into release-candidate 2022-04-14 20:46:46 +03:00
Aleksandr Kutuzov 215466e2d6 Merge branch 'release-candidate' into release 2022-04-08 20:17:00 +03:00
Aleksandr Kutuzov 625eb0a4a5 Merge branch 'dev' into release-candidate 2022-04-07 18:48:44 +03:00
Aleksandr Kutuzov 5f582abfe0 Merge branch 'release-candidate' into release 2022-04-01 16:41:50 +03:00
Aleksandr Kutuzov 5c58faa3f5 Merge branch 'dev' into release-candidate 2022-03-31 17:58:25 +03:00
Aleksandr Kutuzov 28d9b21483 Merge branch 'release-candidate' into release 2022-03-29 15:30:57 +03:00
Aleksandr Kutuzov 0d35596d96 Merge branch 'dev' into release-candidate 2022-03-28 17:31:20 +03:00
Aleksandr Kutuzov 631e532245 Merge branch 'release-candidate' into release 2022-03-25 21:19:30 +03:00
Aleksandr Kutuzov b29c0d3fb5 Merge branch 'dev' into release-candidate 2022-03-25 19:08:49 +03:00
Aleksandr Kutuzov e74aa2d042 Merge branch 'dev' into release-candidate 2022-03-25 14:11:17 +03:00
Aleksandr Kutuzov e1ff6da6cd Merge branch 'dev' into release-candidate 2022-03-24 18:45:41 +03:00
Aleksandr Kutuzov c02d8beed9 Merge branch 'dev' into release-candidate 2022-03-24 16:59:28 +03:00
Aleksandr Kutuzov f2a8485176 Merge branch 'release-candidate' into release 2022-03-23 12:19:26 +03:00
Aleksandr Kutuzov dc6da827fa Merge branch 'dev' into release-candidate 2022-03-17 18:55:11 +07:00
Aleksandr Kutuzov 3f164ef30d Merge branch 'release-candidate' into release 2022-03-03 20:33:15 +07:00
Aleksandr Kutuzov afa46b0855 Merge remote-tracking branch 'origin/dev' into release-candidate 2022-02-24 15:45:28 +03:00
Aleksandr Kutuzov e69875954b Merge branch 'release-candidate' into release 2022-02-19 02:47:11 +03:00
Aleksandr Kutuzov 57689a1e0f Merge branch 'dev' into release-candidate 2022-02-16 20:53:12 +03:00
Aleksandr Kutuzov f8c8e63adf Merge branch 'release-candidate' into release 2022-02-14 17:37:24 +03:00
Aleksandr Kutuzov d4aeee64fa Merge branch 'dev' into release-candidate 2022-02-14 13:30:17 +03:00
Aleksandr Kutuzov 661b4b181a Merge branch 'dev' into release-candidate 2022-02-10 22:11:05 +03:00
Aleksandr Kutuzov bb81e86495 Merge branch 'release-candidate' into release 2022-02-07 14:44:23 +03:00
Aleksandr Kutuzov 3cdcd644fe Merge branch 'dev' into release-candidate 2022-02-04 00:31:46 +03:00
Aleksandr Kutuzov fffacfbe26 Merge branch 'release-candidate' into release 2022-02-01 16:07:34 +03:00
Aleksandr Kutuzov 1d5ca45675 Merge remote-tracking branch 'origin/dev' into release-candidate 2022-02-01 10:44:21 +03:00
Aleksandr Kutuzov 983537996c Merge branch 'dev' into release-candidate 2022-01-29 14:40:14 +03:00
Aleksandr Kutuzov 3e04b73c1e Merge branch 'release-candidate' into release 2022-01-21 17:12:55 +03:00
Aleksandr Kutuzov 830daa8b51 Merge branch 'dev' into release-candidate 2022-01-16 18:43:41 +03:00
Aleksandr Kutuzov 543402f64a Merge branch 'dev' into release-candidate 2022-01-14 17:10:12 +03:00
Aleksandr Kutuzov 24e7bda854 Merge branch 'dev' into release-candidate 2022-01-14 14:08:42 +03:00
Aleksandr Kutuzov 8042f94570 Merge branch 'release-candidate' into release 2021-12-28 18:02:40 +03:00
Aleksandr Kutuzov bb650c4e87 Merge branch 'dev' into release-candidate 2021-12-24 18:01:54 +03:00
Aleksandr Kutuzov 208ea6fbb0 Merge branch 'dev' into release-candidate 2021-12-23 21:17:20 +03:00
Aleksandr Kutuzov a426762605 Merge branch 'release-candidate' into release 2021-12-21 00:08:22 +03:00
Aleksandr Kutuzov 2ee2e8f4ba Merge branch 'dev' into release-candidate 2021-12-17 16:41:21 +03:00
DrZlo13 cc285ab05e Merge branch 'dev' into release-candidate 2021-12-16 05:24:32 +10:00
Aleksandr Kutuzov 06ad32109d Merge branch 'release-candidate' into release 2021-12-15 17:17:33 +03:00
Aleksandr Kutuzov 5a0f7e20ba Merge remote-tracking branch 'origin/dev' into release-candidate 2021-12-12 14:33:17 +03:00
Aleksandr Kutuzov cf6a1a7301 Merge branch 'dev' into release-candidate 2021-12-09 14:06:47 +03:00
Aleksandr Kutuzov 3a70d3b7f6 Merge branch 'dev' into release-candidate 2021-12-08 18:03:54 +03:00
Aleksandr Kutuzov 1060f7b037 Merge branch 'release-candidate' into release 2021-12-01 13:43:37 +03:00
Albert Kharisov 5352e4eb63 Fix butthurt and battery (#850)
* Fix butthurt and battery
2021-11-29 15:53:21 +03:00
Aleksandr Kutuzov b0b20392a5 Merge remote-tracking branch 'origin/dev' into release-candidate 2021-11-26 17:20:35 +03:00
Aleksandr Kutuzov 14777a7585 Merge remote-tracking branch 'origin/release-candidate' into release 2021-11-25 00:08:19 +03:00
Aleksandr Kutuzov a5fa342ffa Merge remote-tracking branch 'origin/dev' into release-candidate 2021-11-21 18:22:17 +03:00
Aleksandr Kutuzov 90eb608f08 Merge branch 'release-candidate' into release 2021-11-16 20:26:37 +03:00
Aleksandr Kutuzov be02738c4a Merge remote-tracking branch 'origin/dev' into release-candidate 2021-11-15 23:38:06 +03:00
Aleksandr Kutuzov dad1b0622b Merge branch 'dev' into release-candidate 2021-11-14 18:31:48 +03:00
Aleksandr Kutuzov cb227dafd1 Merge branch 'dev' into release-candidate 2021-11-04 22:44:46 +03:00
Aleksandr Kutuzov f3603e3c04 Merge branch 'dev' into release-candidate 2021-10-28 17:24:03 +03:00
Aleksandr Kutuzov eb74bcd41b Merge branch 'release-candidate' into release 2021-10-28 12:57:49 +03:00
Aleksandr Kutuzov 7b730dd08a Merge branch 'dev' into release-candidate 2021-10-25 03:41:13 +03:00
Aleksandr Kutuzov ce74a35066 Merge branch 'release-candidate' into release 2021-10-21 21:19:16 +03:00
Aleksandr Kutuzov 55692ee82f Merge branch 'dev' into release-candidate 2021-10-13 22:38:50 +03:00
Aleksandr Kutuzov 20deb6458a Merge branch 'release-candidate' into release 2021-10-04 05:28:46 +03:00
Aleksandr Kutuzov cca004a42d Merge branch 'dev' into release-candidate 2021-09-29 17:21:03 +03:00
Aleksandr Kutuzov 6c60c96d7c Merge branch 'release-candidate' into release 2021-09-28 12:54:44 +03:00
Aleksandr Kutuzov b3f1db8f9e Merge branch 'dev' into release-candidate 2021-09-17 12:21:33 +03:00
Aleksandr Kutuzov badf87fe67 Merge branch 'dev' into release-candidate 2021-09-16 19:13:52 +03:00
Aleksandr Kutuzov dc622321b9 Merge branch 'dev' into release-candidate 2021-09-15 20:31:28 +03:00
Aleksandr Kutuzov fd29e190b7 Merge branch 'release-candidate' into release 2021-09-15 20:27:06 +03:00
あく 3db456da98 [FL-1811] FuriHal: move core2 startup to hal init stage, prevent working with flash controller till core2 startup finish. #704 2021-09-15 17:40:52 +03:00
Aleksandr Kutuzov 44d7b5b1ce Merge branch 'release-candidate' into release 2021-09-10 03:59:09 +03:00
Aleksandr Kutuzov 97e0a3026f Merge branch 'release-candidate' into release 2021-09-03 01:45:03 +03:00
Aleksandr Kutuzov 3773428a21 Merge branch 'release-candidate' into release 2021-08-29 16:14:45 +03:00
Aleksandr Kutuzov b629ae18f2 Merge branch 'release-candidate' into release 2021-08-17 19:35:03 +03:00
Aleksandr Kutuzov 073c87f37d Merge remote-tracking branch 'origin/release-candidate' into release 2021-08-12 00:18:56 +03:00
あく 0bc3828fd9 [FL-1590] SubGhz: fix incorrect limits on frequency that were causing crashes #607 2021-07-30 14:15:01 +03:00
701 changed files with 646 additions and 2616 deletions
-68
View File
@@ -1,68 +0,0 @@
# Who owns all the fish by default
* @skotopes @DrZlo13 @hedger
# Apps
/applications/debug/bt_debug_app/ @skotopes @DrZlo13 @hedger @gornekich
/applications/debug/accessor/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/debug/battery_test_app/ @skotopes @DrZlo13 @hedger @gornekich
/applications/debug/bt_debug_app/ @skotopes @DrZlo13 @hedger @gornekich
/applications/debug/file_browser_test/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/debug/lfrfid_debug/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/debug/text_box_test/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/debug/uart_echo/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/debug/usb_mouse/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/debug/usb_test/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/main/archive/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/main/bad_usb/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/main/gpio/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/main/ibutton/ @skotopes @DrZlo13 @hedger @gsurkov
/applications/main/infrared/ @skotopes @DrZlo13 @hedger @gsurkov
/applications/main/nfc/ @skotopes @DrZlo13 @hedger @gornekich @Astrrra
/applications/main/subghz/ @skotopes @DrZlo13 @hedger @Skorpionm
/applications/main/u2f/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/services/bt/ @skotopes @DrZlo13 @hedger @gornekich
/applications/services/cli/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/services/crypto/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/services/desktop/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/services/dolphin/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/services/power/ @skotopes @DrZlo13 @hedger @gornekich
/applications/services/rpc/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/services/bt_settings_app/ @skotopes @DrZlo13 @hedger @gornekich
/applications/services/desktop_settings/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/services/dolphin_passport/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/services/power_settings_app/ @skotopes @DrZlo13 @hedger @gornekich
/applications/system/storage_move_to_sd/ @skotopes @DrZlo13 @hedger @nminaylov
/applications/debug/unit_tests/ @skotopes @DrZlo13 @hedger @nminaylov @gornekich @Astrrra @gsurkov @Skorpionm
/applications/examples/example_thermo/ @skotopes @DrZlo13 @hedger @gsurkov
# Firmware targets
/targets/ @skotopes @DrZlo13 @hedger @nminaylov
# Assets
/applications/main/infrared/resources/ @skotopes @DrZlo13 @hedger @gsurkov
# Documentation
/documentation/ @skotopes @DrZlo13 @hedger @drunkbatya
/scripts/toolchain/ @skotopes @DrZlo13 @hedger @drunkbatya
# Lib
/lib/stm32wb_copro/ @skotopes @DrZlo13 @hedger @gornekich
/lib/digital_signal/ @skotopes @DrZlo13 @hedger @gornekich
/lib/infrared/ @skotopes @DrZlo13 @hedger @gsurkov
/lib/lfrfid/ @skotopes @DrZlo13 @hedger @nminaylov
/lib/libusb_stm32/ @skotopes @DrZlo13 @hedger @nminaylov
/lib/mbedtls/ @skotopes @DrZlo13 @hedger @nminaylov
/lib/micro-ecc/ @skotopes @DrZlo13 @hedger @nminaylov
/lib/nanopb/ @skotopes @DrZlo13 @hedger @nminaylov
/lib/nfc/ @skotopes @DrZlo13 @hedger @gornekich @Astrrra
/lib/one_wire/ @skotopes @DrZlo13 @hedger @gsurkov
/lib/subghz/ @skotopes @DrZlo13 @hedger @Skorpionm
# CI/CD
/.github/workflows/ @skotopes @DrZlo13 @hedger @drunkbatya
-46
View File
@@ -1,46 +0,0 @@
name: Bug report
description: File a bug reports regarding the firmware.
labels: ['bug']
body:
- type: markdown
attributes:
value: |
Thank you for taking the time to fill out an issue, this template is meant for any issues related to the Flipper Zero firmware.
If you require help with the Flipper zero and its firmware, we ask that you join [our forum](https://forum.flipperzero.one)
- type: textarea
id: description
attributes:
label: Describe the bug.
description: "A clear and concise description of what the bug is."
validations:
required: true
- type: textarea
id: repro
attributes:
label: Reproduction
description: "How can this bug be reproduced?"
placeholder: |
1. Switch on...
2. Press button '....'
3. Wait for the moon phase
4. It burns
validations:
required: true
- type: input
id: target
attributes:
label: Target
description: Specify the target
# Target seems to be largely ignored by outside sources.
- type: textarea
id: logs
attributes:
label: Logs
description: Attach your debug logs here
render: Text
# Avoid rendering as Markdown here.
- type: textarea
id: anything-else
attributes:
label: Anything else?
description: Let us know if you have anything else to share.
@@ -1,21 +0,0 @@
name: Enhancements
description: Suggest improvements for any existing functionality within the firmware.
body:
- type: markdown
attributes:
value: |
Thank you for taking the time to fill out an issue. This template is meant for feature requests and improvements to already existing functionality.
If you require help with the Flipper zero and its firmware, we ask that you join [our forum](https://forum.flipperzero.one)
- type: textarea
id: proposal
attributes:
label: "Describe the enhancement you're suggesting."
description: |
Feel free to describe in as much detail as you wish.
validations:
required: true
- type: textarea
id: anything-else
attributes:
label: Anything else?
description: Let us know if you have anything else to share.
@@ -1,24 +0,0 @@
name: Feature Request
description: For feature requests regarding the firmware.
labels: ['feature request']
body:
- type: markdown
attributes:
value: |
Thank you for taking the time to fill out an issue, this template is meant for any feature suggestions.
If you require help with the Flipper zero and its firmware, we ask that you join [our forum](https://forum.flipperzero.one)
- type: textarea
id: proposal
attributes:
label: "Description of the feature you're suggesting."
description: |
Please describe your feature request in as many details as possible.
- Describe what it should do.
- Note whether it is to extend existing functionality or introduce new functionality.
validations:
required: true
- type: textarea
id: anything-else
attributes:
label: Anything else?
description: Let us know if you have anything else to share.
-5
View File
@@ -1,5 +0,0 @@
blank_issues_enabled: true
contact_links:
- name: Need help?
url: https://forum.flipperzero.one
about: For any question regarding on how to use the Flipper Zero and its firmware.
-78
View File
@@ -1,78 +0,0 @@
name: Submit SDK to Catalog
author: hedger
description: |
This action checks if SDK exists in the catalog and if not, adds and/or publishes it.
inputs:
catalog-url:
description: The URL of the Catalog API. Must not be empty or end with a /.
required: true
catalog-api-token:
description: The token to use to authenticate with the Catalog API. Must not be empty.
required: true
firmware-api:
description: Fimware's API version, major.minor
required: true
firmware-target:
description: Firmware's target, e.g. f7/f18
required: true
firmware-version:
description: Firmware's version, e.g. 0.13.37-rc3, or 0.13.37
required: true
runs:
using: composite
steps:
- name: Check inputs
shell: bash
run: |
if [ -z "${{ inputs.catalog-url }}" ] ; then
echo "Invalid catalog-url: ${{ inputs.catalog-url }}"
exit 1
fi
if [ -z "${{ inputs.catalog-api-token }}" ] ; then
echo "Invalid catalog-api-token: ${{ inputs.catalog-api-token }}"
exit 1
fi
if ! echo "${{ inputs.firmware-api }}" | grep -q "^[0-9]\+\.[0-9]\+$" ; then
echo "Invalid firmware-api: ${{ inputs.firmware-api }}"
exit 1
fi
if ! echo "${{ inputs.firmware-target }}" | grep -q "^f[0-9]\+$" ; then
echo "Invalid firmware-target: ${{ inputs.firmware-target }}"
exit 1
fi
if ! echo "${{ inputs.firmware-version }}" | grep -q "^[0-9]\+\.[0-9]\+\.[0-9]\+\(-rc\)\?\([0-9]\+\)\?$" ; then
echo "Invalid firmware-version: ${{ inputs.firmware-version }}"
exit 1
fi
- name: Submit SDK
shell: bash
run: |
curl -sX 'GET' \
'${{ inputs.catalog-url }}/api/v0/0/sdk?length=500' \
-H 'Accept: application/json' > sdk_versions.json
if jq -r -e ".[] | select((.api == \"${{ inputs.firmware-api }}\") and .target == \"${{ inputs.firmware-target }}\")" sdk_versions.json > found_sdk.json ; then
echo "API version ${{ inputs.firmware-api }} already exists in catalog"
if [ $(jq -r -e ".released_at" found_sdk.json) != "null" ] ; then
echo "API version is already released"
exit 0
fi
if ! echo "${{ inputs.firmware-version }}" | grep -q -- "-rc" ; then
SDK_ID=$(jq -r ._id found_sdk.json)
echo "Marking SDK $SDK_ID as released"
curl -X 'POST' \
"${{ inputs.catalog-url }}/api/v0/0/sdk/${SDK_ID}/release" \
-H 'Accept: application/json' \
-H 'Authorization: Bearer ${{ inputs.catalog-api-token }}' \
-d ''
fi
else
echo "API version ${{ inputs.firmware-api }} doesn't exist in catalog, adding"
curl -X 'POST' \
'${{ inputs.catalog-url }}/api/v0/0/sdk' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer ${{ inputs.catalog-api-token }}' \
-H 'Content-Type: application/json' \
-d "{\"name\": \"${{ inputs.firmware-version }}\", \"target\": \"${{ inputs.firmware-target }}\", \"api\": \"${{ inputs.firmware-api }}\"}"
fi
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

-13
View File
@@ -1,13 +0,0 @@
# What's new
- [ Describe changes here ]
# Verification
- [ Describe how to verify changes ]
# Checklist (For Reviewer)
- [ ] PR has description of feature/bug or link to Confluence/Jira task
- [ ] Description contains actions to verify feature/bugfix
- [ ] I've built this code, uploaded it to the device and verified feature/bugfix
-170
View File
@@ -1,170 +0,0 @@
name: 'Build'
on:
push:
branches:
- dev
tags:
- '*'
pull_request:
env:
DEFAULT_TARGET: f7
FBT_TOOLCHAIN_PATH: /runner/_work
FBT_GIT_SUBMODULE_SHALLOW: 1
jobs:
main:
runs-on: [self-hosted, FlipperZeroShell]
strategy:
fail-fast: false
matrix:
target: [f7, f18]
steps:
- name: 'Wipe workspace'
run: find ./ -mount -maxdepth 1 -exec rm -rf {} \;
- name: 'Checkout code'
uses: actions/checkout@v4
with:
fetch-depth: 1
ref: ${{ github.event.pull_request.head.sha }}
- name: 'Get commit details'
id: names
run: |
BUILD_TYPE='DEBUG=1 COMPACT=0'
if [[ ${{ github.event_name }} == 'pull_request' ]]; then
TYPE="pull"
elif [[ "${{ github.ref }}" == "refs/tags/"* ]]; then
TYPE="tag"
BUILD_TYPE='DEBUG=0 COMPACT=1'
else
TYPE="other"
fi
python3 scripts/get_env.py "--event_file=${{ github.event_path }}" "--type=$TYPE" || cat "${{ github.event_path }}"
echo "event_type=$TYPE" >> $GITHUB_OUTPUT
echo "FBT_BUILD_TYPE=$BUILD_TYPE" >> $GITHUB_ENV
echo "TARGET=${{ matrix.target }}" >> $GITHUB_ENV
echo "TARGET_HW=$(echo "${{ matrix.target }}" | sed 's/f//')" >> $GITHUB_ENV
- name: 'Check API versions for consistency between targets'
run: |
set -e
N_API_HEADER_SIGNATURES=`ls -1 targets/f*/api_symbols.csv | xargs -I {} sh -c "head -n2 {} | md5sum" | sort -u | wc -l`
if [ $N_API_HEADER_SIGNATURES != 1 ] ; then
echo API versions aren\'t matching for available targets. Please update!
echo API versions are:
head -n2 targets/f*/api_symbols.csv
exit 1
fi
- name: 'Build the firmware and apps'
id: build-fw
run: |
./fbt TARGET_HW=$TARGET_HW $FBT_BUILD_TYPE copro_dist updater_package fap_dist
echo "firmware_api=$(./fbt TARGET_HW=$TARGET_HW get_apiversion)" >> $GITHUB_OUTPUT
- name: 'Check for uncommitted changes'
run: |
git diff --exit-code
- name: 'Copy build output'
run: |
set -e
rm -rf artifacts map_analyser_files || true
mkdir artifacts map_analyser_files
cp dist/${TARGET}-*/* artifacts/ || true
tar czpf "artifacts/flipper-z-${TARGET}-resources-${SUFFIX}.tgz" \
-C build/latest resources
tar czpf "artifacts/flipper-z-${TARGET}-debugapps-${SUFFIX}.tgz" \
-C dist/${TARGET}-*/apps/Debug .
tar czpf "artifacts/flipper-z-${TARGET}-appsymbols-${SUFFIX}.tgz" \
-C dist/${TARGET}-*/debug_elf .
- name: 'Copy universal artifacts'
if: ${{ !github.event.pull_request.head.repo.fork && matrix.target == env.DEFAULT_TARGET }}
run: |
tar czpf "artifacts/flipper-z-any-scripts-${SUFFIX}.tgz" scripts
cp build/core2_firmware.tgz "artifacts/flipper-z-any-core2_firmware-${SUFFIX}.tgz"
- name: 'Upload artifacts to update server'
if: ${{ !github.event.pull_request.head.repo.fork }}
run: |
FILES=$(for ARTIFACT in $(find artifacts -maxdepth 1 -not -type d); do echo "-F files=@${ARTIFACT}"; done)
curl --fail -L -H "Token: ${{ secrets.INDEXER_TOKEN }}" \
-F "branch=${BRANCH_NAME}" \
-F "version_token=${COMMIT_SHA}" \
${FILES[@]} \
"${{ secrets.INDEXER_URL }}"/firmware/uploadfiles
- name: 'Copy & analyse map analyser files'
if: ${{ !github.event.pull_request.head.repo.fork && matrix.target == env.DEFAULT_TARGET }}
run: |
cp build/${DEFAULT_TARGET}-firmware-*/firmware.elf.map map_analyser_files/firmware.elf.map
cp build/${DEFAULT_TARGET}-firmware-*/firmware.elf map_analyser_files/firmware.elf
cp ${{ github.event_path }} map_analyser_files/event.json
source scripts/toolchain/fbtenv.sh
get_size()
{
SECTION="$1";
arm-none-eabi-size \
-A map_analyser_files/firmware.elf \
| grep "^$SECTION" | awk '{print $2}'
}
export BSS_SIZE="$(get_size ".bss")"
export TEXT_SIZE="$(get_size ".text")"
export RODATA_SIZE="$(get_size ".rodata")"
export DATA_SIZE="$(get_size ".data")"
export FREE_FLASH_SIZE="$(get_size ".free_flash")"
python3 -m pip install mariadb==1.1.6 cxxfilt==0.3.0
python3 scripts/map_parser.py map_analyser_files/firmware.elf.map map_analyser_files/firmware.elf.map.all
python3 scripts/map_mariadb_insert.py \
${{ secrets.AMAP_MARIADB_USER }} \
${{ secrets.AMAP_MARIADB_PASSWORD }} \
${{ secrets.AMAP_MARIADB_HOST }} \
${{ secrets.AMAP_MARIADB_PORT }} \
${{ secrets.AMAP_MARIADB_DATABASE }} \
map_analyser_files/firmware.elf.map.all
- name: 'Find previous comment'
if: ${{ !github.event.pull_request.head.repo.fork && matrix.target == env.DEFAULT_TARGET && github.event.pull_request }}
uses: peter-evans/find-comment@v2
id: find-comment
with:
issue-number: ${{ github.event.pull_request.number }}
comment-author: 'github-actions[bot]'
body-includes: 'Compiled ${{ matrix.target }} firmware for commit'
- name: 'Create or update comment'
if: ${{ !github.event.pull_request.head.repo.fork && matrix.target == env.DEFAULT_TARGET && github.event.pull_request }}
uses: peter-evans/create-or-update-comment@v3
with:
comment-id: ${{ steps.find-comment.outputs.comment-id }}
issue-number: ${{ github.event.pull_request.number }}
body: |
**Compiled ${{ matrix.target }} firmware for commit `${{steps.names.outputs.commit_sha}}`:**
- [📦 Update package](https://update.flipperzero.one/builds/firmware/${{steps.names.outputs.branch_name}}/flipper-z-${{steps.names.outputs.default_target}}-update-${{steps.names.outputs.suffix}}.tgz)
- [📥 DFU file](https://update.flipperzero.one/builds/firmware/${{steps.names.outputs.branch_name}}/flipper-z-${{steps.names.outputs.default_target}}-full-${{steps.names.outputs.suffix}}.dfu)
- [☁️ Web/App updater](https://lab.flipper.net/?url=https://update.flipperzero.one/builds/firmware/${{steps.names.outputs.branch_name}}/flipper-z-${{steps.names.outputs.default_target}}-update-${{steps.names.outputs.suffix}}.tgz&channel=${{steps.names.outputs.branch_name}}&version=${{steps.names.outputs.commit_sha}})
edit-mode: replace
- name: 'SDK submission to staging catalog'
if: ${{ steps.names.outputs.event_type == 'tag' && matrix.target == env.DEFAULT_TARGET }}
uses: ./.github/actions/submit_sdk
with:
catalog-url: ${{ secrets.CATALOG_STAGING_URL }}
catalog-api-token: ${{ secrets.CATALOG_STAGING_API_TOKEN }}
firmware-api: ${{ steps.build-fw.outputs.firmware_api }}
firmware-target: ${{ matrix.target }}
firmware-version: ${{ steps.names.outputs.suffix }}
- name: 'SDK submission to prod catalog'
if: ${{ steps.names.outputs.event_type == 'tag' && matrix.target == env.DEFAULT_TARGET }}
uses: ./.github/actions/submit_sdk
with:
catalog-url: ${{ secrets.CATALOG_URL }}
catalog-api-token: ${{ secrets.CATALOG_API_TOKEN }}
firmware-api: ${{ steps.build-fw.outputs.firmware_api }}
firmware-target: ${{ matrix.target }}
firmware-version: ${{ steps.names.outputs.suffix }}
-86
View File
@@ -1,86 +0,0 @@
name: 'Compact build'
on:
pull_request:
env:
FBT_TOOLCHAIN_PATH: /runner/_work
FBT_GIT_SUBMODULE_SHALLOW: 1
jobs:
compact:
runs-on: [self-hosted, FlipperZeroShell]
strategy:
fail-fast: false
matrix:
target: [f7, f18]
steps:
- name: 'Wipe workspace'
run: find ./ -mount -maxdepth 1 -exec rm -rf {} \;
- name: 'Checkout code'
uses: actions/checkout@v4
with:
fetch-depth: 1
submodules: false
ref: ${{ github.event.pull_request.head.sha }}
- name: 'Get commit details'
run: |
if [[ ${{ github.event_name }} == 'pull_request' ]]; then
TYPE="pull"
elif [[ "${{ github.ref }}" == "refs/tags/"* ]]; then
TYPE="tag"
else
TYPE="other"
fi
python3 scripts/get_env.py "--event_file=${{ github.event_path }}" "--type=$TYPE" || cat "${{ github.event_path }}"
- name: 'Build the firmware'
id: build-fw
run: |
set -e
TARGET="$(echo '${{ matrix.target }}' | sed 's/f//')"; \
./fbt TARGET_HW=$TARGET DEBUG=0 COMPACT=1 fap_dist updater_package
echo "sdk-file=$(ls dist/${{ matrix.target }}-*/flipper-z-${{ matrix.target }}-sdk-*.zip)" >> $GITHUB_OUTPUT
echo "hw-target-code=$TARGET" >> $GITHUB_OUTPUT
- name: Deploy uFBT with SDK
uses: flipperdevices/flipperzero-ufbt-action@v0.1
with:
task: setup
sdk-file: ${{ steps.build-fw.outputs.sdk-file }}
sdk-hw-target: ${{ steps.build-fw.outputs.hw-target-code }}
- name: Build test app with SDK
run: |
mkdir testapp
cd testapp
ufbt create APPID=testapp
ufbt
- name: Build example & external apps with uFBT
run: |
for appdir in 'applications/examples'; do
for app in $(find "$appdir" -maxdepth 1 -mindepth 1 -type d); do
pushd $app
TARGETS_FAM=$(grep "targets" application.fam || echo "${{ matrix.target }}")
if ! grep -q "${{ matrix.target }}" <<< $TARGETS_FAM ; then
echo Skipping unsupported app: $app
popd
continue
fi
echo Building $app
ufbt
popd
done
done
## Uncomment this for a single job that will run only if all targets are built successfully
# report-status:
# name: Report status
# needs: [compact]
# if: always() && !contains(needs.*.result, 'failure')
# runs-on: [self-hosted, FlipperZeroShell]
# steps:
# - run: echo "All good ✨" ;
@@ -1,101 +0,0 @@
name: 'Lint sources & check submodule integrity'
on:
pull_request:
env:
TARGETS: f7
FBT_TOOLCHAIN_PATH: /runner/_work
SET_GH_OUTPUT: 1
jobs:
lint_sources_check_submodules:
runs-on: [self-hosted, FlipperZeroShell]
steps:
- name: 'Wipe workspace'
run: find ./ -mount -maxdepth 1 -exec rm -rf {} \;
- name: 'Checkout code'
uses: actions/checkout@v4
with:
fetch-depth: 2
ref: ${{ github.sha }}
- name: 'Check protobuf branch'
run: |
git submodule update --init;
SUB_PATH="assets/protobuf";
SUB_BRANCH="dev";
SUB_COMMITS_MIN=40;
cd "$SUB_PATH";
SUBMODULE_HASH="$(git rev-parse HEAD)";
BRANCHES=$(git branch -r --contains "$SUBMODULE_HASH");
COMMITS_IN_BRANCH="$(git rev-list --count dev)";
if [ $COMMITS_IN_BRANCH -lt $SUB_COMMITS_MIN ]; then
echo "name=fails::error" >> $GITHUB_OUTPUT;
echo "::error::Error: Too few commits in $SUB_BRANCH of submodule $SUB_PATH: $COMMITS_IN_BRANCH(expected $SUB_COMMITS_MIN+)";
exit 1;
fi
if ! grep -q "/$SUB_BRANCH" <<< "$BRANCHES"; then
echo "name=fails::error" >> $GITHUB_OUTPUT;
echo "::error::Error: Submodule $SUB_PATH is not on branch $SUB_BRANCH";
exit 1;
fi
- name: 'Check for new TODOs'
id: check_todos
if: github.event_name == 'pull_request'
run: |
set +e;
git diff --unified=0 --no-color ${{ github.event.pull_request.base.sha }} ${{ github.sha }} | grep -E '^\+' | grep -i -E '(TODO|HACK|FIXME|XXX)[ :]' | grep -v -- '-nofl' > lines.log;
MISSING_TICKETS=$( grep -v -E 'FL-[0-9]+' lines.log );
if [ -n "$MISSING_TICKETS" ]; then
echo "Error: Missing ticket number in \`TODO\` comment(s)" >> $GITHUB_STEP_SUMMARY;
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY;
echo "$MISSING_TICKETS" >> $GITHUB_STEP_SUMMARY;
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY;
exit 1;
else
echo "No new TODOs without tickets found" >> $GITHUB_STEP_SUMMARY;
fi
- name: 'Check Python code formatting'
id: syntax_check_py
if: always()
run: |
set +e;
./fbt -s lint_py 2>&1 | tee lint-py.log;
if [ "${PIPESTATUS[0]}" -ne 0 ]; then
# Save multiline output
echo "errors=1" >> $GITHUB_OUTPUT;
printf "Python Lint errors:\n\`\`\`\n" >> $GITHUB_STEP_SUMMARY;
echo "$(cat lint-py.log)" >> $GITHUB_STEP_SUMMARY;
printf "\n\`\`\`\n" >> $GITHUB_STEP_SUMMARY;
exit 1;
else
echo "Python Lint: all good ✨" >> $GITHUB_STEP_SUMMARY;
fi
- name: 'Check C++ code formatting'
id: syntax_check_cpp
if: always()
run: |
set +e;
./fbt -s lint 2>&1 | tee lint-cpp.log;
if [ "${PIPESTATUS[0]}" -ne 0 ]; then
# Save multiline output
echo "errors=1" >> $GITHUB_OUTPUT;
printf "C Lint errors:\n\`\`\`\n" >> $GITHUB_STEP_SUMMARY;
echo "$(cat lint-cpp.log)" >> $GITHUB_STEP_SUMMARY;
printf "\n\`\`\`\n" >> $GITHUB_STEP_SUMMARY;
exit 1;
else
echo "C Lint: all good ✨" >> $GITHUB_STEP_SUMMARY;
fi
- name: Report code formatting errors
if: ( steps.syntax_check_py.outputs.errors || steps.syntax_check_cpp.outputs.errors ) && github.event.pull_request
run: |
echo "Code formatting errors found";
echo "Please run './fbt format' or './fbt format_py' to fix them";
exit 1;
-42
View File
@@ -1,42 +0,0 @@
name: 'Check FL ticket in PR name'
on:
push:
branches:
- dev
env:
FBT_TOOLCHAIN_PATH: /runner/_work
jobs:
merge_report:
runs-on: [self-hosted, FlipperZeroShell]
steps:
- name: 'Wipe workspace'
run: find ./ -mount -maxdepth 1 -exec rm -rf {} \;
- name: 'Checkout code'
uses: actions/checkout@v4
with:
fetch-depth: 1
ref: ${{ github.event.pull_request.head.sha }}
- name: 'Get commit details'
run: |
if [[ ${{ github.event_name }} == 'pull_request' ]]; then
TYPE="pull"
elif [[ "${{ github.ref }}" == "refs/tags/"* ]]; then
TYPE="tag"
else
TYPE="other"
fi
python3 scripts/get_env.py "--event_file=${{ github.event_path }}" "--type=$TYPE" || cat "${{ github.event_path }}"
- name: 'Check ticket and report'
run: |
source scripts/toolchain/fbtenv.sh
python3 -m pip install slack_sdk
python3 scripts/merge_report_qa.py \
${{ secrets.QA_REPORT_SLACK_TOKEN }} \
${{ secrets.QA_REPORT_SLACK_CHANNEL }}
-88
View File
@@ -1,88 +0,0 @@
name: 'Static C/C++ analysis with PVS-Studio'
on:
push:
branches:
- dev
pull_request:
env:
TARGETS: f7
DEFAULT_TARGET: f7
FBT_TOOLCHAIN_PATH: /runner/_work
FBT_GIT_SUBMODULE_SHALLOW: 1
jobs:
analyse_c_cpp:
if: ${{ !github.event.pull_request.head.repo.fork }}
runs-on: [self-hosted, FlipperZeroShell]
steps:
- name: 'Wipe workspace'
run: find ./ -mount -maxdepth 1 -exec rm -rf {} \;
- name: 'Checkout code'
uses: actions/checkout@v4
with:
fetch-depth: 1
ref: ${{ github.event.pull_request.head.sha }}
- name: 'Get commit details'
id: names
run: |
if [[ ${{ github.event_name }} == 'pull_request' ]]; then
TYPE="pull"
elif [[ "${{ github.ref }}" == "refs/tags/"* ]]; then
TYPE="tag"
else
TYPE="other"
fi
python3 scripts/get_env.py "--event_file=${{ github.event_path }}" "--type=$TYPE" || cat "${{ github.event_path }}"
- name: 'Supply PVS credentials'
run: |
pvs-studio-analyzer credentials ${{ secrets.PVS_STUDIO_CREDENTIALS }}
- name: 'Convert PVS-Studio output to html and detect warnings'
id: pvs-warn
run: |
WARNINGS=0
./fbt COMPACT=1 PVSNOBROWSER=1 firmware_pvs || WARNINGS=1
echo "warnings=${WARNINGS}" >> $GITHUB_OUTPUT
- name: 'Upload report'
if: ${{ !github.event.pull_request.head.repo.fork && (steps.pvs-warn.outputs.warnings != 0) }}
uses: prewk/s3-cp-action@v2
with:
aws_s3_endpoint: "${{ secrets.PVS_AWS_ENDPOINT }}"
aws_access_key_id: "${{ secrets.PVS_AWS_ACCESS_KEY }}"
aws_secret_access_key: "${{ secrets.PVS_AWS_SECRET_KEY }}"
source: "./build/f7-firmware-DC/pvsreport"
dest: "s3://${{ secrets.PVS_AWS_BUCKET }}/${{steps.names.outputs.branch_name}}/${{steps.names.outputs.default_target}}-${{steps.names.outputs.suffix}}/"
flags: "--recursive --acl public-read"
- name: 'Find Previous Comment'
if: ${{ !github.event.pull_request.head.repo.fork && github.event.pull_request && (steps.pvs-warn.outputs.warnings != 0) }}
uses: peter-evans/find-comment@v2
id: fc
with:
issue-number: ${{ github.event.pull_request.number }}
comment-author: 'github-actions[bot]'
body-includes: 'PVS-Studio report for commit'
- name: 'Create or update comment'
if: ${{ !github.event.pull_request.head.repo.fork && github.event.pull_request && (steps.pvs-warn.outputs.warnings != 0) }}
uses: peter-evans/create-or-update-comment@v1
with:
comment-id: ${{ steps.fc.outputs.comment-id }}
issue-number: ${{ github.event.pull_request.number }}
body: |
**PVS-Studio report for commit `${{steps.names.outputs.commit_sha}}`:**
- [Report](https://pvs.flipp.dev/${{steps.names.outputs.branch_name}}/${{steps.names.outputs.default_target}}-${{steps.names.outputs.suffix}}/index.html)
edit-mode: replace
- name: 'Raise exception'
if: ${{ steps.pvs-warn.outputs.warnings != 0 }}
run: |
echo "Please fix all PVS warnings before merge"
exit 1
-15
View File
@@ -1,15 +0,0 @@
name: 'Reindex'
on:
release:
types: [prereleased,released]
jobs:
reindex:
name: 'Reindex updates'
runs-on: [self-hosted, FlipperZeroShell]
steps:
- name: Trigger reindex
run: |
curl --fail -L -H "Token: ${{ secrets.INDEXER_TOKEN }}" \
"${{ secrets.INDEXER_URL }}"/firmware/reindex
-69
View File
@@ -1,69 +0,0 @@
name: 'Unit tests'
on:
pull_request:
env:
TARGETS: f7
DEFAULT_TARGET: f7
FBT_TOOLCHAIN_PATH: /opt
FBT_GIT_SUBMODULE_SHALLOW: 1
jobs:
run_units_on_bench:
runs-on: [self-hosted, FlipperZeroUnitTest]
steps:
- name: 'Wipe workspace'
run: find ./ -mount -maxdepth 1 -exec rm -rf {} \;
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 1
ref: ${{ github.event.pull_request.head.sha }}
- name: 'Get flipper from device manager (mock)'
id: device
run: |
echo "flipper=/dev/ttyACM0" >> $GITHUB_OUTPUT
- name: 'Flash unit tests firmware'
id: flashing
if: success()
timeout-minutes: 10
run: |
./fbt resources firmware_latest flash SWD_TRANSPORT_SERIAL=2A0906016415303030303032 LIB_DEBUG=1 FIRMWARE_APP_SET=unit_tests FORCE=1
- name: 'Wait for flipper and format ext'
id: format_ext
if: steps.flashing.outcome == 'success'
timeout-minutes: 5
run: |
source scripts/toolchain/fbtenv.sh
python3 scripts/testing/await_flipper.py ${{steps.device.outputs.flipper}}
python3 scripts/storage.py -p ${{steps.device.outputs.flipper}} format_ext
- name: 'Copy assets and unit data, reboot and wait for flipper'
id: copy
if: steps.format_ext.outcome == 'success'
timeout-minutes: 7
run: |
source scripts/toolchain/fbtenv.sh
python3 scripts/testing/await_flipper.py ${{steps.device.outputs.flipper}}
rm -rf build/latest/resources/dolphin
python3 scripts/storage.py -p ${{steps.device.outputs.flipper}} -f send build/latest/resources /ext
python3 scripts/power.py -p ${{steps.device.outputs.flipper}} reboot
python3 scripts/testing/await_flipper.py ${{steps.device.outputs.flipper}}
- name: 'Run units and validate results'
id: run_units
if: steps.copy.outcome == 'success'
timeout-minutes: 7
run: |
source scripts/toolchain/fbtenv.sh
python3 scripts/testing/units.py ${{steps.device.outputs.flipper}}
- name: 'Check GDB output'
if: failure()
run: |
./fbt gdb_trace_all SWD_TRANSPORT_SERIAL=2A0906016415303030303032 LIB_DEBUG=1 FIRMWARE_APP_SET=unit_tests FORCE=1
-75
View File
@@ -1,75 +0,0 @@
name: 'Updater test'
on:
pull_request:
env:
TARGETS: f7
DEFAULT_TARGET: f7
FBT_TOOLCHAIN_PATH: /opt
FBT_GIT_SUBMODULE_SHALLOW: 1
jobs:
test_updater_on_bench:
runs-on: [self-hosted, FlipperZeroUpdaterTest]
steps:
- name: 'Wipe workspace'
run: find ./ -mount -maxdepth 1 -exec rm -rf {} \;
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 1
submodules: false
ref: ${{ github.event.pull_request.head.sha }}
- name: 'Get flipper from device manager (mock)'
id: device
run: |
echo "flipper=Rekigyn" >> $GITHUB_OUTPUT
echo "stlink=0F020D026415303030303032" >> $GITHUB_OUTPUT
- name: 'Flashing target firmware'
id: first_full_flash
timeout-minutes: 10
run: |
source scripts/toolchain/fbtenv.sh
./fbt flash_usb_full PORT=${{steps.device.outputs.flipper}} FORCE=1
python3 scripts/testing/await_flipper.py ${{steps.device.outputs.flipper}}
- name: 'Validating updater'
id: second_full_flash
timeout-minutes: 10
if: success()
run: |
source scripts/toolchain/fbtenv.sh
./fbt flash_usb PORT=${{steps.device.outputs.flipper}} FORCE=1
python3 scripts/testing/await_flipper.py ${{steps.device.outputs.flipper}}
- name: 'Get last release tag'
id: release_tag
if: failure()
run: |
echo "tag=$(git tag -l --sort=-version:refname | grep -v "rc\|RC" | head -1)" >> $GITHUB_OUTPUT
- name: 'Wipe workspace'
run: find ./ -mount -maxdepth 1 -exec rm -rf {} \;
- name: 'Checkout latest release'
uses: actions/checkout@v4
if: failure()
with:
fetch-depth: 1
ref: ${{ steps.release_tag.outputs.tag }}
- name: 'Flash last release'
if: failure()
run: |
./fbt flash SWD_TRANSPORT_SERIAL=${{steps.device.outputs.stlink}} FORCE=1
- name: 'Wait for flipper and format ext'
if: failure()
run: |
source scripts/toolchain/fbtenv.sh
python3 scripts/testing/await_flipper.py ${{steps.device.outputs.flipper}}
python3 scripts/storage.py -p ${{steps.device.outputs.flipper}} format_ext
+23 -23
View File
@@ -12,7 +12,7 @@
#include <nfc/protocols/mf_ultralight/mf_ultralight_poller_sync.h>
#include <nfc/protocols/mf_classic/mf_classic_poller_sync.h>
#include <nfc/helpers/nfc_dict.h>
#include <toolbox/keys_dict.h>
#include <nfc/nfc.h>
#include "../minunit.h"
@@ -443,36 +443,36 @@ MU_TEST(mf_classic_dict_test) {
"Remove test dict failed");
}
NfcDict* dict = nfc_dict_alloc(
NFC_APP_MF_CLASSIC_DICT_UNIT_TEST_PATH, NfcDictModeOpenAlways, sizeof(MfClassicKey));
mu_assert(dict != NULL, "nfc_dict_alloc() failed");
KeysDict* dict = keys_dict_alloc(
NFC_APP_MF_CLASSIC_DICT_UNIT_TEST_PATH, KeysDictModeOpenAlways, sizeof(MfClassicKey));
mu_assert(dict != NULL, "keys_dict_alloc() failed");
size_t dict_keys_total = nfc_dict_get_total_keys(dict);
mu_assert(dict_keys_total == 0, "nfc_dict_keys_total() failed");
size_t dict_keys_total = keys_dict_get_total_keys(dict);
mu_assert(dict_keys_total == 0, "keys_dict_keys_total() failed");
const uint32_t test_key_num = 30;
MfClassicKey* key_arr_ref = malloc(test_key_num * sizeof(MfClassicKey));
for(size_t i = 0; i < test_key_num; i++) {
furi_hal_random_fill_buf(key_arr_ref[i].data, sizeof(MfClassicKey));
mu_assert(
nfc_dict_add_key(dict, key_arr_ref[i].data, sizeof(MfClassicKey)), "add key failed");
keys_dict_add_key(dict, key_arr_ref[i].data, sizeof(MfClassicKey)), "add key failed");
size_t dict_keys_total = nfc_dict_get_total_keys(dict);
mu_assert(dict_keys_total == (i + 1), "nfc_dict_keys_total() failed");
size_t dict_keys_total = keys_dict_get_total_keys(dict);
mu_assert(dict_keys_total == (i + 1), "keys_dict_keys_total() failed");
}
nfc_dict_free(dict);
keys_dict_free(dict);
dict = nfc_dict_alloc(
NFC_APP_MF_CLASSIC_DICT_UNIT_TEST_PATH, NfcDictModeOpenAlways, sizeof(MfClassicKey));
mu_assert(dict != NULL, "nfc_dict_alloc() failed");
dict = keys_dict_alloc(
NFC_APP_MF_CLASSIC_DICT_UNIT_TEST_PATH, KeysDictModeOpenAlways, sizeof(MfClassicKey));
mu_assert(dict != NULL, "keys_dict_alloc() failed");
dict_keys_total = nfc_dict_get_total_keys(dict);
mu_assert(dict_keys_total == test_key_num, "nfc_dict_keys_total() failed");
dict_keys_total = keys_dict_get_total_keys(dict);
mu_assert(dict_keys_total == test_key_num, "keys_dict_keys_total() failed");
MfClassicKey key_dut = {};
size_t key_idx = 0;
while(nfc_dict_get_next_key(dict, key_dut.data, sizeof(MfClassicKey))) {
while(keys_dict_get_next_key(dict, key_dut.data, sizeof(MfClassicKey))) {
mu_assert(
memcmp(key_arr_ref[key_idx].data, key_dut.data, sizeof(MfClassicKey)) == 0,
"Loaded key data mismatch");
@@ -484,19 +484,19 @@ MU_TEST(mf_classic_dict_test) {
for(size_t i = 0; i < COUNT_OF(delete_keys_idx); i++) {
MfClassicKey* key = &key_arr_ref[delete_keys_idx[i]];
mu_assert(
nfc_dict_is_key_present(dict, key->data, sizeof(MfClassicKey)),
"nfc_dict_is_key_present() failed");
keys_dict_is_key_present(dict, key->data, sizeof(MfClassicKey)),
"keys_dict_is_key_present() failed");
mu_assert(
nfc_dict_delete_key(dict, key->data, sizeof(MfClassicKey)),
"nfc_dict_delete_key() failed");
keys_dict_delete_key(dict, key->data, sizeof(MfClassicKey)),
"keys_dict_delete_key() failed");
}
dict_keys_total = nfc_dict_get_total_keys(dict);
dict_keys_total = keys_dict_get_total_keys(dict);
mu_assert(
dict_keys_total == test_key_num - COUNT_OF(delete_keys_idx),
"nfc_dict_keys_total() failed");
"keys_dict_keys_total() failed");
nfc_dict_free(dict);
keys_dict_free(dict);
free(key_arr_ref);
mu_assert(
@@ -27,6 +27,7 @@ static const uint32_t baudrate_list[] = {
460800,
921600,
};
static const char* software_de_re[] = {"None", "4"};
bool gpio_scene_usb_uart_cfg_on_event(void* context, SceneManagerEvent event) {
GpioApp* app = context;
@@ -84,6 +85,17 @@ static void line_port_cb(VariableItem* item) {
view_dispatcher_send_custom_event(app->view_dispatcher, GpioUsbUartEventConfigSet);
}
static void line_software_de_re_cb(VariableItem* item) {
GpioApp* app = variable_item_get_context(item);
furi_assert(app);
uint8_t index = variable_item_get_current_value_index(item);
variable_item_set_current_value_text(item, software_de_re[index]);
app->usb_uart_cfg->software_de_re = index;
view_dispatcher_send_custom_event(app->view_dispatcher, GpioUsbUartEventConfigSet);
}
static void line_flow_cb(VariableItem* item) {
GpioApp* app = variable_item_get_context(item);
furi_assert(app);
@@ -155,6 +167,11 @@ void gpio_scene_usb_uart_cfg_on_enter(void* context) {
app->var_item_flow = item;
line_ensure_flow_invariant(app);
item = variable_item_list_add(
var_item_list, "DE/RE Pin", COUNT_OF(software_de_re), line_software_de_re_cb, app);
variable_item_set_current_value_index(item, app->usb_uart_cfg->software_de_re);
variable_item_set_current_value_text(item, software_de_re[app->usb_uart_cfg->software_de_re]);
variable_item_list_set_selected_item(
var_item_list, scene_manager_get_scene_state(app->scene_manager, GpioAppViewUsbUartCfg));
+35
View File
@@ -6,11 +6,16 @@
#include <furi_hal.h>
#include <furi_hal_usb_cdc.h>
//TODO: FL-3276 port to new USART API
#include <stm32wbxx_ll_lpuart.h>
#include <stm32wbxx_ll_usart.h>
#define USB_CDC_PKT_LEN CDC_DATA_SZ
#define USB_UART_RX_BUF_SIZE (USB_CDC_PKT_LEN * 5)
#define USB_CDC_BIT_DTR (1 << 0)
#define USB_CDC_BIT_RTS (1 << 1)
#define USB_USART_DE_RE_PIN &gpio_ext_pa4
static const GpioPin* flow_pins[][2] = {
{&gpio_ext_pa7, &gpio_ext_pa6}, // 2, 3
@@ -247,6 +252,17 @@ static int32_t usb_uart_worker(void* context) {
usb_uart->cfg.flow_pins = usb_uart->cfg_new.flow_pins;
events |= WorkerEvtCtrlLineSet;
}
if(usb_uart->cfg.software_de_re != usb_uart->cfg_new.software_de_re) {
usb_uart->cfg.software_de_re = usb_uart->cfg_new.software_de_re;
if(usb_uart->cfg.software_de_re != 0) {
furi_hal_gpio_write(USB_USART_DE_RE_PIN, true);
furi_hal_gpio_init(
USB_USART_DE_RE_PIN, GpioModeOutputPushPull, GpioPullNo, GpioSpeedMedium);
} else {
furi_hal_gpio_init(
USB_USART_DE_RE_PIN, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
}
}
api_lock_unlock(usb_uart->cfg_lock);
}
if(events & WorkerEvtLineCfgSet) {
@@ -260,6 +276,8 @@ static int32_t usb_uart_worker(void* context) {
usb_uart_vcp_deinit(usb_uart, usb_uart->cfg.vcp_ch);
usb_uart_serial_deinit(usb_uart, usb_uart->cfg.uart_ch);
furi_hal_gpio_init(USB_USART_DE_RE_PIN, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
if(usb_uart->cfg.flow_pins != 0) {
furi_hal_gpio_init_simple(flow_pins[usb_uart->cfg.flow_pins - 1][0], GpioModeAnalog);
furi_hal_gpio_init_simple(flow_pins[usb_uart->cfg.flow_pins - 1][1], GpioModeAnalog);
@@ -298,7 +316,24 @@ static int32_t usb_uart_tx_thread(void* context) {
if(len > 0) {
usb_uart->st.tx_cnt += len;
if(usb_uart->cfg.software_de_re != 0)
furi_hal_gpio_write(USB_USART_DE_RE_PIN, false);
furi_hal_uart_tx(usb_uart->cfg.uart_ch, data, len);
if(usb_uart->cfg.software_de_re != 0) {
//TODO: FL-3276 port to new USART API
if(usb_uart->cfg.uart_ch == FuriHalUartIdUSART1) {
while(!LL_USART_IsActiveFlag_TC(USART1))
;
} else if(usb_uart->cfg.uart_ch == FuriHalUartIdLPUART1) {
while(!LL_LPUART_IsActiveFlag_TC(LPUART1))
;
}
furi_hal_gpio_write(USB_USART_DE_RE_PIN, true);
}
}
}
}
+1
View File
@@ -11,6 +11,7 @@ typedef struct {
uint8_t flow_pins;
uint8_t baudrate_mode;
uint32_t baudrate;
uint8_t software_de_re;
} UsbUartConfig;
typedef struct {
+10 -10
View File
@@ -1,6 +1,6 @@
#include "mf_user_dict.h"
#include <nfc/helpers/nfc_dict.h>
#include <toolbox/keys_dict.h>
#include <nfc/protocols/mf_classic/mf_classic.h>
#include <furi/furi.h>
@@ -15,22 +15,22 @@ struct MfUserDict {
MfUserDict* mf_user_dict_alloc(size_t max_keys_to_load) {
MfUserDict* instance = malloc(sizeof(MfUserDict));
NfcDict* dict = nfc_dict_alloc(
NFC_APP_MF_CLASSIC_DICT_USER_PATH, NfcDictModeOpenAlways, sizeof(MfClassicKey));
KeysDict* dict = keys_dict_alloc(
NFC_APP_MF_CLASSIC_DICT_USER_PATH, KeysDictModeOpenAlways, sizeof(MfClassicKey));
furi_assert(dict);
size_t dict_keys_num = nfc_dict_get_total_keys(dict);
size_t dict_keys_num = keys_dict_get_total_keys(dict);
instance->keys_num = MIN(max_keys_to_load, dict_keys_num);
if(instance->keys_num > 0) {
instance->keys_arr = malloc(instance->keys_num * sizeof(MfClassicKey));
for(size_t i = 0; i < instance->keys_num; i++) {
bool key_loaded =
nfc_dict_get_next_key(dict, instance->keys_arr[i].data, sizeof(MfClassicKey));
keys_dict_get_next_key(dict, instance->keys_arr[i].data, sizeof(MfClassicKey));
furi_assert(key_loaded);
}
}
nfc_dict_free(dict);
keys_dict_free(dict);
return instance;
}
@@ -67,13 +67,13 @@ bool mf_user_dict_delete_key(MfUserDict* instance, uint32_t index) {
furi_assert(index < instance->keys_num);
furi_assert(instance->keys_arr);
NfcDict* dict = nfc_dict_alloc(
NFC_APP_MF_CLASSIC_DICT_USER_PATH, NfcDictModeOpenAlways, sizeof(MfClassicKey));
KeysDict* dict = keys_dict_alloc(
NFC_APP_MF_CLASSIC_DICT_USER_PATH, KeysDictModeOpenAlways, sizeof(MfClassicKey));
furi_assert(dict);
bool key_delete_success =
nfc_dict_delete_key(dict, instance->keys_arr[index].data, sizeof(MfClassicKey));
nfc_dict_free(dict);
keys_dict_delete_key(dict, instance->keys_arr[index].data, sizeof(MfClassicKey));
keys_dict_free(dict);
if(key_delete_success) {
instance->keys_num--;
+1 -1
View File
@@ -343,7 +343,7 @@ bool nfc_load_file(NfcApp* instance, FuriString* path, bool show_dialog) {
nfc_supported_cards_load_cache(instance->nfc_supported_cards);
FuriString* load_path = furi_string_alloc();
if(nfc_has_shadow_file_internal(instance, path)) {
if(nfc_has_shadow_file_internal(instance, path)) { //-V1051
nfc_set_shadow_file_path(path, load_path);
} else if(furi_string_end_with(path, NFC_APP_SHADOW_EXTENSION)) {
size_t path_len = furi_string_size(path);
+2 -2
View File
@@ -52,7 +52,7 @@
#include <nfc/nfc_device.h>
#include <nfc/helpers/nfc_data_generator.h>
#include <nfc/helpers/nfc_dict.h>
#include <toolbox/keys_dict.h>
#include <gui/modules/validators.h>
#include <toolbox/path.h>
@@ -80,7 +80,7 @@ typedef enum {
} NfcRpcState;
typedef struct {
NfcDict* dict;
KeysDict* dict;
uint8_t sectors_total;
uint8_t sectors_read;
uint8_t current_sector;
@@ -41,7 +41,8 @@ NfcCommand nfc_dict_attack_worker_callback(NfcGenericEvent event, void* context)
instance->view_dispatcher, NfcCustomEventDictAttackDataUpdate);
} else if(mfc_event->type == MfClassicPollerEventTypeRequestKey) {
MfClassicKey key = {};
if(nfc_dict_get_next_key(instance->nfc_dict_context.dict, key.data, sizeof(MfClassicKey))) {
if(keys_dict_get_next_key(
instance->nfc_dict_context.dict, key.data, sizeof(MfClassicKey))) {
mfc_event->data->key_request_data.key = key;
mfc_event->data->key_request_data.key_provided = true;
instance->nfc_dict_context.dict_keys_current++;
@@ -60,7 +61,7 @@ NfcCommand nfc_dict_attack_worker_callback(NfcGenericEvent event, void* context)
view_dispatcher_send_custom_event(
instance->view_dispatcher, NfcCustomEventDictAttackDataUpdate);
} else if(mfc_event->type == MfClassicPollerEventTypeNextSector) {
nfc_dict_rewind(instance->nfc_dict_context.dict);
keys_dict_rewind(instance->nfc_dict_context.dict);
instance->nfc_dict_context.dict_keys_current = 0;
instance->nfc_dict_context.current_sector =
mfc_event->data->next_sector_data.current_sector;
@@ -79,7 +80,7 @@ NfcCommand nfc_dict_attack_worker_callback(NfcGenericEvent event, void* context)
view_dispatcher_send_custom_event(
instance->view_dispatcher, NfcCustomEventDictAttackDataUpdate);
} else if(mfc_event->type == MfClassicPollerEventTypeKeyAttackStop) {
nfc_dict_rewind(instance->nfc_dict_context.dict);
keys_dict_rewind(instance->nfc_dict_context.dict);
instance->nfc_dict_context.is_key_attack = false;
instance->nfc_dict_context.dict_keys_current = 0;
view_dispatcher_send_custom_event(
@@ -124,15 +125,15 @@ static void nfc_scene_mf_classic_dict_attack_prepare_view(NfcApp* instance) {
scene_manager_get_scene_state(instance->scene_manager, NfcSceneMfClassicDictAttack);
if(state == DictAttackStateUserDictInProgress) {
do {
if(!nfc_dict_check_presence(NFC_APP_MF_CLASSIC_DICT_USER_PATH)) {
if(!keys_dict_check_presence(NFC_APP_MF_CLASSIC_DICT_USER_PATH)) {
state = DictAttackStateSystemDictInProgress;
break;
}
instance->nfc_dict_context.dict = nfc_dict_alloc(
NFC_APP_MF_CLASSIC_DICT_USER_PATH, NfcDictModeOpenAlways, sizeof(MfClassicKey));
if(nfc_dict_get_total_keys(instance->nfc_dict_context.dict) == 0) {
nfc_dict_free(instance->nfc_dict_context.dict);
instance->nfc_dict_context.dict = keys_dict_alloc(
NFC_APP_MF_CLASSIC_DICT_USER_PATH, KeysDictModeOpenAlways, sizeof(MfClassicKey));
if(keys_dict_get_total_keys(instance->nfc_dict_context.dict) == 0) {
keys_dict_free(instance->nfc_dict_context.dict);
state = DictAttackStateSystemDictInProgress;
break;
}
@@ -141,13 +142,13 @@ static void nfc_scene_mf_classic_dict_attack_prepare_view(NfcApp* instance) {
} while(false);
}
if(state == DictAttackStateSystemDictInProgress) {
instance->nfc_dict_context.dict = nfc_dict_alloc(
NFC_APP_MF_CLASSIC_DICT_SYSTEM_PATH, NfcDictModeOpenExisting, sizeof(MfClassicKey));
instance->nfc_dict_context.dict = keys_dict_alloc(
NFC_APP_MF_CLASSIC_DICT_SYSTEM_PATH, KeysDictModeOpenExisting, sizeof(MfClassicKey));
dict_attack_set_header(instance->dict_attack, "MF Classic System Dictionary");
}
instance->nfc_dict_context.dict_keys_total =
nfc_dict_get_total_keys(instance->nfc_dict_context.dict);
keys_dict_get_total_keys(instance->nfc_dict_context.dict);
dict_attack_set_total_dict_keys(
instance->dict_attack, instance->nfc_dict_context.dict_keys_total);
instance->nfc_dict_context.dict_keys_current = 0;
@@ -185,7 +186,7 @@ bool nfc_scene_mf_classic_dict_attack_on_event(void* context, SceneManagerEvent
if(state == DictAttackStateUserDictInProgress) {
nfc_poller_stop(instance->poller);
nfc_poller_free(instance->poller);
nfc_dict_free(instance->nfc_dict_context.dict);
keys_dict_free(instance->nfc_dict_context.dict);
scene_manager_set_scene_state(
instance->scene_manager,
NfcSceneMfClassicDictAttack,
@@ -215,7 +216,7 @@ bool nfc_scene_mf_classic_dict_attack_on_event(void* context, SceneManagerEvent
if(instance->nfc_dict_context.is_card_present) {
nfc_poller_stop(instance->poller);
nfc_poller_free(instance->poller);
nfc_dict_free(instance->nfc_dict_context.dict);
keys_dict_free(instance->nfc_dict_context.dict);
scene_manager_set_scene_state(
instance->scene_manager,
NfcSceneMfClassicDictAttack,
@@ -253,7 +254,7 @@ void nfc_scene_mf_classic_dict_attack_on_exit(void* context) {
scene_manager_set_scene_state(
instance->scene_manager, NfcSceneMfClassicDictAttack, DictAttackStateUserDictInProgress);
nfc_dict_free(instance->nfc_dict_context.dict);
keys_dict_free(instance->nfc_dict_context.dict);
instance->nfc_dict_context.current_sector = 0;
instance->nfc_dict_context.sectors_total = 0;
@@ -14,20 +14,20 @@ void nfc_scene_mf_classic_keys_on_enter(void* context) {
// Load flipper dict keys total
uint32_t flipper_dict_keys_total = 0;
NfcDict* dict = nfc_dict_alloc(
NFC_APP_MF_CLASSIC_DICT_SYSTEM_PATH, NfcDictModeOpenExisting, sizeof(MfClassicKey));
KeysDict* dict = keys_dict_alloc(
NFC_APP_MF_CLASSIC_DICT_SYSTEM_PATH, KeysDictModeOpenExisting, sizeof(MfClassicKey));
if(dict) {
flipper_dict_keys_total = nfc_dict_get_total_keys(dict);
nfc_dict_free(dict);
flipper_dict_keys_total = keys_dict_get_total_keys(dict);
keys_dict_free(dict);
}
// Load user dict keys total
uint32_t user_dict_keys_total = 0;
dict = nfc_dict_alloc(
NFC_APP_MF_CLASSIC_DICT_USER_PATH, NfcDictModeOpenAlways, sizeof(MfClassicKey));
dict = keys_dict_alloc(
NFC_APP_MF_CLASSIC_DICT_USER_PATH, KeysDictModeOpenAlways, sizeof(MfClassicKey));
if(dict) {
user_dict_keys_total = nfc_dict_get_total_keys(dict);
nfc_dict_free(dict);
user_dict_keys_total = keys_dict_get_total_keys(dict);
keys_dict_free(dict);
}
FuriString* temp_str = furi_string_alloc();
@@ -29,23 +29,23 @@ bool nfc_scene_mf_classic_keys_add_on_event(void* context, SceneManagerEvent eve
if(event.type == SceneManagerEventTypeCustom) {
if(event.event == NfcCustomEventByteInputDone) {
// Add key to dict
NfcDict* dict = nfc_dict_alloc(
NFC_APP_MF_CLASSIC_DICT_USER_PATH, NfcDictModeOpenAlways, sizeof(MfClassicKey));
KeysDict* dict = keys_dict_alloc(
NFC_APP_MF_CLASSIC_DICT_USER_PATH, KeysDictModeOpenAlways, sizeof(MfClassicKey));
furi_assert(dict);
MfClassicKey key = {};
memcpy(key.data, instance->byte_input_store, sizeof(MfClassicKey));
if(nfc_dict_is_key_present(dict, key.data, sizeof(MfClassicKey))) {
if(keys_dict_is_key_present(dict, key.data, sizeof(MfClassicKey))) {
scene_manager_next_scene(
instance->scene_manager, NfcSceneMfClassicKeysWarnDuplicate);
} else if(nfc_dict_add_key(dict, key.data, sizeof(MfClassicKey))) {
} else if(keys_dict_add_key(dict, key.data, sizeof(MfClassicKey))) {
scene_manager_next_scene(instance->scene_manager, NfcSceneSaveSuccess);
dolphin_deed(DolphinDeedNfcMfcAdd);
} else {
scene_manager_previous_scene(instance->scene_manager);
}
nfc_dict_free(dict);
keys_dict_free(dict);
consumed = true;
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

-32
View File
@@ -1,32 +0,0 @@
Filetype: Flipper Animation
Version: 1
Width: 128
Height: 64
Passive frames: 9
Active frames: 7
Frames order: 0 1 2 1 3 1 2 3 1 4 5 6 5 6 5 4
Active cycles: 1
Frame rate: 2
Duration: 3600
Active cooldown: 7
Bubble slots: 2
Slot: 0
X: 78
Y: 16
Text: F*&K!!!
AlignH: Left
AlignV: Bottom
StartFrame: 2
EndFrame: 4
Slot: 1
X: 78
Y: 16
Text: What ya\nlookin at?!
AlignH: Left
AlignV: Center
StartFrame: 10
EndFrame: 15
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

-41
View File
@@ -1,41 +0,0 @@
Filetype: Flipper Animation
Version: 1
Width: 128
Height: 64
Passive frames: 8
Active frames: 4
Frames order: 0 1 2 3 4 2 3 4 5 6 7 6
Active cycles: 2
Frame rate: 2
Duration: 3600
Active cooldown: 7
Bubble slots: 2
Slot: 0
X: 22
Y: 40
Text: I miss you
AlignH: Right
AlignV: Bottom
StartFrame: 9
EndFrame: 11
Slot: 0
X: 17
Y: 40
Text: my friend...
AlignH: Right
AlignV: Bottom
StartFrame: 12
EndFrame: 15
Slot: 1
X: 2
Y: 29
Text: Why are you\nalways away?
AlignH: Right
AlignV: Bottom
StartFrame: 9
EndFrame: 15
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

-14
View File
@@ -1,14 +0,0 @@
Filetype: Flipper Animation
Version: 1
Width: 128
Height: 64
Passive frames: 8
Active frames: 11
Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
Active cycles: 1
Frame rate: 2
Duration: 3600
Active cooldown: 7
Bubble slots: 0
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 828 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 817 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Some files were not shown because too many files have changed in this diff Show More