├── .gitignore ├── .gitmodules ├── LICENSE ├── README.md ├── apps ├── readme.md └── screenshots │ └── flipper-plane.png ├── attiny85 ├── Blink │ ├── Blink.avr │ ├── Blink.ino │ ├── Blink_eeprom.hex │ ├── Blink_flash.hex │ └── attiny_blink_detect.js ├── Max7219 │ ├── Max7219.ino │ ├── Max7219count.avr │ ├── Max7219count_eeprom.hex │ ├── Max7219count_flash.hex │ ├── Max7219temp.avr │ ├── Max7219temp_eeprom.hex │ └── Max7219temp_flash.hex └── README.md ├── badusb ├── basic-commands.txt ├── ddj-400.txt ├── demo-backspace-del.txt ├── sub-raw-to-csv.txt ├── sysrq.txt └── testing-badusb-commands.txt ├── electronics └── README.md ├── firmware └── updating │ └── README.md ├── gpio ├── dac │ ├── app.c │ ├── application.fam │ └── dac.png ├── feberis_pro │ ├── feberis_pro_led.bin │ ├── feberis_pro_led.ino │ ├── feberis_pro_mirror_gps.bin │ └── feberis_pro_mirror_gps.ino ├── gpio_7segment │ ├── README.md │ ├── application.fam │ ├── gpio_7segment.png │ └── gpio_7segment_app.c ├── gpio_badge │ ├── .flipcorg │ │ ├── README.md │ │ ├── banner.png │ │ └── gallery │ │ │ └── main.png │ ├── README.md │ ├── application.fam │ ├── gpio_badge.c │ └── gpio_badge.png ├── gpio_blink │ ├── README.md │ ├── application.fam │ ├── blink.c │ └── blink.png ├── gpio_blink_pwm │ ├── README.md │ ├── application.fam │ ├── blink_pwm.c │ └── blink_pwm.png ├── gpio_interrupt_demo │ ├── README.md │ ├── application.fam │ ├── gpio_interrupt_demo.png │ └── gpio_interrupt_demo_app.c ├── gpio_polling_demo │ ├── README.md │ ├── application.fam │ ├── gpio_polling_demo.png │ └── gpio_polling_demo_app.c ├── hc_sr04 │ ├── README.md │ ├── application.fam │ ├── dist_sensor10px.png │ └── hc_sr04.c ├── i2c_demo │ ├── README.md │ ├── application.fam │ ├── i2c_demo.png │ └── i2c_demo_app.c ├── ir_blaster │ ├── README.md │ ├── cfw-ir-blaster.patch │ └── ir-blaster.patch ├── memsic_2125 │ ├── README.md │ ├── application.fam │ ├── memsic_2125.png │ ├── memsic_2125_app.c │ └── memsic_2125_chip.jpg ├── pins │ ├── L1_White_5Volts.txt │ ├── L2_Orange_MOSI_COPI_PA7.txt │ ├── L3_Indigo_MISO_COPI_PA6.txt │ ├── L4_Green_CS_CSN_PA4.txt │ ├── L5_Brown_SCK_RTS_PB3.txt │ ├── L6_Blue_CS(CE)_PB2.txt │ ├── L7_Brown_PC3.txt │ ├── L8_Black_GND.txt │ ├── R1(9)_Red_3v3_3.3v_VCC.txt │ ├── R2(10)_Brown_NC_SWC_PA14.txt │ ├── R3(11)_GND.txt │ ├── R4(12)_Grey_NC_SWDIO.txt │ ├── R5(13)_Orange_TX_LPTIM1.EXT.txt │ ├── R6(14)_Indigo_RX.txt │ ├── R7(15)_Yellow_LPTX_SDA_ADC1.2_PC1.txt │ ├── R8(16)_Brown_LPRX_SCL_ADC1.1_PC0.txt │ ├── R9(17)_Yellow_1W.txt │ ├── README.md │ └── R_10(18)_Black_GND.txt ├── shtc3 │ ├── README.md │ ├── application.fam │ ├── i2c_read_shtc3.png │ └── i2c_read_shtc3_app.c ├── spi_demo │ ├── Hello-World.sal │ ├── README.md │ ├── app.c │ ├── app.png │ ├── application.fam │ ├── spi.c │ └── spi_v2.c ├── uart_demo │ ├── README.md │ ├── application.fam │ ├── ring_buffer.c │ ├── ring_buffer.h │ ├── uart_demo.c │ ├── uart_demo_10px.png │ ├── uart_helper-old.txt │ ├── uart_helper.c │ └── uart_helper.h ├── wiegand │ ├── README.md │ ├── application.fam │ ├── examples │ │ └── C1.wgn │ ├── scenes │ │ ├── wiegand_data.c │ │ ├── wiegand_instructions.c │ │ ├── wiegand_load.c │ │ ├── wiegand_main_menu.c │ │ ├── wiegand_play.c │ │ ├── wiegand_read.c │ │ ├── wiegand_save.c │ │ └── wiegand_scan.c │ ├── wiegand.c │ ├── wiegand.h │ └── wiegand.png └── ws2812b_tester │ ├── .flipcorg │ ├── README.md │ ├── banner.png │ └── gallery │ │ ├── 01-main-menu.png │ │ ├── 02-led-pattern.png │ │ ├── 03-5v-pin.png │ │ ├── 04-about-1.png │ │ ├── 05-about-2.png │ │ └── 06-about-3.png │ ├── README.md │ ├── app.c │ ├── app.png │ ├── application.fam │ ├── led_driver.c │ └── led_driver.h ├── hid ├── hid_app │ ├── README.md │ └── final_files │ │ ├── assets │ │ ├── Cookie_def_11x9.png │ │ └── Cookie_pressed_17x17.png │ │ ├── hid.c │ │ ├── hid.h │ │ ├── views.h │ │ └── views │ │ ├── hid_cc.c │ │ └── hid_cc.h └── hid_cookie │ ├── .flipcorg │ ├── banner.png │ └── gallery │ │ ├── bt-clicking.png │ │ ├── configure.png │ │ ├── credits.png │ │ ├── instructions-2.png │ │ ├── instructions-3.png │ │ └── main-menu.png │ ├── application.fam │ ├── assets │ ├── Arr_dwn_7x9.png │ ├── Arr_up_7x9.png │ ├── Ble_connected_15x15.png │ ├── Ble_disconnected_15x15.png │ ├── Circles_47x47.png │ ├── Cookie_def_11x9.png │ ├── Cookie_pressed_17x17.png │ ├── Pin_back_arrow_10x8.png │ └── Pressed_Button_13x13.png │ ├── hid.c │ ├── hid.h │ ├── hid_cookie_ble_10px.png │ ├── readme.md │ ├── views.h │ └── views │ ├── hid_cc.c │ └── hid_cc.h ├── js-old ├── adc │ ├── ai-sensor.js │ └── sensor.js ├── ai │ ├── intro.txt │ ├── readme.md │ ├── train.js │ ├── train2.js │ └── train3.js ├── badusb │ ├── README.md │ └── badusbdemo.js ├── dac │ └── dac.js ├── flipboard │ ├── fal │ │ ├── mntm-001 │ │ │ ├── js_dialog.fal │ │ │ ├── js_gpio.fal │ │ │ ├── js_infrared.fal │ │ │ ├── js_rgbleds.fal │ │ │ ├── js_speaker.fal │ │ │ ├── js_textbox.fal │ │ │ └── js_widget.fal │ │ ├── mntm-dev-2024-04-19-a2fc553 │ │ │ ├── js_infrared.fal │ │ │ ├── js_rgbleds.fal │ │ │ └── js_speaker.fal │ │ ├── roguemaster-2024-04-20-4849538b │ │ │ ├── js_infrared.fal │ │ │ ├── js_rgbleds.fal │ │ │ └── js_speaker.fal │ │ ├── unleashed-dev-2024-04-20-f4ffd29b │ │ │ ├── js_infrared.fal │ │ │ ├── js_rgbleds.fal │ │ │ └── js_speaker.fal │ │ └── xtreme-dev-2024-04-20-aaa801b9 │ │ │ ├── js_infrared.fal │ │ │ ├── js_rgbleds.fal │ │ │ └── js_speaker.fal │ ├── modules │ │ ├── js_infrared.c │ │ ├── js_rgbleds │ │ │ ├── js_rgbleds.c │ │ │ ├── led_driver.c │ │ │ ├── led_driver.h │ │ │ ├── led_driver_i.h │ │ │ ├── rgbleds.c │ │ │ └── rgbleds.h │ │ └── js_speaker.c │ ├── png │ │ ├── down.png │ │ ├── flipboard.png │ │ ├── flippy.png │ │ └── up.png │ ├── readme.md │ ├── scripts │ │ ├── a_runner.js │ │ ├── badusb_textbox_fb.js │ │ ├── badusb_widget_fb.js │ │ ├── color_api.js │ │ ├── down.fxbm │ │ ├── fb_button_api.js │ │ ├── fb_leds_api.js │ │ ├── flippy.fxbm │ │ ├── infrared_fb.js │ │ ├── loader_api.js │ │ ├── subghz_fb.js │ │ └── up.fxbm │ └── sub │ │ ├── Light_off.sub │ │ └── Light_on.sub ├── intro │ ├── README.md │ ├── a_js_intro.js │ ├── widget-js.fxbm │ └── widget.js ├── readme.md ├── sk9822_leds │ └── sk9822_leds.js ├── spi_bitbang │ └── max7219.js ├── tones │ ├── README.md │ ├── speaker.js │ └── speaker_api.js └── vgm_sensor │ ├── README.md │ ├── a_demo.js │ ├── application.fam │ ├── js_vgm │ ├── FILES.txt │ ├── ICM42688P │ │ ├── ICM42688P.c │ │ ├── ICM42688P.h │ │ └── ICM42688P_regs.h │ ├── imu.c │ ├── imu.h │ └── js_vgm.c │ ├── prebuilt │ ├── momentum_dev.fal │ ├── momentum_release.fal │ ├── official_dev.fal │ ├── official_release.fal │ └── tone_rotate_native.js │ ├── speaker_api.js │ └── tone_rotate.js ├── js ├── adc │ └── sensor.js ├── ai │ ├── momentum-firmware │ │ ├── Important-AI-info.txt │ │ ├── badusb_demo.js │ │ ├── blebeacon.js │ │ ├── disk.js │ │ ├── event_loop.js │ │ ├── gui.js │ │ ├── i2c-spi.js │ │ ├── interactive.js │ │ ├── subghz.js │ │ └── train1.js │ ├── official-firmware │ │ ├── Important-AI-info.txt │ │ ├── badusb_demo.js │ │ ├── event_loop.js │ │ ├── gui.js │ │ ├── interactive.js │ │ └── train1.js │ ├── readme.md │ ├── roguemaster-firmware │ │ ├── Important-AI-info.txt │ │ ├── badusbdemo.js │ │ ├── subghz.js │ │ ├── train.js │ │ ├── train2.js │ │ └── train3.js │ └── unleashed-firmware │ │ ├── Important-AI-info.txt │ │ ├── badusb_demo.js │ │ ├── event_loop.js │ │ ├── gui.js │ │ ├── interactive.js │ │ └── train1.js ├── badusb │ ├── README.md │ ├── badusbdemo.js │ └── mount.js ├── dac │ └── dac.js ├── flipboard │ ├── fal │ │ ├── mntm-001 │ │ │ ├── js_dialog.fal │ │ │ ├── js_gpio.fal │ │ │ ├── js_infrared.fal │ │ │ ├── js_rgbleds.fal │ │ │ ├── js_speaker.fal │ │ │ ├── js_textbox.fal │ │ │ └── js_widget.fal │ │ ├── mntm-dev-2024-04-19-a2fc553 │ │ │ ├── js_infrared.fal │ │ │ ├── js_rgbleds.fal │ │ │ └── js_speaker.fal │ │ ├── roguemaster-2024-04-20-4849538b │ │ │ ├── js_infrared.fal │ │ │ ├── js_rgbleds.fal │ │ │ └── js_speaker.fal │ │ ├── unleashed-dev-2024-04-20-f4ffd29b │ │ │ ├── js_infrared.fal │ │ │ ├── js_rgbleds.fal │ │ │ └── js_speaker.fal │ │ └── xtreme-dev-2024-04-20-aaa801b9 │ │ │ ├── js_infrared.fal │ │ │ ├── js_rgbleds.fal │ │ │ └── js_speaker.fal │ ├── modules │ │ ├── js_infrared.c │ │ ├── js_rgbleds │ │ │ ├── js_rgbleds.c │ │ │ ├── led_driver.c │ │ │ ├── led_driver.h │ │ │ ├── led_driver_i.h │ │ │ ├── rgbleds.c │ │ │ └── rgbleds.h │ │ └── js_speaker.c │ ├── png │ │ ├── down.png │ │ ├── flipboard.png │ │ ├── flippy.png │ │ └── up.png │ ├── readme.md │ ├── scripts │ │ ├── a_runner.js │ │ ├── badusb_textbox_fb.js │ │ ├── badusb_widget_fb.js │ │ ├── color_api.js │ │ ├── down.fxbm │ │ ├── fb_button_api.js │ │ ├── fb_leds_api.js │ │ ├── flippy.fxbm │ │ ├── infrared_fb.js │ │ ├── loader_api.js │ │ ├── subghz_fb.js │ │ └── up.fxbm │ └── sub │ │ ├── Light_off.sub │ │ └── Light_on.sub ├── intro │ ├── README.md │ ├── a_js_intro.js │ ├── widget-js.fxbm │ └── widget.js ├── sk9822_leds │ └── sk9822_leds.js ├── spi_bitbang │ └── max7219.js ├── storage │ └── backup.js ├── tones │ ├── README.md │ ├── speaker.js │ └── speaker_api.js └── vgm_sensor │ ├── README.md │ ├── a_demo.js │ ├── js_vgm │ ├── FILES.txt │ ├── ICM42688P │ │ ├── ICM42688P.c │ │ ├── ICM42688P.h │ │ └── ICM42688P_regs.h │ ├── imu.c │ ├── imu.h │ └── js_vgm.c │ ├── speaker_api.js │ └── tone_rotate.js ├── marauder ├── README.md ├── firmware │ └── README.md └── secret_ssid │ ├── README.md │ ├── encode.ps1 │ └── scan.ps1 ├── misc └── WIP_thread_demo │ ├── README.md │ ├── application.fam │ ├── demo.png │ └── wip_thread_demo.c ├── plugins ├── basic │ ├── README.md │ ├── application.fam │ ├── basic_view_port_demo.png │ └── basic_view_port_demo_app.c ├── basic_scenes │ └── README.md ├── knob_component │ ├── README.md │ ├── application.fam │ ├── knob_demo.png │ └── knob_demo_app.c ├── minimal_viewport │ ├── README.md │ ├── application.fam │ ├── minimal_viewport.png │ └── minimal_viewport_app.c └── scenes │ ├── README.md │ ├── application.fam │ ├── scenes_demo.png │ └── scenes_demo_app.c ├── rfid ├── Keri.xlsx ├── README.md ├── fsk-geo │ ├── protocol_demo_fsk_geo.c │ ├── protocol_demo_fsk_geo.h │ └── readme.md ├── instafob │ ├── protocol_insta_fob.c │ └── protocol_insta_fob.h ├── lf-rfid.xlsx ├── lfrfid-demo │ ├── README.md │ ├── app.c │ ├── app.png │ ├── application.fam │ ├── lfrfid_reader.c │ └── lfrfid_reader.h └── t5577 │ ├── protocol_demo1.c │ └── protocol_demo1.h ├── subghz ├── README.md ├── apps │ ├── genie-recorder │ │ ├── .flipcorg │ │ │ └── gallery │ │ │ │ ├── 01-about.png │ │ │ │ ├── 02-learn-done.png │ │ │ │ ├── 03-send-some-codes.png │ │ │ │ ├── 04-main-menu.png │ │ │ │ ├── 05-config.png │ │ │ │ ├── 06-config-genie-file.png │ │ │ │ ├── 07-learn-codes.png │ │ │ │ ├── 08-send-new.png │ │ │ │ ├── 09-send-complete.png │ │ │ │ ├── CHANGELOG.md │ │ │ │ └── README.md │ │ ├── 007F1991.gne │ │ ├── README.md │ │ ├── application.fam │ │ ├── assets │ │ │ └── genie_10x10.png │ │ ├── genie.c │ │ ├── genie.png │ │ ├── genie_about.h │ │ ├── genie_app.c │ │ ├── genie_app.h │ │ ├── genie_config.c │ │ ├── genie_config.h │ │ ├── genie_file.c │ │ ├── genie_file.h │ │ ├── genie_ini.c │ │ ├── genie_ini.h │ │ ├── genie_learn.c │ │ ├── genie_learn.h │ │ ├── genie_send.c │ │ ├── genie_send.h │ │ ├── genie_subghz_receive.c │ │ ├── genie_subghz_receive.h │ │ ├── genie_submenu.c │ │ ├── genie_submenu.h │ │ ├── protocols │ │ │ ├── generic.c │ │ │ ├── generic.h │ │ │ ├── genie.c │ │ │ ├── genie.h │ │ │ ├── keeloq_common.c │ │ │ └── keeloq_common.h │ │ ├── wiring-2.jpg │ │ └── wiring.png │ ├── princeton-send │ │ ├── README.md │ │ ├── application.fam │ │ ├── princeton_send.c │ │ └── princeton_send.png │ ├── rolling-flaws │ │ ├── .flipcorg │ │ │ ├── README.md │ │ │ ├── banner.png │ │ │ └── gallery │ │ │ │ ├── 00-about.png │ │ │ │ ├── 01-opened.png │ │ │ │ ├── 02-closed_PAST.png │ │ │ │ ├── 03-mainmenu-1.png │ │ │ │ ├── 04-mainmenu-2.png │ │ │ │ ├── 05-config-1.png │ │ │ │ ├── 06-config-2.png │ │ │ │ ├── 07-config-3.png │ │ │ │ ├── 08-sync-remote.png │ │ │ │ └── 09-about-2.png │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── application.fam │ │ ├── assets │ │ │ ├── Lock_10x8.png │ │ │ └── Unlock_10x8.png │ │ ├── docs │ │ │ ├── clone-fz-remote.png │ │ │ ├── enc00-attack.png │ │ │ ├── keeloq-codes.png │ │ │ ├── kgb-attack.png │ │ │ ├── pair-fz-remote.png │ │ │ ├── replay-attack-diagram.png │ │ │ ├── replay-attack-failed-diagram.png │ │ │ ├── rollback-attack.png │ │ │ ├── rolljam-attack.png │ │ │ ├── test-attack.png │ │ │ ├── unknown-mf-attack.png │ │ │ ├── window-future-attack.png │ │ │ └── window-next-attack.png │ │ ├── rolling_flaws.c │ │ ├── rolling_flaws.png │ │ ├── rolling_flaws_about.h │ │ ├── rolling_flaws_keeloq.c │ │ ├── rolling_flaws_keeloq.h │ │ ├── rolling_flaws_send_keeloq.c │ │ ├── rolling_flaws_send_keeloq.h │ │ ├── rolling_flaws_settings.c │ │ ├── rolling_flaws_settings.h │ │ ├── rolling_flaws_structs.h │ │ ├── rolling_flaws_subghz_receive.c │ │ ├── rolling_flaws_subghz_receive.h │ │ ├── rolling_flaws_utils.c │ │ ├── rolling_flaws_utils.h │ │ └── sub │ │ │ ├── k-dh-enc00-cnt3DC9.sub │ │ │ ├── k-dh-enc00-cnt3DCA.sub │ │ │ ├── k-dh-enc00-cntA247.sub │ │ │ ├── k-dh-enc00-cntA248.sub │ │ │ ├── k-dh-enc00-cntFD75.sub │ │ │ ├── k-dh-enc00-cntFD76.sub │ │ │ ├── k-dh-sn0000000.sub │ │ │ ├── k-dh-sn01EA8D8-cnt0004.sub │ │ │ ├── k-dh-sn84EE9D5-cnt0004.sub │ │ │ ├── k-dh-sn84EE9D5-cnt000B.sub │ │ │ ├── k-dh-sn84EE9D5-cnt0042.sub │ │ │ ├── k-dh-sn84EE9D5-cnt0043.sub │ │ │ ├── k-dh-sn84EE9D5-cnt3E90.sub │ │ │ ├── k-dh-sn84EE9D5-cntEC01.sub │ │ │ ├── k-dh-sn84EE9D5-cntEC02.sub │ │ │ ├── k-dh-sn84EE9D5-cntEC03.sub │ │ │ ├── k-dh-sn84EE9D5-cntXXXX.sub │ │ │ ├── k-kgb-sn84E9D5-cntEC0D.sub │ │ │ └── k-unknown-sn84EE9D5-hop6A2C4803.sub │ └── signal_send_demo │ │ ├── README.md │ │ ├── app.c │ │ ├── app.png │ │ ├── application.fam │ │ ├── assets │ │ └── glyph_1_7x9.png │ │ ├── nice_flo.c │ │ ├── nice_flo.h │ │ ├── nice_flo.sub │ │ ├── princeton.c │ │ ├── princeton.h │ │ ├── princeton.sub │ │ └── tag.h ├── fmf_to_sub │ ├── README.md │ ├── app.c │ ├── application.fam │ ├── assets │ │ └── fmf_10x10.png │ ├── fmf.png │ ├── gallery │ │ ├── 00-main-menu.png │ │ ├── 01-about1.png │ │ ├── 02-about2.png │ │ ├── 03-configure.png │ │ ├── 04-convert.png │ │ ├── 05-file.png │ │ ├── CHANGELOG.md │ │ └── README.md │ ├── rick.fmf │ └── rick.txt ├── plugins │ ├── README.md │ ├── rock_paper_scissors │ │ ├── .flipcorg │ │ │ ├── README.md │ │ │ ├── banner.png │ │ │ └── gallery │ │ │ │ ├── game-over.png │ │ │ │ ├── host-game.png │ │ │ │ ├── join-game.png │ │ │ │ ├── lost.png │ │ │ │ ├── main-menu.png │ │ │ │ ├── past-games.png │ │ │ │ ├── playing-game.png │ │ │ │ ├── share-github.png │ │ │ │ ├── share.png │ │ │ │ └── win.png │ │ ├── LICENSE │ │ ├── README.md │ │ ├── application.fam │ │ ├── images │ │ │ ├── BLE_Pairing_128x64.png │ │ │ ├── DolphinCommon_56x48.png │ │ │ ├── DolphinNice_96x59.png │ │ │ ├── DolphinReadingSuccess_59x63.png │ │ │ ├── Local_Count.png │ │ │ ├── Local_Looking.png │ │ │ ├── Local_Paper.png │ │ │ ├── Local_Ready.png │ │ │ ├── Local_Rock.png │ │ │ ├── Local_Scissors.png │ │ │ ├── Remote_Count.png │ │ │ ├── Remote_Paper.png │ │ │ ├── Remote_Ready.png │ │ │ ├── Remote_Rock.png │ │ │ ├── Remote_Scissors.png │ │ │ └── WarningDolphin_45x42.png │ │ ├── prebuilt │ │ │ ├── v1.0 │ │ │ │ └── official-firmware │ │ │ │ │ ├── rc-0.80.0 │ │ │ │ │ └── Rock_Paper_Scissors.fap │ │ │ │ │ ├── release-0.79.1 │ │ │ │ │ └── Rock_Paper_Scissors.fap │ │ │ │ │ └── release-0.80.1 │ │ │ │ │ └── Rock_Paper_Scissors.fap │ │ │ └── win.png │ │ ├── rock_paper_scissors.c │ │ ├── rock_paper_scissors.h │ │ └── rock_paper_scissors.png │ └── subghz_demo │ │ ├── README.md │ │ ├── application.fam │ │ ├── subghz_demo.png │ │ └── subghz_demo_app.c ├── protocols │ ├── README.md │ └── x10 │ │ ├── README.md │ │ ├── protocol_items.c │ │ ├── protocol_items.h │ │ ├── x10-codes.png │ │ ├── x10-details.png │ │ ├── x10.c │ │ └── x10.h ├── rolling │ └── lm │ │ ├── Security1.0 and 2.0.png │ │ └── notes.txt ├── samples │ ├── README.md │ ├── chevy-hhr-2006 │ │ ├── 1_car_lock.sub │ │ ├── 2_car_unlock.sub │ │ ├── 3_car_lock.sub │ │ ├── 4_car_lock.sub │ │ ├── 5_car_unlock.sub │ │ ├── 6_car_lock.sub │ │ ├── 7_car_unlock.sub │ │ ├── 8_car_lock.sub │ │ ├── 9_car_lock.sub │ │ └── README.md │ ├── genie-girud-1t │ │ ├── G0001.sub │ │ ├── G0002.sub │ │ ├── README.md │ │ ├── create-v2.py │ │ ├── genie-0001.sub │ │ ├── genie-0002.sub │ │ ├── genie-0003.sub │ │ ├── genie-0004.sub │ │ ├── genie-0010.sub │ │ ├── genie-0013.sub │ │ ├── genie-0014.sub │ │ ├── genie-001f.sub │ │ ├── genie-0020.sub │ │ ├── genie-0200.sub │ │ ├── genie-0200_0201.sub │ │ ├── genie-0201.sub │ │ ├── genie-4200.sub │ │ ├── genie-4200_4201.sub │ │ ├── genie-4201.sub │ │ ├── genie-8200.sub │ │ ├── genie-8200_8201.sub │ │ ├── genie-8201.sub │ │ ├── genie-c200.sub │ │ ├── genie-c200_c201.sub │ │ ├── genie-c201.sub │ │ ├── genie.py │ │ └── keys-genie.txt │ ├── modulation │ │ ├── 433am.sub │ │ ├── 433fm-wide.sub │ │ ├── 433fm.sub │ │ ├── 433gfsk-wide.sub │ │ ├── 433gfsk.sub │ │ └── README.md │ ├── quantum-fire │ │ ├── Princeton_a1.sub │ │ ├── RAW_a1.sub │ │ ├── RAW_a2.sub │ │ ├── RAW_a3.sub │ │ ├── RAW_a4.sub │ │ ├── RAW_a5.sub │ │ ├── RAW_a6.sub │ │ ├── RAW_b7.sub │ │ └── README.md │ └── x10 │ │ ├── README.md │ │ ├── a-1-off.sub │ │ ├── a-1-on.sub │ │ ├── a-10-off.sub │ │ ├── a-10-on.sub │ │ ├── a-11-off.sub │ │ ├── a-11-on.sub │ │ ├── a-12-off.sub │ │ ├── a-12-on.sub │ │ ├── a-13-off.sub │ │ ├── a-13-on.sub │ │ ├── a-14-off.sub │ │ ├── a-14-on.sub │ │ ├── a-15-off.sub │ │ ├── a-15-on.sub │ │ ├── a-16-off.sub │ │ ├── a-16-on.sub │ │ ├── a-2-off.sub │ │ ├── a-2-on.sub │ │ ├── a-3-off.sub │ │ ├── a-3-on.sub │ │ ├── a-4-off.sub │ │ ├── a-4-on.sub │ │ ├── a-5-off.sub │ │ ├── a-5-on.sub │ │ ├── a-6-off.sub │ │ ├── a-6-on.sub │ │ ├── a-7-off.sub │ │ ├── a-7-on.sub │ │ ├── a-8-off.sub │ │ ├── a-8-on.sub │ │ ├── a-9-off.sub │ │ ├── a-9-on.sub │ │ ├── a-bright.sub │ │ ├── a-dim.sub │ │ ├── b-1-off.sub │ │ ├── b-1-on.sub │ │ ├── b-10-off.sub │ │ ├── b-10-on.sub │ │ ├── b-11-off.sub │ │ ├── b-11-on.sub │ │ ├── b-12-off.sub │ │ ├── b-12-on.sub │ │ ├── b-13-off.sub │ │ ├── b-13-on.sub │ │ ├── b-14-off.sub │ │ ├── b-14-on.sub │ │ ├── b-15-off.sub │ │ ├── b-15-on.sub │ │ ├── b-16-off.sub │ │ ├── b-16-on.sub │ │ ├── b-2-off.sub │ │ ├── b-2-on.sub │ │ ├── b-3-off.sub │ │ ├── b-3-on.sub │ │ ├── b-4-off.sub │ │ ├── b-4-on.sub │ │ ├── b-5-off.sub │ │ ├── b-5-on.sub │ │ ├── b-6-off.sub │ │ ├── b-6-on.sub │ │ ├── b-7-off.sub │ │ ├── b-7-on.sub │ │ ├── b-8-off.sub │ │ ├── b-8-on.sub │ │ ├── b-9-off.sub │ │ ├── b-9-on.sub │ │ ├── b-bright.sub │ │ ├── b-dim.sub │ │ ├── c-1-off.sub │ │ ├── c-1-on.sub │ │ ├── c-10-off.sub │ │ ├── c-10-on.sub │ │ ├── c-11-off.sub │ │ ├── c-11-on.sub │ │ ├── c-12-off.sub │ │ ├── c-12-on.sub │ │ ├── c-13-off.sub │ │ ├── c-13-on.sub │ │ ├── c-14-off.sub │ │ ├── c-14-on.sub │ │ ├── c-15-off.sub │ │ ├── c-15-on.sub │ │ ├── c-16-off.sub │ │ ├── c-16-on.sub │ │ ├── c-2-off.sub │ │ ├── c-2-on.sub │ │ ├── c-3-off.sub │ │ ├── c-3-on.sub │ │ ├── c-4-off.sub │ │ ├── c-4-on.sub │ │ ├── c-5-off.sub │ │ ├── c-5-on.sub │ │ ├── c-6-off.sub │ │ ├── c-6-on.sub │ │ ├── c-7-off.sub │ │ ├── c-7-on.sub │ │ ├── c-8-off.sub │ │ ├── c-8-on.sub │ │ ├── c-9-off.sub │ │ ├── c-9-on.sub │ │ ├── c-bright.sub │ │ ├── c-dim.sub │ │ ├── d-1-off.sub │ │ ├── d-1-on.sub │ │ ├── d-10-off.sub │ │ ├── d-10-on.sub │ │ ├── d-11-off.sub │ │ ├── d-11-on.sub │ │ ├── d-12-off.sub │ │ ├── d-12-on.sub │ │ ├── d-13-off.sub │ │ ├── d-13-on.sub │ │ ├── d-14-off.sub │ │ ├── d-14-on.sub │ │ ├── d-15-off.sub │ │ ├── d-15-on.sub │ │ ├── d-16-off.sub │ │ ├── d-16-on.sub │ │ ├── d-2-off.sub │ │ ├── d-2-on.sub │ │ ├── d-3-off.sub │ │ ├── d-3-on.sub │ │ ├── d-4-off.sub │ │ ├── d-4-on.sub │ │ ├── d-5-off.sub │ │ ├── d-5-on.sub │ │ ├── d-6-off.sub │ │ ├── d-6-on.sub │ │ ├── d-7-off.sub │ │ ├── d-7-on.sub │ │ ├── d-8-off.sub │ │ ├── d-8-on.sub │ │ ├── d-9-off.sub │ │ ├── d-9-on.sub │ │ ├── d-bright.sub │ │ ├── d-dim.sub │ │ ├── e-1-off.sub │ │ ├── e-1-on.sub │ │ ├── e-10-off.sub │ │ ├── e-10-on.sub │ │ ├── e-11-off.sub │ │ ├── e-11-on.sub │ │ ├── e-12-off.sub │ │ ├── e-12-on.sub │ │ ├── e-13-off.sub │ │ ├── e-13-on.sub │ │ ├── e-14-off.sub │ │ ├── e-14-on.sub │ │ ├── e-15-off.sub │ │ ├── e-15-on.sub │ │ ├── e-16-off.sub │ │ ├── e-16-on.sub │ │ ├── e-2-off.sub │ │ ├── e-2-on.sub │ │ ├── e-3-off.sub │ │ ├── e-3-on.sub │ │ ├── e-4-off.sub │ │ ├── e-4-on.sub │ │ ├── e-5-off.sub │ │ ├── e-5-on.sub │ │ ├── e-6-off.sub │ │ ├── e-6-on.sub │ │ ├── e-7-off.sub │ │ ├── e-7-on.sub │ │ ├── e-8-off.sub │ │ ├── e-8-on.sub │ │ ├── e-9-off.sub │ │ ├── e-9-on.sub │ │ ├── e-bright.sub │ │ ├── e-dim.sub │ │ ├── f-1-off.sub │ │ ├── f-1-on.sub │ │ ├── f-10-off.sub │ │ ├── f-10-on.sub │ │ ├── f-11-off.sub │ │ ├── f-11-on.sub │ │ ├── f-12-off.sub │ │ ├── f-12-on.sub │ │ ├── f-13-off.sub │ │ ├── f-13-on.sub │ │ ├── f-14-off.sub │ │ ├── f-14-on.sub │ │ ├── f-15-off.sub │ │ ├── f-15-on.sub │ │ ├── f-16-off.sub │ │ ├── f-16-on.sub │ │ ├── f-2-off.sub │ │ ├── f-2-on.sub │ │ ├── f-3-off.sub │ │ ├── f-3-on.sub │ │ ├── f-4-off.sub │ │ ├── f-4-on.sub │ │ ├── f-5-off.sub │ │ ├── f-5-on.sub │ │ ├── f-6-off.sub │ │ ├── f-6-on.sub │ │ ├── f-7-off.sub │ │ ├── f-7-on.sub │ │ ├── f-8-off.sub │ │ ├── f-8-on.sub │ │ ├── f-9-off.sub │ │ ├── f-9-on.sub │ │ ├── f-bright.sub │ │ ├── f-dim.sub │ │ ├── g-1-off.sub │ │ ├── g-1-on.sub │ │ ├── g-10-off.sub │ │ ├── g-10-on.sub │ │ ├── g-11-off.sub │ │ ├── g-11-on.sub │ │ ├── g-12-off.sub │ │ ├── g-12-on.sub │ │ ├── g-13-off.sub │ │ ├── g-13-on.sub │ │ ├── g-14-off.sub │ │ ├── g-14-on.sub │ │ ├── g-15-off.sub │ │ ├── g-15-on.sub │ │ ├── g-16-off.sub │ │ ├── g-16-on.sub │ │ ├── g-2-off.sub │ │ ├── g-2-on.sub │ │ ├── g-3-off.sub │ │ ├── g-3-on.sub │ │ ├── g-4-off.sub │ │ ├── g-4-on.sub │ │ ├── g-5-off.sub │ │ ├── g-5-on.sub │ │ ├── g-6-off.sub │ │ ├── g-6-on.sub │ │ ├── g-7-off.sub │ │ ├── g-7-on.sub │ │ ├── g-8-off.sub │ │ ├── g-8-on.sub │ │ ├── g-9-off.sub │ │ ├── g-9-on.sub │ │ ├── g-bright.sub │ │ ├── g-dim.sub │ │ ├── h-1-off.sub │ │ ├── h-1-on.sub │ │ ├── h-10-off.sub │ │ ├── h-10-on.sub │ │ ├── h-11-off.sub │ │ ├── h-11-on.sub │ │ ├── h-12-off.sub │ │ ├── h-12-on.sub │ │ ├── h-13-off.sub │ │ ├── h-13-on.sub │ │ ├── h-14-off.sub │ │ ├── h-14-on.sub │ │ ├── h-15-off.sub │ │ ├── h-15-on.sub │ │ ├── h-16-off.sub │ │ ├── h-16-on.sub │ │ ├── h-2-off.sub │ │ ├── h-2-on.sub │ │ ├── h-3-off.sub │ │ ├── h-3-on.sub │ │ ├── h-4-off.sub │ │ ├── h-4-on.sub │ │ ├── h-5-off.sub │ │ ├── h-5-on.sub │ │ ├── h-6-off.sub │ │ ├── h-6-on.sub │ │ ├── h-7-off.sub │ │ ├── h-7-on.sub │ │ ├── h-8-off.sub │ │ ├── h-8-on.sub │ │ ├── h-9-off.sub │ │ ├── h-9-on.sub │ │ ├── h-bright.sub │ │ ├── h-dim.sub │ │ ├── i-1-off.sub │ │ ├── i-1-on.sub │ │ ├── i-10-off.sub │ │ ├── i-10-on.sub │ │ ├── i-11-off.sub │ │ ├── i-11-on.sub │ │ ├── i-12-off.sub │ │ ├── i-12-on.sub │ │ ├── i-13-off.sub │ │ ├── i-13-on.sub │ │ ├── i-14-off.sub │ │ ├── i-14-on.sub │ │ ├── i-15-off.sub │ │ ├── i-15-on.sub │ │ ├── i-16-off.sub │ │ ├── i-16-on.sub │ │ ├── i-2-off.sub │ │ ├── i-2-on.sub │ │ ├── i-3-off.sub │ │ ├── i-3-on.sub │ │ ├── i-4-off.sub │ │ ├── i-4-on.sub │ │ ├── i-5-off.sub │ │ ├── i-5-on.sub │ │ ├── i-6-off.sub │ │ ├── i-6-on.sub │ │ ├── i-7-off.sub │ │ ├── i-7-on.sub │ │ ├── i-8-off.sub │ │ ├── i-8-on.sub │ │ ├── i-9-off.sub │ │ ├── i-9-on.sub │ │ ├── i-bright.sub │ │ ├── i-dim.sub │ │ ├── j-1-off.sub │ │ ├── j-1-on.sub │ │ ├── j-10-off.sub │ │ ├── j-10-on.sub │ │ ├── j-11-off.sub │ │ ├── j-11-on.sub │ │ ├── j-12-off.sub │ │ ├── j-12-on.sub │ │ ├── j-13-off.sub │ │ ├── j-13-on.sub │ │ ├── j-14-off.sub │ │ ├── j-14-on.sub │ │ ├── j-15-off.sub │ │ ├── j-15-on.sub │ │ ├── j-16-off.sub │ │ ├── j-16-on.sub │ │ ├── j-2-off.sub │ │ ├── j-2-on.sub │ │ ├── j-3-off.sub │ │ ├── j-3-on.sub │ │ ├── j-4-off.sub │ │ ├── j-4-on.sub │ │ ├── j-5-off.sub │ │ ├── j-5-on.sub │ │ ├── j-6-off.sub │ │ ├── j-6-on.sub │ │ ├── j-7-off.sub │ │ ├── j-7-on.sub │ │ ├── j-8-off.sub │ │ ├── j-8-on.sub │ │ ├── j-9-off.sub │ │ ├── j-9-on.sub │ │ ├── j-bright.sub │ │ ├── j-dim.sub │ │ ├── k-1-off.sub │ │ ├── k-1-on.sub │ │ ├── k-10-off.sub │ │ ├── k-10-on.sub │ │ ├── k-11-off.sub │ │ ├── k-11-on.sub │ │ ├── k-12-off.sub │ │ ├── k-12-on.sub │ │ ├── k-13-off.sub │ │ ├── k-13-on.sub │ │ ├── k-14-off.sub │ │ ├── k-14-on.sub │ │ ├── k-15-off.sub │ │ ├── k-15-on.sub │ │ ├── k-16-off.sub │ │ ├── k-16-on.sub │ │ ├── k-2-off.sub │ │ ├── k-2-on.sub │ │ ├── k-3-off.sub │ │ ├── k-3-on.sub │ │ ├── k-4-off.sub │ │ ├── k-4-on.sub │ │ ├── k-5-off.sub │ │ ├── k-5-on.sub │ │ ├── k-6-off.sub │ │ ├── k-6-on.sub │ │ ├── k-7-off.sub │ │ ├── k-7-on.sub │ │ ├── k-8-off.sub │ │ ├── k-8-on.sub │ │ ├── k-9-off.sub │ │ ├── k-9-on.sub │ │ ├── k-bright.sub │ │ ├── k-dim.sub │ │ ├── l-1-off.sub │ │ ├── l-1-on.sub │ │ ├── l-10-off.sub │ │ ├── l-10-on.sub │ │ ├── l-11-off.sub │ │ ├── l-11-on.sub │ │ ├── l-12-off.sub │ │ ├── l-12-on.sub │ │ ├── l-13-off.sub │ │ ├── l-13-on.sub │ │ ├── l-14-off.sub │ │ ├── l-14-on.sub │ │ ├── l-15-off.sub │ │ ├── l-15-on.sub │ │ ├── l-16-off.sub │ │ ├── l-16-on.sub │ │ ├── l-2-off.sub │ │ ├── l-2-on.sub │ │ ├── l-3-off.sub │ │ ├── l-3-on.sub │ │ ├── l-4-off.sub │ │ ├── l-4-on.sub │ │ ├── l-5-off.sub │ │ ├── l-5-on.sub │ │ ├── l-6-off.sub │ │ ├── l-6-on.sub │ │ ├── l-7-off.sub │ │ ├── l-7-on.sub │ │ ├── l-8-off.sub │ │ ├── l-8-on.sub │ │ ├── l-9-off.sub │ │ ├── l-9-on.sub │ │ ├── l-bright.sub │ │ ├── l-dim.sub │ │ ├── m-1-off.sub │ │ ├── m-1-on.sub │ │ ├── m-10-off.sub │ │ ├── m-10-on.sub │ │ ├── m-11-off.sub │ │ ├── m-11-on.sub │ │ ├── m-12-off.sub │ │ ├── m-12-on.sub │ │ ├── m-13-off.sub │ │ ├── m-13-on.sub │ │ ├── m-14-off.sub │ │ ├── m-14-on.sub │ │ ├── m-15-off.sub │ │ ├── m-15-on.sub │ │ ├── m-16-off.sub │ │ ├── m-16-on.sub │ │ ├── m-2-off.sub │ │ ├── m-2-on.sub │ │ ├── m-3-off.sub │ │ ├── m-3-on.sub │ │ ├── m-4-off.sub │ │ ├── m-4-on.sub │ │ ├── m-5-off.sub │ │ ├── m-5-on.sub │ │ ├── m-6-off.sub │ │ ├── m-6-on.sub │ │ ├── m-7-off.sub │ │ ├── m-7-on.sub │ │ ├── m-8-off.sub │ │ ├── m-8-on.sub │ │ ├── m-9-off.sub │ │ ├── m-9-on.sub │ │ ├── m-bright.sub │ │ ├── m-dim.sub │ │ ├── n-1-off.sub │ │ ├── n-1-on.sub │ │ ├── n-10-off.sub │ │ ├── n-10-on.sub │ │ ├── n-11-off.sub │ │ ├── n-11-on.sub │ │ ├── n-12-off.sub │ │ ├── n-12-on.sub │ │ ├── n-13-off.sub │ │ ├── n-13-on.sub │ │ ├── n-14-off.sub │ │ ├── n-14-on.sub │ │ ├── n-15-off.sub │ │ ├── n-15-on.sub │ │ ├── n-16-off.sub │ │ ├── n-16-on.sub │ │ ├── n-2-off.sub │ │ ├── n-2-on.sub │ │ ├── n-3-off.sub │ │ ├── n-3-on.sub │ │ ├── n-4-off.sub │ │ ├── n-4-on.sub │ │ ├── n-5-off.sub │ │ ├── n-5-on.sub │ │ ├── n-6-off.sub │ │ ├── n-6-on.sub │ │ ├── n-7-off.sub │ │ ├── n-7-on.sub │ │ ├── n-8-off.sub │ │ ├── n-8-on.sub │ │ ├── n-9-off.sub │ │ ├── n-9-on.sub │ │ ├── n-bright.sub │ │ ├── n-dim.sub │ │ ├── o-1-off.sub │ │ ├── o-1-on.sub │ │ ├── o-10-off.sub │ │ ├── o-10-on.sub │ │ ├── o-11-off.sub │ │ ├── o-11-on.sub │ │ ├── o-12-off.sub │ │ ├── o-12-on.sub │ │ ├── o-13-off.sub │ │ ├── o-13-on.sub │ │ ├── o-14-off.sub │ │ ├── o-14-on.sub │ │ ├── o-15-off.sub │ │ ├── o-15-on.sub │ │ ├── o-16-off.sub │ │ ├── o-16-on.sub │ │ ├── o-2-off.sub │ │ ├── o-2-on.sub │ │ ├── o-3-off.sub │ │ ├── o-3-on.sub │ │ ├── o-4-off.sub │ │ ├── o-4-on.sub │ │ ├── o-5-off.sub │ │ ├── o-5-on.sub │ │ ├── o-6-off.sub │ │ ├── o-6-on.sub │ │ ├── o-7-off.sub │ │ ├── o-7-on.sub │ │ ├── o-8-off.sub │ │ ├── o-8-on.sub │ │ ├── o-9-off.sub │ │ ├── o-9-on.sub │ │ ├── o-bright.sub │ │ ├── o-dim.sub │ │ ├── p-1-off.sub │ │ ├── p-1-on.sub │ │ ├── p-10-off.sub │ │ ├── p-10-on.sub │ │ ├── p-11-off.sub │ │ ├── p-11-on.sub │ │ ├── p-12-off.sub │ │ ├── p-12-on.sub │ │ ├── p-13-off.sub │ │ ├── p-13-on.sub │ │ ├── p-14-off.sub │ │ ├── p-14-on.sub │ │ ├── p-15-off.sub │ │ ├── p-15-on.sub │ │ ├── p-16-off.sub │ │ ├── p-16-on.sub │ │ ├── p-2-off.sub │ │ ├── p-2-on.sub │ │ ├── p-3-off.sub │ │ ├── p-3-on.sub │ │ ├── p-4-off.sub │ │ ├── p-4-on.sub │ │ ├── p-5-off.sub │ │ ├── p-5-on.sub │ │ ├── p-6-off.sub │ │ ├── p-6-on.sub │ │ ├── p-7-off.sub │ │ ├── p-7-on.sub │ │ ├── p-8-off.sub │ │ ├── p-8-on.sub │ │ ├── p-9-off.sub │ │ ├── p-9-on.sub │ │ ├── p-bright.sub │ │ ├── p-dim.sub │ │ ├── remote2_m-1-off.sub │ │ ├── remote2_m-1-on.sub │ │ ├── remote2_n-1-off.sub │ │ ├── remote2_n-1-on.sub │ │ ├── remote2_o-1-off.sub │ │ ├── remote2_o-1-on.sub │ │ ├── remote2_p-1-off.sub │ │ └── remote2_p-1-on.sub └── scripts │ └── SUB2CSV │ └── README.md ├── ui ├── basic_scenes │ ├── README.md │ ├── application.fam │ ├── basic_scenes.c │ ├── basic_scenes.png │ └── docs │ │ ├── app-diagram.jpg │ │ ├── app-greeting-input.png │ │ ├── app-greeting-message.png │ │ ├── app-hour-glass.png │ │ ├── app-installed.png │ │ ├── app-lotto.png │ │ ├── app-menu.png │ │ ├── create-app-icon.png │ │ └── create-directory.png ├── basic_scenes_split │ ├── README.md │ ├── application.fam │ ├── basic_scenes.png │ ├── basic_scenes_split.c │ ├── basic_scenes_split.h │ ├── basic_scenes_split_i.h │ ├── greeting_input.c │ ├── greeting_input.h │ ├── greeting_message.c │ ├── greeting_message.h │ ├── lottery.c │ ├── lottery.h │ ├── main_menu.c │ └── main_menu.h ├── lucky │ ├── README.md │ ├── application.fam │ ├── lucky.png │ ├── lucky_app.c │ ├── lucky_app.h │ ├── lucky_app_i.h │ ├── lucky_scene_greeting_input.c │ ├── lucky_scene_greeting_input.h │ ├── lucky_scene_greeting_message.c │ ├── lucky_scene_greeting_message.h │ ├── lucky_scene_lottery.c │ ├── lucky_scene_lottery.h │ ├── lucky_scene_main_menu.c │ └── lucky_scene_main_menu.h ├── lucky_bestpractices │ ├── README.md │ ├── application.fam │ ├── lucky.png │ ├── lucky_app.c │ ├── lucky_app.h │ ├── lucky_app_i.h │ └── scenes │ │ ├── lucky_scene.c │ │ ├── lucky_scene.h │ │ ├── lucky_scene_config.h │ │ ├── lucky_scene_greeting_input.c │ │ ├── lucky_scene_greeting_message.c │ │ ├── lucky_scene_lottery.c │ │ └── lucky_scene_main_menu.c ├── skeleton_app │ ├── README.md │ ├── app.c │ ├── app.png │ ├── application.fam │ └── assets │ │ └── glyph_1_14x40.png ├── viewdispatcher_demo │ ├── README.md │ ├── application.fam │ ├── demo.c │ └── icon.png └── viewport_demo │ ├── README.md │ ├── application.fam │ ├── demo.c │ ├── demo_minimal.c │ ├── demo_timer.c │ └── icon.png ├── vgm ├── air_level │ ├── .catalog │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ └── screenshots │ │ │ └── 1.png │ ├── README.md │ ├── application.fam │ ├── engine │ │ ├── LICENSE │ │ ├── README.md │ │ ├── canvas.c │ │ ├── canvas.h │ │ ├── clock_timer.c │ │ ├── clock_timer.h │ │ ├── engine.h │ │ ├── entity.c │ │ ├── entity.h │ │ ├── entity_i.h │ │ ├── game_engine.c │ │ ├── game_engine.h │ │ ├── game_manager.c │ │ ├── game_manager.h │ │ ├── game_manager_i.h │ │ ├── level.c │ │ ├── level.h │ │ ├── level_i.h │ │ ├── main.c │ │ ├── scripts │ │ │ └── sprite_builder.py │ │ ├── sensors │ │ │ ├── ICM42688P │ │ │ │ ├── ICM42688P.c │ │ │ │ ├── ICM42688P.h │ │ │ │ └── ICM42688P_regs.h │ │ │ ├── imu.c │ │ │ └── imu.h │ │ ├── sprite.c │ │ ├── sprite.h │ │ ├── vector.c │ │ └── vector.h │ ├── game.c │ ├── game.h │ ├── icon.png │ └── levels │ │ ├── level_imu.c │ │ └── level_imu.h ├── apps │ └── air_labyrinth │ │ ├── .catalog │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ └── screenshots │ │ │ └── 1.png │ │ ├── .gitignore │ │ ├── .gitmodules │ │ ├── LICENSE │ │ ├── README.md │ │ ├── application.fam │ │ ├── assets │ │ └── sprites │ │ │ └── player.fxbm │ │ ├── game.c │ │ ├── game.h │ │ ├── icon.png │ │ ├── sprites │ │ ├── .gitkeep │ │ └── player.png │ │ └── walls.h └── imu_controller │ ├── README.md │ ├── flipper-pitch-roll-yaw.png │ ├── imu_controller.c │ └── imu_controller.h └── youtube └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Prerequisites 2 | *.d 3 | 4 | # Object files 5 | *.o 6 | *.ko 7 | *.obj 8 | *.elf 9 | 10 | # Linker output 11 | *.ilk 12 | *.map 13 | *.exp 14 | 15 | # Precompiled Headers 16 | *.gch 17 | *.pch 18 | 19 | # Libraries 20 | *.lib 21 | *.a 22 | *.la 23 | *.lo 24 | 25 | # Shared objects (inc. Windows DLLs) 26 | *.dll 27 | *.so 28 | *.so.* 29 | *.dylib 30 | 31 | # Executables 32 | *.exe 33 | *.out 34 | *.app 35 | *.i*86 36 | *.x86_64 37 | # *.hex -- We want to provide dump files for the user to flash 38 | 39 | # Debug files 40 | *.dSYM/ 41 | *.su 42 | *.idb 43 | *.pdb 44 | 45 | # Kernel Module Compile Results 46 | *.mod* 47 | *.cmd 48 | .tmp_versions/ 49 | modules.order 50 | Module.symvers 51 | Mkfile.old 52 | dkms.conf 53 | 54 | .vscode/ -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "engine"] 2 | path = vgm/apps/air_labyrinth/engine 3 | url = https://github.com/flipperdevices/flipperzero-game-engine 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Derek Jamison 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /apps/screenshots/flipper-plane.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/apps/screenshots/flipper-plane.png -------------------------------------------------------------------------------- /attiny85/Blink/Blink.avr: -------------------------------------------------------------------------------- 1 | Filetype: Flipper Dump AVR 2 | Version: 1 3 | Chip name: ATtiny85 4 | Signature: 1E 93 0B 5 | Lfuse: 62 6 | Hfuse: DF 7 | Efuse: FF 8 | Lock: FF 9 | Dump_flash: Blink_flash.hex 10 | Dump_eeprom: Blink_eeprom.hex 11 | -------------------------------------------------------------------------------- /attiny85/Blink/attiny_blink_detect.js: -------------------------------------------------------------------------------- 1 | let gpio = require("gpio"); 2 | 3 | let pins = ["PA7", "PA6", "PA4", "PB3", "PC3"]; 4 | let pins_values = [false, false, false, false, false]; 5 | 6 | for (let i = 0; i < pins.length; i++) { 7 | gpio.init(pins[i], "input", "no"); 8 | pins_values[i] = gpio.read(pins[i]); 9 | } 10 | 11 | while (true) { 12 | for (let i = 0; i < pins.length; i++) { 13 | let value = gpio.read(pins[i]); 14 | if (value !== pins_values[i]) { 15 | print(pins[i] + " changed to " + (value ? "high" : "low")); 16 | pins_values[i] = value; 17 | } 18 | } 19 | delay(50); 20 | } -------------------------------------------------------------------------------- /attiny85/Max7219/Max7219count.avr: -------------------------------------------------------------------------------- 1 | Filetype: Flipper Dump AVR 2 | Version: 1 3 | Chip name: ATtiny85 4 | Signature: 1E 93 0B 5 | Lfuse: 62 6 | Hfuse: DF 7 | Efuse: FF 8 | Lock: FF 9 | Dump_flash: Max7219count_flash.hex 10 | Dump_eeprom: Max7219count_eeprom.hex 11 | -------------------------------------------------------------------------------- /attiny85/Max7219/Max7219temp.avr: -------------------------------------------------------------------------------- 1 | Filetype: Flipper Dump AVR 2 | Version: 1 3 | Chip name: ATtiny85 4 | Signature: 1E 93 0B 5 | Lfuse: 62 6 | Hfuse: DF 7 | Efuse: FF 8 | Lock: FF 9 | Dump_flash: Max7219temp_flash.hex 10 | Dump_eeprom: Max7219temp_eeprom.hex 11 | -------------------------------------------------------------------------------- /attiny85/README.md: -------------------------------------------------------------------------------- 1 | # attiny85 2 | 3 | ## Overview 4 | The Flipper Zero can be used as an ISP programmer for the ATtiny85 microcontroller. 5 | It can also be used to dump and flash the ATtiny85. 6 | 7 | You can install the Flipper Zero AVR Flasher from https://lab.flipper.net/apps/avr_isp 8 | 9 | ## Blink 10 | The blink program blinks each GPIO pin on the ATtiny85. 11 | This is a good way to confirm that the ATtiny85 is working correctly. 12 | See the blink.ino for directions on connecting to the Flipper Zero. 13 | There is also a "attiny_blink_detect.js" file that will output the blinking pin. 14 | 15 | ## Max7219 16 | The max7219 program will display the a value between 0 and 999 on a 7-segment display. 17 | The value is incremented automatically or be read from the ADC pin. 18 | `Max7219count` increments the number, while `Max7219temp` reads the ADC pin. 19 | 20 | You can copy the .hex and .avr files to `SD Card/apps_data/avr_isp` and load them from the Flipper Zero onto the ATtiny85. -------------------------------------------------------------------------------- /badusb/basic-commands.txt: -------------------------------------------------------------------------------- 1 | REM This is a comment (REMark) in your code. 2 | GUI r 3 | DELAY 1000 4 | STRING notepad 5 | ENTER 6 | STRINGLN Hello 7 | ALTSTRING World 8 | ENTER 9 | ALTCHAR 176 10 | ENTER 11 | STRING_DELAY 800 12 | STRINGLN TYPE THIS SLOW... 13 | STRINGLN AND THIS IS FAST AGAIN!!! 14 | DEFAULT_DELAY 1000 15 | STRINGLN EACH LINE 16 | STRINGLN HAS A ONE 17 | STRINGLN SECOND DELAY! 18 | DEFAULT_DELAY 0 19 | ENTER 20 | REPEAT 9 21 | STRINGLN WE PRESSED ENTER 10 TIMES. 22 | SHIFT UP 23 | LEFT 24 | SHIFT UP 25 | REPEAT 9 26 | DELETE 27 | DOWN 28 | HOLD A 29 | WAIT_FOR_BUTTON_PRESS 30 | RELEASE A 31 | GUI-SHIFT S 32 | WAIT_FOR_BUTTON_PRESS 33 | ESCAPE 34 | -------------------------------------------------------------------------------- /badusb/ddj-400.txt: -------------------------------------------------------------------------------- 1 | ID 0x2b73:0x0026 ddj-400:ddj-400 2 | REM # 3 | REM # Triggers DDJ-400 Rekordbox firmware update application on Windows. 4 | REM # (because of USB ID and NAME of device.) 5 | REM # 6 | GUI r 7 | DELAY 1000 8 | ESCAPE 9 | DELAY 60000 10 | DELAY 60000 11 | -------------------------------------------------------------------------------- /badusb/demo-backspace-del.txt: -------------------------------------------------------------------------------- 1 | REM 2 | REM ## ON WINDOWS, "DELETE" ACTS AS A BACKSPACE KEY. 3 | REM ## ON WINDOWS, "DELETE" should use HID_KEYBOARD_DELETE_FORWARD instead. 4 | REM 5 | REM ## ON WINDOWS, "BACKSPACE" DOESN'T WORK. 6 | REM ## ON WINDOWS, "BACKSPACE" should use HID_KEYBOARD_DELETE. 7 | REM 8 | REM ## THIS SCRIPT TESTS TO SEE IF YOU HAVE THE BUGFIX INSTALLED. 9 | REM ## 10 | REM ## WHEN DONE, YOUR COMPUTER SHOULD BE AT CTRL-ALT-DEL SCREEN. 11 | REM ## 12 | REM 13 | REM Open windows notepad 14 | DELAY 1000 15 | GUI r 16 | DELAY 500 17 | STRING notepad 18 | DELAY 500 19 | ENTER 20 | DELAY 750 21 | REM 22 | REM ## 23 | DELAY 300 24 | DEFAULT_DELAY 300 25 | STRING HELLO 1 2 3 26 | ENTER 27 | STRING WORLD 4 5 6 28 | ENTER 29 | STRING YESNO 7 8 9 30 | ENTER 31 | UP 32 | DELAY 1000 33 | CTRL-SHIFT RIGHT 34 | DELAY 1000 35 | RIGHT 36 | DELAY 1000 37 | LEFT 38 | DELAY 1000 39 | LEFT 40 | DELAY 1000 41 | BACKSPACE 42 | DELAY 1000 43 | DELETE 44 | DELAY 5000 45 | CTRL-ALT DELETE 46 | DELAY 1000 -------------------------------------------------------------------------------- /badusb/sysrq.txt: -------------------------------------------------------------------------------- 1 | REM BE CAREFUL RUNNING THIS SCRIPT! 2 | REM 3 | REM TESTING VARIOUS SYSRQ COMMANDS 4 | REM 5 | WAIT_FOR_BUTTON_PRESS 6 | SYSRQ b 7 | WAIT_FOR_BUTTON_PRESS 8 | SYSRQ c 9 | WAIT_FOR_BUTTON_PRESS 10 | SYSRQ i 11 | WAIT_FOR_BUTTON_PRESS 12 | SYSRQ o 13 | WAIT_FOR_BUTTON_PRESS 14 | GUI 15 | -------------------------------------------------------------------------------- /badusb/testing-badusb-commands.txt: -------------------------------------------------------------------------------- 1 | REM HELLO WORLD 2 | DELAY 1000 3 | WINDOWS r 4 | DELAY 1000 5 | STRINGLN notepad 6 | DELAY 1000 7 | STRING HELLO WORLD! 8 | ENTER 9 | ALTSTRING ABC 10 | ENTER 11 | ENTER 12 | STRING WORLD 13 | ENTER 14 | HOLD A 15 | WAIT_FOR_BUTTON_PRESS 16 | RELEASE A 17 | -------------------------------------------------------------------------------- /gpio/dac/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="analog_output", 3 | name="Analog Output", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="analog_output_app", 6 | stack_size=4 * 1024, 7 | requires=[ 8 | "gui", 9 | ], 10 | order=10, 11 | fap_icon="dac.png", 12 | fap_category="GPIO", 13 | fap_icon_assets="assets", 14 | fap_description="Analog output demo. Uses MCP4725 on I2C. Uses pin A7 PWM with 10uf cap+10K resistor. Input on pin C3", 15 | ) 16 | -------------------------------------------------------------------------------- /gpio/dac/dac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/gpio/dac/dac.png -------------------------------------------------------------------------------- /gpio/feberis_pro/feberis_pro_led.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/gpio/feberis_pro/feberis_pro_led.bin -------------------------------------------------------------------------------- /gpio/feberis_pro/feberis_pro_mirror_gps.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/gpio/feberis_pro/feberis_pro_mirror_gps.bin -------------------------------------------------------------------------------- /gpio/feberis_pro/feberis_pro_mirror_gps.ino: -------------------------------------------------------------------------------- 1 | #define GPS_TX 4 2 | #define GPS_RX 13 3 | 4 | void setup() { 5 | Serial.begin(9600); 6 | while (!Serial) { 7 | ; // Needed for "Serial" only? 8 | } 9 | Serial.println("SERIAL PORT ECHO"); 10 | Serial2.begin(9600, SERIAL_8N1, GPS_TX, GPS_RX); 11 | while (!Serial2) { 12 | ; // Does this do anything for Serial2? 13 | } 14 | Serial.print("SERIAL MIRROR. TX:"); 15 | Serial.print(GPS_TX, DEC); 16 | Serial.print(" RX:"); 17 | Serial.println(GPS_RX, DEC); 18 | } 19 | 20 | void loop() { 21 | while (Serial2.available()) { 22 | Serial.print(char(Serial2.read())); 23 | } 24 | delay(1); 25 | } 26 | -------------------------------------------------------------------------------- /gpio/gpio_7segment/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="gpio_7segment_output", 3 | name="GPIO 7-Segment Output", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="gpio_7segment_app", 6 | requires=["gui", "gpio"], 7 | stack_size=2 * 1024, 8 | fap_icon="gpio_7segment.png", 9 | fap_category="Gpio", 10 | ) 11 | -------------------------------------------------------------------------------- /gpio/gpio_7segment/gpio_7segment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/gpio/gpio_7segment/gpio_7segment.png -------------------------------------------------------------------------------- /gpio/gpio_badge/.flipcorg/README.md: -------------------------------------------------------------------------------- 1 | #gpio_badge 2 | 3 | This is an app for the [GPIO Diagnostics Card](https://tindie.com/stores/MakeItHackin) by MakeItHackin. 4 | 5 | ## Instructions 6 | 7 | - Left/Right buttons to change speed. Up/Down buttons to change effect. 8 | - When effect is Left/Right, you can use OK button to stop/start (try to get it to start near the middle RED led!) 9 | - Back button to exit. 10 | -------------------------------------------------------------------------------- /gpio/gpio_badge/.flipcorg/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/gpio/gpio_badge/.flipcorg/banner.png -------------------------------------------------------------------------------- /gpio/gpio_badge/.flipcorg/gallery/main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/gpio/gpio_badge/.flipcorg/gallery/main.png -------------------------------------------------------------------------------- /gpio/gpio_badge/README.md: -------------------------------------------------------------------------------- 1 | #gpio_badge 2 | 3 | This is an app for the [GPIO DIAGNOSTICS BOARD FOR FLIPPER ZERO](https://github.com/MakeItHackin/FlipperDiagnosticsBoard) by [MakeItHackin](https://github.com/MakeItHackin). 4 | 5 | ## Instructions 6 | 7 | - Left/Right buttons to change speed of the effect. 8 | - Up/Down buttons to change effect. 9 | - When effect is Left to right lights, you can use OK button to stop/start (try to get it to stop near the middle RED led!) 10 | - Back button to exit. 11 | 12 | ## Installing 13 | 14 | The easiest way to install is [flipc.org](https://flipc.org/jamisonderek/flipper-zero-tutorials?branch=main&root=gpio%2Fgpio_badge), choose your firmware, then click Install. The "GPIO Badge" is currently in the Misc category. 15 | 16 | ## Feature requests 17 | 18 | Got ideas that you think would be cool to add? Drop your ideas in Discord [Discord invite: NsjCvqwPAd](https://discord.com/invite/NsjCvqwPAd). 19 | 20 | Looking for videos on how to write your own C code for the Flipper Zero? Check out this [playlist](https://www.youtube.com/playlist?list=PLM1cyTMe-PYJCYA-yQ8OcC9jILsS004Tm) on GPIO. 21 | -------------------------------------------------------------------------------- /gpio/gpio_badge/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="gpio_badge", 3 | name="GPIO Badge", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="gpio_diag_lights_app", 6 | requires=["gui", "subghz"], 7 | stack_size=2 * 1024, 8 | fap_icon="gpio_badge.png", 9 | fap_category="Misc", 10 | ) 11 | -------------------------------------------------------------------------------- /gpio/gpio_badge/gpio_badge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/gpio/gpio_badge/gpio_badge.png -------------------------------------------------------------------------------- /gpio/gpio_blink/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="gpio_blink", 3 | name="GPIO Blink", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="gpio_blink_app", 6 | requires=["gui"], 7 | stack_size=2 * 1024, 8 | fap_icon="blink.png", 9 | fap_category="GPIO", 10 | ) 11 | -------------------------------------------------------------------------------- /gpio/gpio_blink/blink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/gpio/gpio_blink/blink.png -------------------------------------------------------------------------------- /gpio/gpio_blink_pwm/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="gpio_blink_pwm", 3 | name="GPIO Blink PWM", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="gpio_blink_pwm_app", 6 | requires=["gui"], 7 | stack_size=2 * 1024, 8 | fap_icon="blink_pwm.png", 9 | fap_category="GPIO", 10 | ) 11 | -------------------------------------------------------------------------------- /gpio/gpio_blink_pwm/blink_pwm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/gpio/gpio_blink_pwm/blink_pwm.png -------------------------------------------------------------------------------- /gpio/gpio_interrupt_demo/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="gpio_interrupt_demo", 3 | name="GPIO Interrupt Demo", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="gpio_interrupt_demo_app", 6 | requires=["gui", "gpio"], 7 | stack_size=2 * 1024, 8 | fap_icon="gpio_interrupt_demo.png", 9 | fap_category="Gpio", 10 | ) 11 | -------------------------------------------------------------------------------- /gpio/gpio_interrupt_demo/gpio_interrupt_demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/gpio/gpio_interrupt_demo/gpio_interrupt_demo.png -------------------------------------------------------------------------------- /gpio/gpio_polling_demo/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="gpio_polling_demo", 3 | name="Gpio Polling Demo", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="gpio_polling_demo_app", 6 | requires=["gui"], 7 | stack_size=2 * 1024, 8 | fap_icon="gpio_polling_demo.png", 9 | fap_category="Misc", 10 | ) 11 | -------------------------------------------------------------------------------- /gpio/gpio_polling_demo/gpio_polling_demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/gpio/gpio_polling_demo/gpio_polling_demo.png -------------------------------------------------------------------------------- /gpio/hc_sr04/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="hc_sr04_dist_sensor", 3 | name="[HC-SR] Dist. Sensor", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="hc_sr04_app", 6 | cdefines=["APP_HC_SR04"], 7 | requires=[ 8 | "gui", 9 | ], 10 | stack_size=2 * 1024, 11 | order=20, 12 | fap_icon="dist_sensor10px.png", 13 | fap_category="GPIO", 14 | ) -------------------------------------------------------------------------------- /gpio/hc_sr04/dist_sensor10px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/gpio/hc_sr04/dist_sensor10px.png -------------------------------------------------------------------------------- /gpio/i2c_demo/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="i2c_demo", 3 | name="I2C Demo", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="i2c_demo_app", 6 | requires=["gui"], 7 | stack_size=2 * 1024, 8 | fap_icon="i2c_demo.png", 9 | fap_category="GPIO", 10 | ) 11 | -------------------------------------------------------------------------------- /gpio/i2c_demo/i2c_demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/gpio/i2c_demo/i2c_demo.png -------------------------------------------------------------------------------- /gpio/memsic_2125/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="memsic_2125", 3 | name="[Mx2125] Accelerometer", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="memsic_2125_app", 6 | requires=["gui"], 7 | stack_size=2 * 1024, 8 | fap_icon="memsic_2125.png", 9 | fap_category="Gpio", 10 | ) 11 | -------------------------------------------------------------------------------- /gpio/memsic_2125/memsic_2125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/gpio/memsic_2125/memsic_2125.png -------------------------------------------------------------------------------- /gpio/memsic_2125/memsic_2125_chip.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/gpio/memsic_2125/memsic_2125_chip.jpg -------------------------------------------------------------------------------- /gpio/pins/L1_White_5Volts.txt: -------------------------------------------------------------------------------- 1 | Connected via USB cable it will have +5 volts OTHERWISE you must enable via GPIO/"5V on GPIO" and click "ON". 2 | Max of 1 watt (1-Amp). 3 | 4 | Look at device datasheet. If 5 volts, connect to "VIN", "VCC" or "+5V" (if NO VIN) on the device. 5 | If datasheet says 3.3 volts, do NOT use this pin! 6 | 7 | Devices: 8 | - HC-SR04 9 | - Joystick (via a 10K resistor) 10 | - Mx2125 (recommend 3v3 pin) 11 | -------------------------------------------------------------------------------- /gpio/pins/L2_Orange_MOSI_COPI_PA7.txt: -------------------------------------------------------------------------------- 1 | For SPI, the naming convetion is changing. You may see "MOSI", "MO", "SI", "COPI", "CO", "PI". This pin is Flipper data out "SDO" (which should connect to the device data in "SDI") pin. "I" refers to "Input" and "O" refers to "Output". "M/C" refers to "Main", "Master" (not used anymore), "Controller". "S/P" refers to "Subnode", "Slave" (not used anymore), "Perpherial". "SD" refers to "Serial Data". 2 | 3 | Generic GPIO uses PA7. 4 | 5 | Devices: 6 | - DHT11[GPIO] (Data) 7 | - BME280[SPI] (SDI) 8 | - BMP280[SPI] (SDI) 9 | - NRF24L01[SPI] (MO) 10 | - NRF24L01[SPI] (MOSI) 11 | - CC1101[SPI] (SI) 12 | -------------------------------------------------------------------------------- /gpio/pins/L3_Indigo_MISO_COPI_PA6.txt: -------------------------------------------------------------------------------- 1 | For SPI, the naming convetion is changing. You may see "MISO", "MI", "SO", "CIPO", "CI", "PO". This pin is Flipper data out "SDI" (which should connect to the device data in "SDO") pin. "I" refers to "Input" and "O" refers to "Output". "M/C" refers to "Main", "Master" (not used anymore), "Controller". "S/P" refers to "Subnode", "Slave" (not used anymore), "Perpherial". "SD" refers to "Serial Data". 2 | 3 | Generic GPIO uses PA6. 4 | 5 | Devices: 6 | - BME280[SPI] (SDO) 7 | - BMP280[SPI] (SDO) 8 | - NRF24L01[SPI] (MI) 9 | - NRF24L01[SPI] (MISO) 10 | - CC1101[SPI] (SO) 11 | -------------------------------------------------------------------------------- /gpio/pins/L4_Green_CS_CSN_PA4.txt: -------------------------------------------------------------------------------- 1 | For SPI, this is the Chip Select (which enables the data lines.) Typically LOW to enable -- "CSN" is "Chip Select Not". 2 | 3 | Generic GPIO uses PA4. 4 | 5 | CHECK: "LPTIM2.OUT/ADC1.9/COMP1 IN- COMP2 IN-" 6 | 7 | Devices: 8 | - BME280[SPI] (CS) 9 | - BMP280[SPI] (CS) 10 | - NRF24L01[SPI] (CSN) 11 | - NRF24L01[SPI] (CSN) 12 | - CC1101[SPI] (CSN) -------------------------------------------------------------------------------- /gpio/pins/L5_Brown_SCK_RTS_PB3.txt: -------------------------------------------------------------------------------- 1 | For SPI, this is the Serial Clock (which says when to read/write data.) Typically Mode 0 (Idle LOW, Sample Rising Edge, Shift Falling Edge.) 2 | 3 | Generic GPIO uses PB3. 4 | 5 | CHECK: "ADC1.9/COMP1 IN- COMP2 IN-/SWO" 6 | 7 | 8 | Devices: 9 | - BME280[SPI] (SCK) 10 | - BMP280[SPI] (SCK) 11 | - NRF24L01[SPI] (SCK) 12 | - NRF24L01[SPI] (SCK) 13 | - CC1101[SPI] (SCLK) -------------------------------------------------------------------------------- /gpio/pins/L6_Blue_CS(CE)_PB2.txt: -------------------------------------------------------------------------------- 1 | For SPI, libraries do not treat as CS (although it is shown in some diagrams.) This is just a GPIO pin, but it typically get connected to "CE" (for Chip Enable -- e.g. take chip out of standby.) It is typically logic LOW. On the CC1101 it is used for GDO0 (general purpose IRQ). 2 | 3 | Generic GPIO uses PB2. 4 | 5 | CHECK: "LPTIM1.OUT/COMP1 IN+" 6 | 7 | Devices: 8 | - NRF24L01[SPI] (CE) 9 | - NRF24L01[SPI] (CE) 10 | - CC1101[SPI] (GDO0) -------------------------------------------------------------------------------- /gpio/pins/L7_Brown_PC3.txt: -------------------------------------------------------------------------------- 1 | This is just a general purpose GPIO pin. 2 | 3 | Generic GPIO uses PC3. 4 | 5 | CHECK: "LPTIM1.ETR LPTIM2.ETR/ADC1.4" 6 | 7 | Devices: 8 | - None -------------------------------------------------------------------------------- /gpio/pins/L8_Black_GND.txt: -------------------------------------------------------------------------------- 1 | This is one of three ground pins on the Flipper Zero. You can use pins 8 (L8), 11 (R3), 18 (R10) interchangeably. 2 | 3 | Devices: 4 | - All -------------------------------------------------------------------------------- /gpio/pins/R1(9)_Red_3v3_3.3v_VCC.txt: -------------------------------------------------------------------------------- 1 | DANGER: Connect external modules with large capacitive load only when Flipper Zero is powered off. Otherwise, data on the microSD card can be corrupted. 2 | 3 | This pin is 3.3 Volts output. NOTE: Some people recommend using the 5V pin (L1) and a 3.3 volt regulator with output having a parallel 10uF and 100nF capacitor; so that voltage is more stable. 4 | 5 | Max of 1200 mA (3.96 watt). 6 | 7 | Look at device datasheet. If 3.3 volts, connect to "VIN", "VCC", "3.3V/3V3" (if NO VIN) on the device. 8 | 9 | Devices: 10 | - NMEA GPS[USART] (VIN) 11 | - DHT11[GPIO] (VCC) 12 | - BME280[I²C] (VCC) 13 | - BME280[SPI-MODE] (VCC) 14 | - BMP280[SPI] (VIN) 15 | - BH1750[I²C] (VCC) 16 | - NRF24L01[SPI] (VCC) 17 | - NRF24L01[SPI] (VCC) 18 | - CC1101[SPI] (VCC) 19 | 20 | -------------------------------------------------------------------------------- /gpio/pins/R2(10)_Brown_NC_SWC_PA14.txt: -------------------------------------------------------------------------------- 1 | This pin is used for general IO, timer & SWD only. 2 | 3 | CHECK: "LPTIM1.OUT/SWCLK" 4 | 5 | Devices: 6 | - None 7 | -------------------------------------------------------------------------------- /gpio/pins/R3(11)_GND.txt: -------------------------------------------------------------------------------- 1 | This is one of three ground pins on the Flipper Zero. You can use pins 8 (L8), 11 (R3), 18 (R10) interchangeably. 2 | 3 | Devices: 4 | - All -------------------------------------------------------------------------------- /gpio/pins/R4(12)_Grey_NC_SWDIO.txt: -------------------------------------------------------------------------------- 1 | This pin is used for back key (PA13) and SWD only. 2 | 3 | CHECK: "PA13/SWIO" 4 | 5 | Devices: 6 | - None 7 | -------------------------------------------------------------------------------- /gpio/pins/R5(13)_Orange_TX_LPTIM1.EXT.txt: -------------------------------------------------------------------------------- 1 | This pin is Flipper TX on USART (so connect to RX on device). 2 | 3 | The Signal Generator/Clock Generator app uses LPTIM1.EXT (pin 13) for the clock signal. 4 | 5 | Generic GPIO uses PB6. 6 | 7 | CHECK: "COMP2 IN+/MCO" 8 | 9 | Devices: 10 | - NMEA GPS[USART] (RX) 11 | - HC-SR04[GPIO] (Trig) 12 | -------------------------------------------------------------------------------- /gpio/pins/R6(14)_Indigo_RX.txt: -------------------------------------------------------------------------------- 1 | This pin is Flipper RX on USART (so connect to TX on device). 2 | 3 | Generic GPIO uses PB7. 4 | 5 | CHECK: "LPTIM1.IN2/COMP2 IN-" 6 | 7 | Devices: 8 | - NMEA GPS[USART] (TX) 9 | - HC-SR04[GPIO] (Echo) 10 | -------------------------------------------------------------------------------- /gpio/pins/R7(15)_Yellow_LPTX_SDA_ADC1.2_PC1.txt: -------------------------------------------------------------------------------- 1 | This pin is Flipper TX on LPUART [Low Power UART] (so connect to RX on device). 2 | 3 | For I2C devices this is SDA (Serial Data) pin. 4 | 5 | Generic GPIO uses PC1. 6 | 7 | CHECK: "LPTIM1.OUT/ADC1.2" 8 | 9 | Devices: 10 | - BME280[I2C] (SDA) 11 | - BH1750[I2C] (SDA) 12 | -------------------------------------------------------------------------------- /gpio/pins/R8(16)_Brown_LPRX_SCL_ADC1.1_PC0.txt: -------------------------------------------------------------------------------- 1 | This pin is Flipper RX on LPUART [Low Power UART] (so connect to TX on device). 2 | 3 | For I2C devices this is SCL (Serial Clock) pin. 4 | 5 | For ADC devices this is ADC1.1 pin (flipperscope application uses LL library to show values.) 6 | 7 | Generic GPIO uses PC0. 8 | 9 | CHECK: "LPTIM1.IN LPTIM2.IN" 10 | 11 | Devices: 12 | - BME280[I2C] (SCL) 13 | - BH1750[I2C] (SCL) 14 | -------------------------------------------------------------------------------- /gpio/pins/R9(17)_Yellow_1W.txt: -------------------------------------------------------------------------------- 1 | For 1-Wire (iButton) devices this is the wire. It has built-in 1K pull-up resistor to 5 volts. 2 | 3 | Generic GPIO uses PC0. 4 | 5 | CHECK: "PB14/TIM1.2N/I2C3.SDA-Pullup" 6 | 7 | Devices: 8 | - iButton[1Wire] (center of button) 9 | - DS18B20[1Wire] (yellow wire) -------------------------------------------------------------------------------- /gpio/pins/R_10(18)_Black_GND.txt: -------------------------------------------------------------------------------- 1 | This is one of three ground pins on the Flipper Zero. You can use pins 8 (L8), 11 (R3), 18 (R10) interchangeably. 2 | 3 | Devices: 4 | - All -------------------------------------------------------------------------------- /gpio/shtc3/README.md: -------------------------------------------------------------------------------- 1 | # SHTC3 2 | 3 | This is just a simple console application that uses i2c to communicate with an SHTC3 temperature and humidity device. It is assumed that you have debug mode turned on (Settings, System, Debug ON). To see the logs, either connect to serial port or use https://lab.flipper.net/cli and type ``log`` then enter. Once you are viewing the logs, run the application. 4 | 5 | The code does the following: 6 | - The address of the device is hard-coded to 0x70. 7 | - Wake-up (0x3517) is sent to wake up the device. 8 | - Read id (0xefc8) is sent to read the device ID. 9 | - The output is expected to match "(xxxx1xxxxx000111)". 10 | 11 | Resources: 12 | - [I2CDevices.org info](https://i2cdevices.org/devices/shtc3) 13 | - [SHTC3 Datasheet](https://www.waveshare.com/w/upload/3/33/SHTC3_Datasheet.pdf) -------------------------------------------------------------------------------- /gpio/shtc3/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="i2c_read_shtc3", 3 | name="I2C SHTC3 Demo", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="i2c_read_shtc3_app", 6 | requires=["gui"], 7 | stack_size=2 * 1024, 8 | fap_icon="i2c_read_shtc3.png", 9 | fap_category="GPIO", 10 | ) 11 | -------------------------------------------------------------------------------- /gpio/shtc3/i2c_read_shtc3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/gpio/shtc3/i2c_read_shtc3.png -------------------------------------------------------------------------------- /gpio/spi_demo/Hello-World.sal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/gpio/spi_demo/Hello-World.sal -------------------------------------------------------------------------------- /gpio/spi_demo/README.md: -------------------------------------------------------------------------------- 1 | # SPI_DEMO 2 | 3 | This is Not intended to be a full demo, but a simple example of how to use the SPI interface on the Flipper Zero. 4 | 5 | Please see [https://youtu.be/W6bGYZ5PgIc](https://youtu.be/W6bGYZ5PgIc) for a video demo. 6 | 7 | My video this Saturday, Nov 18th 2023, will cover how to wire the device between the Flipper Zero and the chip that supports SPI, such as the W25Q32. 8 | 9 | The connections are: 10 | - Flipper Pin 2 - MOSI (D0 on the W25Q32) 11 | - Flipper Pin 3 - MISO (D1 on the W25Q32) 12 | - Flipper Pin 4 - CS (CS on the W25Q32) 13 | - Flipper Pin 5 - SCK (SLK on the W25Q32) 14 | - Flipper Pin 8 - GND (GND on the W25Q32) 15 | - Flipper Pin 9 - 3V3 (VCC on the W25Q32) 16 | 17 | 18 | The `Hellow-World.sal` file can be viewed using [https://www.saleae.com/downloads/](https://www.saleae.com/downloads/) software. This is a capture of my W25Q32 chip being read by the Flipper Zero. The commands were sent using the `SPI Mem Manager` application. 19 | 20 | You can find the `SPI Mem Manager` application at [https://github.com/flipperdevices/flipperzero-good-faps/tree/dev/spi_mem_manager](https://github.com/flipperdevices/flipperzero-good-faps) -------------------------------------------------------------------------------- /gpio/spi_demo/app.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | void spi_demo(); 5 | void spi_demo_v2(); 6 | 7 | int32_t main_learn_spi(void* _p) { 8 | UNUSED(_p); 9 | spi_demo(); 10 | spi_demo_v2(); 11 | return 0; 12 | } -------------------------------------------------------------------------------- /gpio/spi_demo/app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/gpio/spi_demo/app.png -------------------------------------------------------------------------------- /gpio/spi_demo/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="learn_spi_app", 3 | name="[WIP] Learn SPI", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="main_learn_spi", 6 | stack_size=4 * 1024, 7 | requires=[ 8 | "gui", 9 | ], 10 | order=10, 11 | fap_icon="app.png", 12 | fap_category="GPIO", 13 | fap_description="Demo of communicating with W25Q32 IC.", 14 | ) 15 | -------------------------------------------------------------------------------- /gpio/uart_demo/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="uart_demo", 3 | name="UART Demo", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="uart_demo_main", 6 | requires=["gui"], 7 | stack_size=1 * 1024, 8 | fap_icon="uart_demo_10px.png", 9 | fap_category="GPIO", 10 | ) 11 | -------------------------------------------------------------------------------- /gpio/uart_demo/uart_demo_10px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/gpio/uart_demo/uart_demo_10px.png -------------------------------------------------------------------------------- /gpio/wiegand/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="wiegand_reader", 3 | name="Wiegand Reader", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="wiegand_app", 6 | requires=["gui"], 7 | stack_size=2 * 1024, 8 | fap_version=(1, 4), 9 | fap_icon="wiegand.png", 10 | fap_category="GPIO", 11 | ) 12 | -------------------------------------------------------------------------------- /gpio/wiegand/examples/C1.wgn: -------------------------------------------------------------------------------- 1 | Filetype: Flipper Wiegand Key File 2 | Version: 1 3 | Protocol: RAW 4 | Bits: 48 5 | RAW_Data: D0 0 2243 D0 124823 127090 D0 249670 251937 D0 374517 376784 D0 499364 501631 D0 627194 629461 D0 752041 754307 D0 876888 879155 D0 1001753 1004020 D0 1126600 1128867 D0 1251447 1253714 D1 1376330 1378618 D0 1501154 1503415 D0 1626022 1628264 D0 1750845 1753111 D0 1875691 1877958 D0 2000557 2002824 D1 2125440 2127739 D1 2253284 2255577 D0 2378103 2380366 D1 2502981 2505267 D0 2627806 2630070 D0 2752650 2754917 D0 2877497 2879764 D0 3002363 3004629 D0 3127210 3129477 D0 3252057 3254324 D0 3376904 3379171 D0 3501751 3504017 D0 3626598 3628865 D1 3751479 3753765 D1 3879324 3881604 D1 4004200 4006479 D0 4129018 4131282 D1 4253897 4256182 D0 4378722 4380985 D1 4503600 4505886 D1 4628463 4630742 D1 4753319 4755599 D0 4878178 4880402 D1 5003035 5005321 D0 5127860 5130124 D0 5252704 5254971 D0 5380534 5382800 D1 5505415 5507694 D1 5630267 5632550 D0 5755117 5757360 D1 5879976 5882257 6 | -------------------------------------------------------------------------------- /gpio/wiegand/wiegand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/gpio/wiegand/wiegand.png -------------------------------------------------------------------------------- /gpio/ws2812b_tester/.flipcorg/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/gpio/ws2812b_tester/.flipcorg/banner.png -------------------------------------------------------------------------------- /gpio/ws2812b_tester/.flipcorg/gallery/01-main-menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/gpio/ws2812b_tester/.flipcorg/gallery/01-main-menu.png -------------------------------------------------------------------------------- /gpio/ws2812b_tester/.flipcorg/gallery/02-led-pattern.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/gpio/ws2812b_tester/.flipcorg/gallery/02-led-pattern.png -------------------------------------------------------------------------------- /gpio/ws2812b_tester/.flipcorg/gallery/03-5v-pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/gpio/ws2812b_tester/.flipcorg/gallery/03-5v-pin.png -------------------------------------------------------------------------------- /gpio/ws2812b_tester/.flipcorg/gallery/04-about-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/gpio/ws2812b_tester/.flipcorg/gallery/04-about-1.png -------------------------------------------------------------------------------- /gpio/ws2812b_tester/.flipcorg/gallery/05-about-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/gpio/ws2812b_tester/.flipcorg/gallery/05-about-2.png -------------------------------------------------------------------------------- /gpio/ws2812b_tester/.flipcorg/gallery/06-about-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/gpio/ws2812b_tester/.flipcorg/gallery/06-about-3.png -------------------------------------------------------------------------------- /gpio/ws2812b_tester/app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/gpio/ws2812b_tester/app.png -------------------------------------------------------------------------------- /gpio/ws2812b_tester/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="ws2812b_tester_app", 3 | name="WS2812B LED Tester", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="ws2812b_led_tester_app", 6 | fap_version=(1, 9), 7 | stack_size=4 * 1024, 8 | requires=[ 9 | "gui", 10 | ], 11 | order=10, 12 | fap_icon="app.png", 13 | fap_category="GPIO", 14 | fap_author="jamisonderek", 15 | fap_description="WS2812B LED Tester App. This is intended to test that WS2812B LEDs are functioning correctly.", 16 | fap_weburl="https://github.com/jamisonderek/flipper-zero-tutorials/tree/main/gpio/ws2812b_tester", 17 | ) 18 | -------------------------------------------------------------------------------- /gpio/ws2812b_tester/led_driver.h: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | #define MAX_LED_COUNT 512 5 | 6 | typedef struct LedDriver LedDriver; 7 | 8 | LedDriver* led_driver_alloc(int count_leds, const GpioPin* gpio); 9 | void led_driver_free(LedDriver* led_driver); 10 | void led_driver_set_pin(LedDriver* led_driver, const GpioPin* gpio); 11 | uint32_t led_driver_set_led(LedDriver* led_driver, uint32_t index, uint32_t rrggbb); 12 | uint32_t led_driver_get_led(LedDriver* led_driver, uint32_t index); 13 | void led_driver_transmit(LedDriver* led_driver, bool transmit_if_clean); 14 | -------------------------------------------------------------------------------- /hid/hid_app/final_files/assets/Cookie_def_11x9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/hid/hid_app/final_files/assets/Cookie_def_11x9.png -------------------------------------------------------------------------------- /hid/hid_app/final_files/assets/Cookie_pressed_17x17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/hid/hid_app/final_files/assets/Cookie_pressed_17x17.png -------------------------------------------------------------------------------- /hid/hid_app/final_files/views.h: -------------------------------------------------------------------------------- 1 | typedef enum { 2 | HidViewSubmenu, 3 | HidViewKeynote, 4 | HidViewKeyboard, 5 | HidViewMedia, 6 | HidViewMouse, 7 | HidViewMouseJiggler, 8 | BtHidViewTikTok, 9 | BtHidViewCC, 10 | HidViewExitConfirm, 11 | } HidView; -------------------------------------------------------------------------------- /hid/hid_app/final_files/views/hid_cc.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | typedef struct Hid Hid; 6 | typedef struct HidCC HidCC; 7 | 8 | HidCC* hid_cc_alloc(Hid* bt_hid); 9 | 10 | void hid_cc_free(HidCC* hid_cc); 11 | 12 | View* hid_cc_get_view(HidCC* hid_cc); 13 | 14 | void hid_cc_set_connected_status(HidCC* hid_cc, bool connected); 15 | -------------------------------------------------------------------------------- /hid/hid_cookie/.flipcorg/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/hid/hid_cookie/.flipcorg/banner.png -------------------------------------------------------------------------------- /hid/hid_cookie/.flipcorg/gallery/bt-clicking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/hid/hid_cookie/.flipcorg/gallery/bt-clicking.png -------------------------------------------------------------------------------- /hid/hid_cookie/.flipcorg/gallery/configure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/hid/hid_cookie/.flipcorg/gallery/configure.png -------------------------------------------------------------------------------- /hid/hid_cookie/.flipcorg/gallery/credits.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/hid/hid_cookie/.flipcorg/gallery/credits.png -------------------------------------------------------------------------------- /hid/hid_cookie/.flipcorg/gallery/instructions-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/hid/hid_cookie/.flipcorg/gallery/instructions-2.png -------------------------------------------------------------------------------- /hid/hid_cookie/.flipcorg/gallery/instructions-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/hid/hid_cookie/.flipcorg/gallery/instructions-3.png -------------------------------------------------------------------------------- /hid/hid_cookie/.flipcorg/gallery/main-menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/hid/hid_cookie/.flipcorg/gallery/main-menu.png -------------------------------------------------------------------------------- /hid/hid_cookie/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="cookie_clicker", 3 | name="Cookie Clicker", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="hid_cookie_ble_app", 6 | stack_size=1 * 1024, 7 | fap_libs=["ble_profile"], 8 | fap_category="Bluetooth", 9 | fap_icon="hid_cookie_ble_10px.png", 10 | fap_icon_assets="assets", 11 | fap_icon_assets_symbol="hid", 12 | fap_author="jamisonderek", 13 | fap_weburl="https://github.com/jamisonderek/flipper-zero-tutorials/tree/main/hid/hid_cookie", 14 | fap_version=(1, 1), 15 | fap_description="The goal of this application is use the Flipper Zero's bluetooth connectivity to send mouse clicks to your phone at a given frequency. If you are playing a game, such as Cookie Clicker 2, this will result in a 'screen tap' being simulated. Only connect to phones you own (unless your friends ask you to connect your Flipper Zero to their phone, so they can unlock more achievements in their games!)", 16 | ) 17 | -------------------------------------------------------------------------------- /hid/hid_cookie/assets/Arr_dwn_7x9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/hid/hid_cookie/assets/Arr_dwn_7x9.png -------------------------------------------------------------------------------- /hid/hid_cookie/assets/Arr_up_7x9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/hid/hid_cookie/assets/Arr_up_7x9.png -------------------------------------------------------------------------------- /hid/hid_cookie/assets/Ble_connected_15x15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/hid/hid_cookie/assets/Ble_connected_15x15.png -------------------------------------------------------------------------------- /hid/hid_cookie/assets/Ble_disconnected_15x15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/hid/hid_cookie/assets/Ble_disconnected_15x15.png -------------------------------------------------------------------------------- /hid/hid_cookie/assets/Circles_47x47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/hid/hid_cookie/assets/Circles_47x47.png -------------------------------------------------------------------------------- /hid/hid_cookie/assets/Cookie_def_11x9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/hid/hid_cookie/assets/Cookie_def_11x9.png -------------------------------------------------------------------------------- /hid/hid_cookie/assets/Cookie_pressed_17x17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/hid/hid_cookie/assets/Cookie_pressed_17x17.png -------------------------------------------------------------------------------- /hid/hid_cookie/assets/Pin_back_arrow_10x8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/hid/hid_cookie/assets/Pin_back_arrow_10x8.png -------------------------------------------------------------------------------- /hid/hid_cookie/assets/Pressed_Button_13x13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/hid/hid_cookie/assets/Pressed_Button_13x13.png -------------------------------------------------------------------------------- /hid/hid_cookie/hid_cookie_ble_10px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/hid/hid_cookie/hid_cookie_ble_10px.png -------------------------------------------------------------------------------- /hid/hid_cookie/views.h: -------------------------------------------------------------------------------- 1 | typedef enum { 2 | HidViewSubmenu, 3 | BtHidViewInstructions, 4 | BtHidViewConfigure, 5 | BtHidViewClicker, 6 | BtHidViewCredits, 7 | } HidView; -------------------------------------------------------------------------------- /hid/hid_cookie/views/hid_cc.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | typedef struct Hid Hid; 6 | typedef struct HidCC HidCC; 7 | 8 | HidCC* hid_cc_alloc(Hid* bt_hid); 9 | 10 | void hid_cc_free(HidCC* hid_cc); 11 | 12 | View* hid_cc_get_view(HidCC* hid_cc); 13 | 14 | void hid_cc_set_connected_status(HidCC* hid_cc, bool connected); 15 | 16 | void hid_cc_set_cursor_position(HidCC* hid_cc, uint8_t x, uint8_t y, uint8_t repeat, uint8_t speed); -------------------------------------------------------------------------------- /js-old/dac/dac.js: -------------------------------------------------------------------------------- 1 | let gpio = require("gpio"); 2 | let pins = ["PA7", "PA6", "PA4", "PB3", "PB2", "PC3"]; 3 | for (let i=0; i 4 | #include "led_driver.h" 5 | 6 | #define MAX_LED_COUNT 16 7 | 8 | // We store the HIGH/LOW durations (2 values) for each color bit (24 bits per LED) 9 | #define LED_DRIVER_BUFFER_SIZE (MAX_LED_COUNT * 2 * 24) 10 | 11 | // We use a setinel value to figure out when the timer is complete. 12 | #define LED_DRIVER_TIMER_SETINEL 0xFFFFU 13 | 14 | /** 64 transitions per us @ 64MHz. Our timing is in NANO_SECONDS */ 15 | #define LED_DRIVER_TIMER_NANOSECOND (1000U / (SystemCoreClock / 1000000U)) 16 | 17 | // Timings for WS2812B 18 | #define LED_DRIVER_T0H 400U 19 | #define LED_DRIVER_T1H 800U 20 | #define LED_DRIVER_T0L 850U 21 | #define LED_DRIVER_T1L 450U 22 | #define LED_DRIVER_TRESETL 55 * 1000U 23 | #define LED_DRIVER_TDONE 2000U 24 | 25 | // Max wait for the DMA to complete. NOTE: 4000 leds*(850ns+450ns)*24 = 124.8ms + 50ms blanking = 174.8ms 26 | #define LED_DRIVER_SETINEL_WAIT_MS 200 -------------------------------------------------------------------------------- /js-old/flipboard/png/down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js-old/flipboard/png/down.png -------------------------------------------------------------------------------- /js-old/flipboard/png/flipboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js-old/flipboard/png/flipboard.png -------------------------------------------------------------------------------- /js-old/flipboard/png/flippy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js-old/flipboard/png/flippy.png -------------------------------------------------------------------------------- /js-old/flipboard/png/up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js-old/flipboard/png/up.png -------------------------------------------------------------------------------- /js-old/flipboard/scripts/color_api.js: -------------------------------------------------------------------------------- 1 | ({ 2 | green: { red: 0x00, green: 0xFF, blue: 0x00 }, 3 | red: { red: 0xFF, green: 0x00, blue: 0x00 }, 4 | yellow: { red: 0xFF, green: 0x7F, blue: 0x00 }, 5 | blue: { red: 0x00, green: 0x00, blue: 0xFF }, 6 | default_glow: 0.10, 7 | bright_glow: 0.90, 8 | brightness: function (color, brightness) { 9 | return { 10 | red: color.red * brightness, 11 | green: color.green * brightness, 12 | blue: color.blue * brightness 13 | }; 14 | } 15 | }) -------------------------------------------------------------------------------- /js-old/flipboard/scripts/down.fxbm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js-old/flipboard/scripts/down.fxbm -------------------------------------------------------------------------------- /js-old/flipboard/scripts/fb_leds_api.js: -------------------------------------------------------------------------------- 1 | ({ 2 | color_api: undefined, 3 | rgbLeds: require("rgbleds"), 4 | led_colors: [], 5 | updateLeds: function (bright) { 6 | let isChanged = false; 7 | for (let i = 0; i < this.led_colors.length; i++) { 8 | let b = bright[i] ? this.color_api.bright_glow : this.color_api.default_glow; 9 | let c = this.color_api.brightness(this.led_colors[i], b); // using global 'color' object. 10 | if (this.rgbLeds.set(i, c) !== c) { 11 | isChanged = true; 12 | } 13 | } 14 | // We always call update, so LEDs can be unplugged and reconnected. 15 | this.rgbLeds.update(); 16 | return isChanged; 17 | }, 18 | init: function (color_api, colors) { 19 | this.color_api = color_api; 20 | this.led_colors = colors; 21 | this.rgbLeds.setup({ "pin": "PC3", "count": this.led_colors.length, "spec": "WS2812B" }); 22 | let state = []; 23 | for (let i = 0; i < this.led_colors.length; i++) { 24 | state.push(false); 25 | } 26 | this.updateLeds(state); 27 | } 28 | }) -------------------------------------------------------------------------------- /js-old/flipboard/scripts/flippy.fxbm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js-old/flipboard/scripts/flippy.fxbm -------------------------------------------------------------------------------- /js-old/flipboard/scripts/up.fxbm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js-old/flipboard/scripts/up.fxbm -------------------------------------------------------------------------------- /js-old/flipboard/sub/Light_off.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz Key File 2 | Version: 1 3 | Frequency: 433920000 4 | Preset: FuriHalSubGhzPresetOok650Async 5 | Latitute: 0.000000 6 | Longitude: 0.000000 7 | Protocol: Princeton 8 | Bit: 24 9 | Key: 00 00 00 00 00 52 81 14 10 | TE: 182 11 | -------------------------------------------------------------------------------- /js-old/flipboard/sub/Light_on.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz Key File 2 | Version: 1 3 | Frequency: 433920000 4 | Preset: FuriHalSubGhzPresetOok650Async 5 | Latitute: 0.000000 6 | Longitude: 0.000000 7 | Protocol: Princeton 8 | Bit: 24 9 | Key: 00 00 00 00 00 BC 9B 34 10 | TE: 181 11 | -------------------------------------------------------------------------------- /js-old/intro/README.md: -------------------------------------------------------------------------------- 1 | # JavaScript intro 2 | 3 | ## Introduction 4 | I created an introduction to JavaScript video at [https://youtu.be/33Xmn5rnisc](https://youtu.be/33Xmn5rnisc). 5 | 6 | In the video I walked thru the [a_js_intro.js](./a_js_intro.js) file. 7 | 8 | The `a_js_intro.js` script ends up covering a lot of topics! 9 | - submenu : `setHeader`, `addItem`, `show` 10 | - keyboard : `text` (first param is # of bytes to allocate, including null terminator) 11 | - storage : `exists` 12 | - usbdisk : `start`, `wasEjected`, `stop` 13 | - textbox : `setConfig`, `emptyText`, `addText`, `show`, `isOpen` 14 | - gpio : `init`, `read` 15 | - badusb : `setup`, `isConnected`, `press`, `println`, `quit` 16 | - subghz : `transmitFile` 17 | - `let`, `=` (assignment), `for` (loop) 18 | - `require`, `print`, `delay`, `parse_int`, `__dirpath` 19 | - Strings, numbers, booleans 20 | - Arrays, `.length` 21 | - `+` (adding), `i++` (increment by 1), `!` (not) 22 | - `if`, `else if`, `===` (compare equal), `!==` (compare not equal) 23 | - calling functions, defining functions, `return` 24 | 25 | At the end of the video I ran [widget.js](./widget.js) to summarize what we learned. -------------------------------------------------------------------------------- /js-old/intro/widget-js.fxbm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js-old/intro/widget-js.fxbm -------------------------------------------------------------------------------- /js-old/intro/widget.js: -------------------------------------------------------------------------------- 1 | let widget = require("widget"); 2 | 3 | print("Loading file", __filepath); 4 | print("From directory", __dirpath); 5 | 6 | let logo = widget.loadImageXbm(__dirpath + "/widget-js.fxbm"); 7 | 8 | // addText supports "Primary" and "Secondary" font sizes. 9 | widget.addText(10, 10, "Primary", "JavaScript on Flipper"); 10 | widget.addText(10, 20, "Secondary", "- How to edit and run scripts"); 11 | widget.addText(10, 30, "Secondary", "- Using 'let' and 'require'"); 12 | widget.addText(10, 40, "Secondary", "- Different module support"); 13 | widget.addText(10, 50, "Secondary", "- badusb, submenu, textbox,"); 14 | widget.addText(10, 60, "Secondary", "- storage, keyboard, etc."); 15 | // Show the widget (drawing the layers in the orderer they were added) 16 | widget.show(); 17 | 18 | let i = 12; 19 | let bitmap = undefined; 20 | while (widget.isOpen()) { 21 | bitmap = widget.addXbm(7, i, logo); 22 | delay(500); 23 | widget.remove(bitmap); 24 | delay(100); 25 | i += 10; 26 | if (i > 60) { i = 12; } 27 | } 28 | 29 | // If user did not press the back button, close the widget. 30 | if (widget.isOpen()) { 31 | widget.close(); 32 | } -------------------------------------------------------------------------------- /js-old/readme.md: -------------------------------------------------------------------------------- 1 | # js-old 2 | Most of these scripts are for MNTM-005 thru MNTM-007. 3 | Official firmware released new event_loop module, new gui modules, and new GPIO module. 4 | MNTM-008 will align with the new modules. 5 | -------------------------------------------------------------------------------- /js-old/tones/README.md: -------------------------------------------------------------------------------- 1 | # Speaker 2 | 3 | A JavaScript that plays tones using the `ffi` commands. The advantage of the `ffi` commands is that they can run on firmware without requiring a particular module `.fal` file to exist on the Flipper. Thanks to [Freehuntx](https://github.com/Freehuntx) for the various examples of using `ffi`. 4 | 5 | ## How to use 6 | Copy the `speaker.js` file and `speaker_api.js` file to your Flipper Zero, typically the `SD Card/app/Scrips` folder. You can then run the script (on your Flipper press `OK` then choose `Apps`, `Scripts`, `speaker.js`). 7 | 8 | NOTE: The script uses the `__dirpath` variable to locate the `speaker_api.js` file. Some frameworks don't support this variable yet, so you may need to adjust the path to the `speaker_api.js` file. For example change the first line of speaker.js to the following: 9 | ```js 10 | let Speaker = load("/ext/apps/Scripts/speaker_api.js"); 11 | ``` 12 | 13 | For an `ffi` version of script that obtains the same data as `__dirpath` see [this Discord post]( 14 | https://discord.com/channels/1211622338198765599/1220056596638597327) by @Freehuntx. -------------------------------------------------------------------------------- /js-old/tones/speaker.js: -------------------------------------------------------------------------------- 1 | let Speaker = load(__dirpath + "/speaker_api.js"); 2 | 3 | Speaker.play(440, 1.0, 500); 4 | Speaker.play(880, 1.0, 500); 5 | -------------------------------------------------------------------------------- /js-old/tones/speaker_api.js: -------------------------------------------------------------------------------- 1 | ({ 2 | _acquired : false, 3 | _acquire : ffi("int furi_hal_speaker_acquire(int)"), 4 | start : ffi("void furi_hal_speaker_start(float, float)"), 5 | stop : ffi("void furi_hal_speaker_stop()"), 6 | _release : ffi("void furi_hal_speaker_release()"), 7 | acquire : function(timeout) { 8 | if (!this._acquired) { 9 | this._acquired = this._acquire(timeout); 10 | } 11 | return this._acquired; 12 | }, 13 | acquired : function() { 14 | return this._acquired; 15 | }, 16 | release : function() { 17 | if (this._acquired) { 18 | this._release(); 19 | this._acquired = false; 20 | } 21 | }, 22 | play : function(frequency, volume, duration) { 23 | let already_acquired = this.acquired(); 24 | if (!already_acquired) { 25 | this.acquire(1000); 26 | }; 27 | if (this.acquired()) { 28 | this.start(frequency, volume); 29 | delay(duration); 30 | this.stop(); 31 | } 32 | if (!already_acquired) { 33 | this.release(); 34 | } 35 | }, 36 | } 37 | ) 38 | -------------------------------------------------------------------------------- /js-old/vgm_sensor/a_demo.js: -------------------------------------------------------------------------------- 1 | // Add new feature to JavaScript 2 | // Speaker API! (created using FFI) 3 | let __dirpath = "/ext/apps/Scripts"; 4 | let speaker = load(__dirpath + "/speaker_api.js"); 5 | // Play a sound at 440 Hz, volume 100% for 250 ms 6 | speaker.play(440, 1.0, 250); 7 | 8 | 9 | // Add new feature to JavaScript 10 | // Video Game Module Sensor data! 11 | // (created using C Module) 12 | let vgm = require("vgm"); 13 | // Wait for 1 second so sensor data can be read 14 | delay(1000); 15 | print("Pitch is", vgm.getPitch()); 16 | print("Roll is", vgm.getRoll()); 17 | print("Yaw is", vgm.getYaw()); 18 | 19 | // Wait for up to 5 second for the yaw to change 20 | // at least 30 degrees. Return the change in yaw 21 | // in degrees. 22 | print("deltaYaw is", vgm.deltaYaw(30.0, 5000)); -------------------------------------------------------------------------------- /js-old/vgm_sensor/js_vgm/FILES.txt: -------------------------------------------------------------------------------- 1 | The files imu.c, imu.h, and ICM42688P are from https://github.com/flipperdevices/flipperzero-game-engine.git 2 | 3 | Please see that file for the license. -------------------------------------------------------------------------------- /js-old/vgm_sensor/js_vgm/imu.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | typedef struct Imu Imu; 4 | 5 | Imu* imu_alloc(void); 6 | 7 | void imu_free(Imu* imu); 8 | 9 | bool imu_present(Imu* imu); 10 | 11 | float imu_pitch_get(Imu* imu); 12 | 13 | float imu_roll_get(Imu* imu); 14 | 15 | float imu_yaw_get(Imu* imu); -------------------------------------------------------------------------------- /js-old/vgm_sensor/prebuilt/momentum_dev.fal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js-old/vgm_sensor/prebuilt/momentum_dev.fal -------------------------------------------------------------------------------- /js-old/vgm_sensor/prebuilt/momentum_release.fal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js-old/vgm_sensor/prebuilt/momentum_release.fal -------------------------------------------------------------------------------- /js-old/vgm_sensor/prebuilt/official_dev.fal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js-old/vgm_sensor/prebuilt/official_dev.fal -------------------------------------------------------------------------------- /js-old/vgm_sensor/prebuilt/official_release.fal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js-old/vgm_sensor/prebuilt/official_release.fal -------------------------------------------------------------------------------- /js/ai/momentum-firmware/Important-AI-info.txt: -------------------------------------------------------------------------------- 1 | Attached are sample JavaScript files (train1.js, badusb_demo.js, blebeacon.js, disk.js, event_loop.js, gui.js, i2c-spi.js, interactive.js, spi.js, subghz.js) that work on the Flipper Zero. Flipper Zero JavaScript is based on the mJS engine, which is fairly restricted version of JavaScript. You should only use functions defined in the training file, no additional built-in commands are supported. You should not redefine any function that is used in the training file. Please see the comments in train1.js file for more details. 2 | -------------------------------------------------------------------------------- /js/ai/momentum-firmware/disk.js: -------------------------------------------------------------------------------- 1 | checkSdkFeatures(["usbdisk"]); 2 | 3 | // The actual application uses all of these modules... 4 | let eventLoop = require("event_loop"); 5 | let gui = require("gui"); 6 | let textBoxView = require("gui/text_box"); 7 | let badusb = require("badusb"); 8 | let storage = require("storage"); 9 | 10 | // The code below is a simplification... 11 | let usbdisk = require("usbdisk"); 12 | let sizeMb = 4; 13 | let imagePath = "/ext/apps_data/mass_storage/" + sizeMb.toString() + "MB.img"; 14 | let imageSize = sizeMb * 1024 * 1024; 15 | 16 | if (storage.fileExists(imagePath)) { 17 | print("Disk image exists!"); 18 | } else { 19 | if (doesSdkSupport(["usbdisk-createimage"])) { 20 | print("Creating disk image..."); 21 | usbdisk.createImage(imagePath, imageSize); 22 | } else { 23 | die("Disk image not present. Please manually create: " + imagePath); 24 | } 25 | } 26 | 27 | print("Attaching storage..."); 28 | usbdisk.start(imagePath); 29 | 30 | print("Waiting for storage to detatch..."); 31 | while (!usbdisk.wasEjected()) { 32 | delay(1000); 33 | } 34 | 35 | print("Ejected, stopping UsbDisk..."); 36 | usbdisk.stop(); -------------------------------------------------------------------------------- /js/ai/momentum-firmware/event_loop.js: -------------------------------------------------------------------------------- 1 | let eventLoop = require("event_loop"); 2 | 3 | // print a string after 1337 milliseconds 4 | eventLoop.subscribe(eventLoop.timer("oneshot", 1337), function (_subscription, _item) { 5 | print("Hi after 1337 ms"); 6 | }); 7 | 8 | // count up to 5 with a delay of 100ms between increments 9 | eventLoop.subscribe(eventLoop.timer("periodic", 100), function (subscription, _item, counter) { 10 | print("Counter two:", counter); 11 | if (counter === 5) 12 | subscription.cancel(); 13 | return [counter + 1]; 14 | }, 0); 15 | 16 | // count up to 15 with a delay of 100ms between increments 17 | // and stop the program when the count reaches 15 18 | eventLoop.subscribe(eventLoop.timer("periodic", 100), function (subscription, _item, event_loop, counter) { 19 | print("Counter one:", counter); 20 | if (counter === 15) 21 | event_loop.stop(); 22 | return [event_loop, counter + 1]; 23 | }, eventLoop, 0); 24 | 25 | eventLoop.run(); 26 | -------------------------------------------------------------------------------- /js/ai/official-firmware/Important-AI-info.txt: -------------------------------------------------------------------------------- 1 | Attached are five sample JavaScript files (train1.js, badusb_demo.js, event_loop.js, gui.js, interactive.js) that work on the Flipper Zero. Flipper Zero JavaScript is based on the mJS engine, which is fairly restricted version of JavaScript. You should only use functions defined in the training file, no additional built-in commands are supported. You should not redefine any function that is used in the training file. Please see the comments in train1.js file for more details. 2 | -------------------------------------------------------------------------------- /js/ai/official-firmware/event_loop.js: -------------------------------------------------------------------------------- 1 | let eventLoop = require("event_loop"); 2 | 3 | // print a string after 1337 milliseconds 4 | eventLoop.subscribe(eventLoop.timer("oneshot", 1337), function (_subscription, _item) { 5 | print("Hi after 1337 ms"); 6 | }); 7 | 8 | // count up to 5 with a delay of 100ms between increments 9 | eventLoop.subscribe(eventLoop.timer("periodic", 100), function (subscription, _item, counter) { 10 | print("Counter two:", counter); 11 | if (counter === 5) 12 | subscription.cancel(); 13 | return [counter + 1]; 14 | }, 0); 15 | 16 | // count up to 15 with a delay of 100ms between increments 17 | // and stop the program when the count reaches 15 18 | eventLoop.subscribe(eventLoop.timer("periodic", 100), function (subscription, _item, event_loop, counter) { 19 | print("Counter one:", counter); 20 | if (counter === 15) 21 | event_loop.stop(); 22 | return [event_loop, counter + 1]; 23 | }, eventLoop, 0); 24 | 25 | eventLoop.run(); 26 | -------------------------------------------------------------------------------- /js/ai/unleashed-firmware/Important-AI-info.txt: -------------------------------------------------------------------------------- 1 | Attached are five sample JavaScript files (train1.js, badusb_demo.js, event_loop.js, gui.js, interactive.js) that work on the Flipper Zero. Flipper Zero JavaScript is based on the mJS engine, which is fairly restricted version of JavaScript. You should only use functions defined in the training file, no additional built-in commands are supported. You should not redefine any function that is used in the training file. Please see the comments in train1.js file for more details. 2 | -------------------------------------------------------------------------------- /js/ai/unleashed-firmware/event_loop.js: -------------------------------------------------------------------------------- 1 | let eventLoop = require("event_loop"); 2 | 3 | // print a string after 1337 milliseconds 4 | eventLoop.subscribe(eventLoop.timer("oneshot", 1337), function (_subscription, _item) { 5 | print("Hi after 1337 ms"); 6 | }); 7 | 8 | // count up to 5 with a delay of 100ms between increments 9 | eventLoop.subscribe(eventLoop.timer("periodic", 100), function (subscription, _item, counter) { 10 | print("Counter two:", counter); 11 | if (counter === 5) 12 | subscription.cancel(); 13 | return [counter + 1]; 14 | }, 0); 15 | 16 | // count up to 15 with a delay of 100ms between increments 17 | // and stop the program when the count reaches 15 18 | eventLoop.subscribe(eventLoop.timer("periodic", 100), function (subscription, _item, event_loop, counter) { 19 | print("Counter one:", counter); 20 | if (counter === 15) 21 | event_loop.stop(); 22 | return [event_loop, counter + 1]; 23 | }, eventLoop, 0); 24 | 25 | eventLoop.run(); 26 | -------------------------------------------------------------------------------- /js/badusb/mount.js: -------------------------------------------------------------------------------- 1 | let usbdisk = require("usbdisk"); 2 | 3 | let exfilCapacityMb = 4; // Reserve space for our image (payloads and results). 4 | let image = __dirname + "/Demo_" + exfilCapacityMb.toString() + "MB.img"; 5 | 6 | usbdisk.start(image); 7 | 8 | let i = 0; 9 | while (true) { 10 | delay(1000); 11 | print(i++); 12 | } -------------------------------------------------------------------------------- /js/flipboard/fal/mntm-001/js_dialog.fal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js/flipboard/fal/mntm-001/js_dialog.fal -------------------------------------------------------------------------------- /js/flipboard/fal/mntm-001/js_gpio.fal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js/flipboard/fal/mntm-001/js_gpio.fal -------------------------------------------------------------------------------- /js/flipboard/fal/mntm-001/js_infrared.fal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js/flipboard/fal/mntm-001/js_infrared.fal -------------------------------------------------------------------------------- /js/flipboard/fal/mntm-001/js_rgbleds.fal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js/flipboard/fal/mntm-001/js_rgbleds.fal -------------------------------------------------------------------------------- /js/flipboard/fal/mntm-001/js_speaker.fal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js/flipboard/fal/mntm-001/js_speaker.fal -------------------------------------------------------------------------------- /js/flipboard/fal/mntm-001/js_textbox.fal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js/flipboard/fal/mntm-001/js_textbox.fal -------------------------------------------------------------------------------- /js/flipboard/fal/mntm-001/js_widget.fal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js/flipboard/fal/mntm-001/js_widget.fal -------------------------------------------------------------------------------- /js/flipboard/fal/mntm-dev-2024-04-19-a2fc553/js_infrared.fal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js/flipboard/fal/mntm-dev-2024-04-19-a2fc553/js_infrared.fal -------------------------------------------------------------------------------- /js/flipboard/fal/mntm-dev-2024-04-19-a2fc553/js_rgbleds.fal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js/flipboard/fal/mntm-dev-2024-04-19-a2fc553/js_rgbleds.fal -------------------------------------------------------------------------------- /js/flipboard/fal/mntm-dev-2024-04-19-a2fc553/js_speaker.fal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js/flipboard/fal/mntm-dev-2024-04-19-a2fc553/js_speaker.fal -------------------------------------------------------------------------------- /js/flipboard/fal/roguemaster-2024-04-20-4849538b/js_infrared.fal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js/flipboard/fal/roguemaster-2024-04-20-4849538b/js_infrared.fal -------------------------------------------------------------------------------- /js/flipboard/fal/roguemaster-2024-04-20-4849538b/js_rgbleds.fal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js/flipboard/fal/roguemaster-2024-04-20-4849538b/js_rgbleds.fal -------------------------------------------------------------------------------- /js/flipboard/fal/roguemaster-2024-04-20-4849538b/js_speaker.fal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js/flipboard/fal/roguemaster-2024-04-20-4849538b/js_speaker.fal -------------------------------------------------------------------------------- /js/flipboard/fal/unleashed-dev-2024-04-20-f4ffd29b/js_infrared.fal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js/flipboard/fal/unleashed-dev-2024-04-20-f4ffd29b/js_infrared.fal -------------------------------------------------------------------------------- /js/flipboard/fal/unleashed-dev-2024-04-20-f4ffd29b/js_rgbleds.fal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js/flipboard/fal/unleashed-dev-2024-04-20-f4ffd29b/js_rgbleds.fal -------------------------------------------------------------------------------- /js/flipboard/fal/unleashed-dev-2024-04-20-f4ffd29b/js_speaker.fal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js/flipboard/fal/unleashed-dev-2024-04-20-f4ffd29b/js_speaker.fal -------------------------------------------------------------------------------- /js/flipboard/fal/xtreme-dev-2024-04-20-aaa801b9/js_infrared.fal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js/flipboard/fal/xtreme-dev-2024-04-20-aaa801b9/js_infrared.fal -------------------------------------------------------------------------------- /js/flipboard/fal/xtreme-dev-2024-04-20-aaa801b9/js_rgbleds.fal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js/flipboard/fal/xtreme-dev-2024-04-20-aaa801b9/js_rgbleds.fal -------------------------------------------------------------------------------- /js/flipboard/fal/xtreme-dev-2024-04-20-aaa801b9/js_speaker.fal: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js/flipboard/fal/xtreme-dev-2024-04-20-aaa801b9/js_speaker.fal -------------------------------------------------------------------------------- /js/flipboard/modules/js_rgbleds/led_driver_i.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include "led_driver.h" 5 | 6 | #define MAX_LED_COUNT 16 7 | 8 | // We store the HIGH/LOW durations (2 values) for each color bit (24 bits per LED) 9 | #define LED_DRIVER_BUFFER_SIZE (MAX_LED_COUNT * 2 * 24) 10 | 11 | // We use a setinel value to figure out when the timer is complete. 12 | #define LED_DRIVER_TIMER_SETINEL 0xFFFFU 13 | 14 | /** 64 transitions per us @ 64MHz. Our timing is in NANO_SECONDS */ 15 | #define LED_DRIVER_TIMER_NANOSECOND (1000U / (SystemCoreClock / 1000000U)) 16 | 17 | // Timings for WS2812B 18 | #define LED_DRIVER_T0H 400U 19 | #define LED_DRIVER_T1H 800U 20 | #define LED_DRIVER_T0L 850U 21 | #define LED_DRIVER_T1L 450U 22 | #define LED_DRIVER_TRESETL 55 * 1000U 23 | #define LED_DRIVER_TDONE 2000U 24 | 25 | // Max wait for the DMA to complete. NOTE: 4000 leds*(850ns+450ns)*24 = 124.8ms + 50ms blanking = 174.8ms 26 | #define LED_DRIVER_SETINEL_WAIT_MS 200 -------------------------------------------------------------------------------- /js/flipboard/png/down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js/flipboard/png/down.png -------------------------------------------------------------------------------- /js/flipboard/png/flipboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js/flipboard/png/flipboard.png -------------------------------------------------------------------------------- /js/flipboard/png/flippy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js/flipboard/png/flippy.png -------------------------------------------------------------------------------- /js/flipboard/png/up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js/flipboard/png/up.png -------------------------------------------------------------------------------- /js/flipboard/scripts/color_api.js: -------------------------------------------------------------------------------- 1 | ({ 2 | green: { red: 0x00, green: 0xFF, blue: 0x00 }, 3 | red: { red: 0xFF, green: 0x00, blue: 0x00 }, 4 | yellow: { red: 0xFF, green: 0x7F, blue: 0x00 }, 5 | blue: { red: 0x00, green: 0x00, blue: 0xFF }, 6 | default_glow: 0.10, 7 | bright_glow: 0.90, 8 | brightness: function (color, brightness) { 9 | return { 10 | red: color.red * brightness, 11 | green: color.green * brightness, 12 | blue: color.blue * brightness 13 | }; 14 | } 15 | }) -------------------------------------------------------------------------------- /js/flipboard/scripts/down.fxbm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js/flipboard/scripts/down.fxbm -------------------------------------------------------------------------------- /js/flipboard/scripts/fb_leds_api.js: -------------------------------------------------------------------------------- 1 | ({ 2 | color_api: undefined, 3 | rgbLeds: require("rgbleds"), 4 | led_colors: [], 5 | updateLeds: function (bright) { 6 | let isChanged = false; 7 | for (let i = 0; i < this.led_colors.length; i++) { 8 | let b = bright[i] ? this.color_api.bright_glow : this.color_api.default_glow; 9 | let c = this.color_api.brightness(this.led_colors[i], b); // using global 'color' object. 10 | if (this.rgbLeds.set(i, c) !== c) { 11 | isChanged = true; 12 | } 13 | } 14 | // We always call update, so LEDs can be unplugged and reconnected. 15 | this.rgbLeds.update(); 16 | return isChanged; 17 | }, 18 | init: function (color_api, colors) { 19 | this.color_api = color_api; 20 | this.led_colors = colors; 21 | this.rgbLeds.setup({ "pin": "PC3", "count": this.led_colors.length, "spec": "WS2812B" }); 22 | let state = []; 23 | for (let i = 0; i < this.led_colors.length; i++) { 24 | state.push(false); 25 | } 26 | this.updateLeds(state); 27 | } 28 | }) -------------------------------------------------------------------------------- /js/flipboard/scripts/flippy.fxbm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js/flipboard/scripts/flippy.fxbm -------------------------------------------------------------------------------- /js/flipboard/scripts/up.fxbm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js/flipboard/scripts/up.fxbm -------------------------------------------------------------------------------- /js/flipboard/sub/Light_off.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz Key File 2 | Version: 1 3 | Frequency: 433920000 4 | Preset: FuriHalSubGhzPresetOok650Async 5 | Latitute: 0.000000 6 | Longitude: 0.000000 7 | Protocol: Princeton 8 | Bit: 24 9 | Key: 00 00 00 00 00 52 81 14 10 | TE: 182 11 | -------------------------------------------------------------------------------- /js/flipboard/sub/Light_on.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz Key File 2 | Version: 1 3 | Frequency: 433920000 4 | Preset: FuriHalSubGhzPresetOok650Async 5 | Latitute: 0.000000 6 | Longitude: 0.000000 7 | Protocol: Princeton 8 | Bit: 24 9 | Key: 00 00 00 00 00 BC 9B 34 10 | TE: 181 11 | -------------------------------------------------------------------------------- /js/intro/README.md: -------------------------------------------------------------------------------- 1 | # JavaScript intro 2 | 3 | ## Introduction 4 | I created an introduction to JavaScript video at [https://youtu.be/33Xmn5rnisc](https://youtu.be/33Xmn5rnisc). 5 | 6 | In the video I walked thru the [a_js_intro.js](./a_js_intro.js) file. 7 | 8 | The `a_js_intro.js` script ends up covering a lot of topics! 9 | - submenu : `setHeader`, `addItem`, `show` 10 | - keyboard : `text` (first param is # of bytes to allocate, including null terminator) 11 | - storage : `exists` 12 | - usbdisk : `start`, `wasEjected`, `stop` 13 | - textbox : `setConfig`, `emptyText`, `addText`, `show`, `isOpen` 14 | - gpio : `init`, `read` 15 | - badusb : `setup`, `isConnected`, `press`, `println`, `quit` 16 | - subghz : `transmitFile` 17 | - `let`, `=` (assignment), `for` (loop) 18 | - `require`, `print`, `delay`, `parse_int`, `__dirpath` 19 | - Strings, numbers, booleans 20 | - Arrays, `.length` 21 | - `+` (adding), `i++` (increment by 1), `!` (not) 22 | - `if`, `else if`, `===` (compare equal), `!==` (compare not equal) 23 | - calling functions, defining functions, `return` 24 | 25 | At the end of the video I ran [widget.js](./widget.js) to summarize what we learned. -------------------------------------------------------------------------------- /js/intro/widget-js.fxbm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/js/intro/widget-js.fxbm -------------------------------------------------------------------------------- /js/intro/widget.js: -------------------------------------------------------------------------------- 1 | let widget = require("widget"); 2 | 3 | print("Loading file", __filepath); 4 | print("From directory", __dirpath); 5 | 6 | let logo = widget.loadImageXbm(__dirpath + "/widget-js.fxbm"); 7 | 8 | // addText supports "Primary" and "Secondary" font sizes. 9 | widget.addText(10, 10, "Primary", "JavaScript on Flipper"); 10 | widget.addText(10, 20, "Secondary", "- How to edit and run scripts"); 11 | widget.addText(10, 30, "Secondary", "- Using 'let' and 'require'"); 12 | widget.addText(10, 40, "Secondary", "- Different module support"); 13 | widget.addText(10, 50, "Secondary", "- badusb, submenu, textbox,"); 14 | widget.addText(10, 60, "Secondary", "- storage, keyboard, etc."); 15 | // Show the widget (drawing the layers in the orderer they were added) 16 | widget.show(); 17 | 18 | let i = 12; 19 | let bitmap = undefined; 20 | while (widget.isOpen()) { 21 | bitmap = widget.addXbm(7, i, logo); 22 | delay(500); 23 | widget.remove(bitmap); 24 | delay(100); 25 | i += 10; 26 | if (i > 60) { i = 12; } 27 | } 28 | 29 | // If user did not press the back button, close the widget. 30 | if (widget.isOpen()) { 31 | widget.close(); 32 | } -------------------------------------------------------------------------------- /js/tones/README.md: -------------------------------------------------------------------------------- 1 | # Speaker 2 | 3 | A JavaScript that plays tones using the `ffi` commands. The advantage of the `ffi` commands is that they can run on firmware without requiring a particular module `.fal` file to exist on the Flipper. Thanks to [Freehuntx](https://github.com/Freehuntx) for the various examples of using `ffi`. 4 | 5 | ## How to use 6 | Copy the `speaker.js` file and `speaker_api.js` file to your Flipper Zero, typically the `SD Card/app/Scrips` folder. You can then run the script (on your Flipper press `OK` then choose `Apps`, `Scripts`, `speaker.js`). 7 | 8 | NOTE: The script uses the `__dirpath` variable to locate the `speaker_api.js` file. Some frameworks don't support this variable yet, so you may need to adjust the path to the `speaker_api.js` file. For example change the first line of speaker.js to the following: 9 | ```js 10 | let Speaker = load("/ext/apps/Scripts/speaker_api.js"); 11 | ``` 12 | 13 | For an `ffi` version of script that obtains the same data as `__dirpath` see [this Discord post]( 14 | https://discord.com/channels/1211622338198765599/1220056596638597327) by @Freehuntx. -------------------------------------------------------------------------------- /js/tones/speaker.js: -------------------------------------------------------------------------------- 1 | let Speaker = load(__dirname + "/speaker_api.js"); 2 | 3 | Speaker.play(440, 1.0, 500); 4 | Speaker.play(880, 1.0, 500); 5 | -------------------------------------------------------------------------------- /js/tones/speaker_api.js: -------------------------------------------------------------------------------- 1 | ({ 2 | _acquired : false, 3 | _acquire : ffi("int furi_hal_speaker_acquire(int)"), 4 | start : ffi("void furi_hal_speaker_start(float, float)"), 5 | stop : ffi("void furi_hal_speaker_stop()"), 6 | _release : ffi("void furi_hal_speaker_release()"), 7 | acquire : function(timeout) { 8 | if (!this._acquired) { 9 | this._acquired = this._acquire(timeout); 10 | } 11 | return this._acquired; 12 | }, 13 | acquired : function() { 14 | return this._acquired; 15 | }, 16 | release : function() { 17 | if (this._acquired) { 18 | this._release(); 19 | this._acquired = false; 20 | } 21 | }, 22 | play : function(frequency, volume, duration) { 23 | let already_acquired = this.acquired(); 24 | if (!already_acquired) { 25 | this.acquire(1000); 26 | }; 27 | if (this.acquired()) { 28 | this.start(frequency, volume); 29 | delay(duration); 30 | this.stop(); 31 | } 32 | if (!already_acquired) { 33 | this.release(); 34 | } 35 | }, 36 | } 37 | ) 38 | -------------------------------------------------------------------------------- /js/vgm_sensor/a_demo.js: -------------------------------------------------------------------------------- 1 | // Add new feature to JavaScript 2 | // Video Game Module Sensor data! 3 | // (created using C Module) 4 | let vgm = require("vgm"); 5 | // Wait for 1 second so sensor data can be read 6 | delay(1000); 7 | print("Pitch is", vgm.getPitch()); 8 | print("Roll is", vgm.getRoll()); 9 | print("Yaw is", vgm.getYaw()); 10 | 11 | // Wait for up to 5 second for the yaw to change 12 | // at least 30 degrees. Return the change in yaw 13 | // in degrees. 14 | print("Rotate yaw now!"); 15 | print("deltaYaw is", vgm.deltaYaw(30.0, 5000)); -------------------------------------------------------------------------------- /js/vgm_sensor/js_vgm/FILES.txt: -------------------------------------------------------------------------------- 1 | The files imu.c, imu.h, and ICM42688P are from https://github.com/flipperdevices/flipperzero-game-engine.git 2 | 3 | Please see that file for the license. -------------------------------------------------------------------------------- /js/vgm_sensor/js_vgm/imu.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | typedef struct Imu Imu; 4 | 5 | Imu* imu_alloc(void); 6 | 7 | void imu_free(Imu* imu); 8 | 9 | bool imu_present(Imu* imu); 10 | 11 | float imu_pitch_get(Imu* imu); 12 | 13 | float imu_roll_get(Imu* imu); 14 | 15 | float imu_yaw_get(Imu* imu); -------------------------------------------------------------------------------- /js/vgm_sensor/speaker_api.js: -------------------------------------------------------------------------------- 1 | ({ 2 | _acquired: false, 3 | _acquire: ffi("int furi_hal_speaker_acquire(int)"), 4 | _release: ffi("void furi_hal_speaker_release(void)"), 5 | start: ffi("void furi_hal_speaker_start(float, float)"), 6 | stop: ffi("void furi_hal_speaker_stop(void)"), 7 | acquire: function (timeout) { 8 | if (!this._acquired) { 9 | this._acquired = this._acquire(timeout); 10 | } 11 | return this._acquired; 12 | }, 13 | acquired: function () { 14 | return this._acquired; 15 | }, 16 | release: function () { 17 | if (this._acquired) { 18 | this._release(); 19 | this._acquired = false; 20 | } 21 | }, 22 | play: function (frequency, volume, duration) { 23 | let already_acquired = this.acquired(); 24 | if (!already_acquired) { 25 | this.acquire(1000); 26 | }; 27 | if (this.acquired()) { 28 | this.start(frequency, volume); 29 | delay(duration); 30 | this.stop(); 31 | } 32 | if (!already_acquired) { 33 | this.release(); 34 | } 35 | }, 36 | } 37 | ) -------------------------------------------------------------------------------- /marauder/README.md: -------------------------------------------------------------------------------- 1 | # Marauder 2 | Marauder is a tool for hacking WiFi networks. It is a collection of tools that can be used to perform WiFi attacks. It is designed to be used with the [Flipper Zero](https://flipperzero.one/). 3 | 4 | [Official ESP32Marauder site](https://github.com/justcallmekoko/ESP32Marauder/wiki/Flipper-Zero) 5 | 6 | ## Firmware 7 | These are the [directions](./firmware/README.md) for updating the firmware on the ESP32. 8 | 9 | ## Secret_ssid 10 | This [secret_ssid](./secret_ssid/README.md) is a tool that can be used to send a secret message over WiFi. The message is encoded into a SSID, which is then sent out over WiFi. The message can be decoded on a PC. 11 | -------------------------------------------------------------------------------- /marauder/firmware/README.md: -------------------------------------------------------------------------------- 1 | # Marauder Firmware 2 | To update your ESP32 firmware, you can use [ESP32Marauder](https://github.com/justcallmekoko/ESP32Marauder/wiki/Flipper-Zero) 3 | 4 | Talking Sasquach made a [video](https://youtu.be/uc5_hVmJ-3Y?t=354) that walks you through the process. 5 | - Install Git & Python3. 6 | - Install the "[CP210x Universal Windows Driver](https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers?tab=downloads)" from Silicon Labs. 7 | - Open PowerShell 8 | - git clone https://github.com/SkeletonMan03/FZEasyMarauderFlash 9 | - cd FZEasyMarauderFlash 10 | - run `pip3 install -r requirements.txt`. 11 | - Connect the devboard or ESP32 board via USB. 12 | - Press and hold the `BOOT` button on the module, press and release the `RESET` button. 13 | - Release the BOOT button. 14 | - run `python3 EasyInstall.py`. 15 | - Select the option of what you want to do 16 | - I choose "Update all files" 17 | - then I choose "Flash Marauder on ESP32-WROOM" for the WROOM module. 18 | - or "Flash Marauder on ESP32 Wemos D1 Mini" for the D1 Mini module. 19 | -------------------------------------------------------------------------------- /misc/WIP_thread_demo/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="wip_thread_demo", 3 | name="WIP Thread Demo", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="thread_demo_app", 6 | requires=["gui", "subghz"], 7 | stack_size=2 * 1024, 8 | fap_icon="demo.png", 9 | fap_category="Misc", 10 | ) 11 | -------------------------------------------------------------------------------- /misc/WIP_thread_demo/demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/misc/WIP_thread_demo/demo.png -------------------------------------------------------------------------------- /plugins/basic/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="basic_demo", 3 | name="Basic Demo", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="basic_demo_app", 6 | requires=["gui"], 7 | stack_size=2 * 1024, 8 | fap_icon="basic_demo.png", 9 | fap_category="Misc", 10 | ) 11 | -------------------------------------------------------------------------------- /plugins/basic/basic_view_port_demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/plugins/basic/basic_view_port_demo.png -------------------------------------------------------------------------------- /plugins/basic_scenes/README.md: -------------------------------------------------------------------------------- 1 | # Scenes Demo Application Tutorial 2 | This tutorial has moved to [/ui/basic_scenes](https://github.com/jamisonderek/flipper-zero-tutorials/tree/main/ui/basic_scenes) 3 | -------------------------------------------------------------------------------- /plugins/knob_component/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="knob_demo", 3 | name="Knob Demo", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="knob_demo_app", 6 | requires=["gui"], 7 | stack_size=2 * 1024, 8 | fap_icon="knob_demo.png", 9 | fap_category="Misc", 10 | ) 11 | -------------------------------------------------------------------------------- /plugins/knob_component/knob_demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/plugins/knob_component/knob_demo.png -------------------------------------------------------------------------------- /plugins/minimal_viewport/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="minimal_viewport_demo", 3 | name="Minimal Viewport Demo", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="minimal_viewport_demo_app", 6 | requires=["gui"], 7 | stack_size=2 * 1024, 8 | fap_icon="minimal_viewport.png", 9 | fap_category="Misc", 10 | ) 11 | -------------------------------------------------------------------------------- /plugins/minimal_viewport/minimal_viewport.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/plugins/minimal_viewport/minimal_viewport.png -------------------------------------------------------------------------------- /plugins/scenes/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="scenes_demo", 3 | name="Scenes Demo", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="scenes_demo_app", 6 | requires=["gui"], 7 | stack_size=2 * 1024, 8 | fap_icon="scenes_demo.png", 9 | fap_category="Misc", 10 | ) 11 | -------------------------------------------------------------------------------- /plugins/scenes/scenes_demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/plugins/scenes/scenes_demo.png -------------------------------------------------------------------------------- /rfid/Keri.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/rfid/Keri.xlsx -------------------------------------------------------------------------------- /rfid/fsk-geo/protocol_demo_fsk_geo.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | extern const ProtocolBase protocol_demo_fsk_geo; -------------------------------------------------------------------------------- /rfid/instafob/protocol_insta_fob.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | extern const ProtocolBase protocol_insta_fob; -------------------------------------------------------------------------------- /rfid/lf-rfid.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/rfid/lf-rfid.xlsx -------------------------------------------------------------------------------- /rfid/lfrfid-demo/README.md: -------------------------------------------------------------------------------- 1 | # lfrfid-demo 2 | 3 | ## Overview 4 | This is a console application, you need to look at https://lab.flipper.net/cli and run the `log debug` command to see the output from this application. 5 | 6 | This is a sample project to demonstrate the use of the LFRFIDReader library. The library is used to read low-frequency (125kHz) RFID tags. When a tag is detected, the library will invoke your callback function with the tag's data. You can specify the callback function and the protocol of the RFID tag. 7 | 8 | https://www.youtube.com/watch?v=z1MKNwX7MmE 9 | -------------------------------------------------------------------------------- /rfid/lfrfid-demo/app.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #include "lfrfid_reader.h" 4 | 5 | #define TAG "lfrfid-demo" 6 | 7 | void tag_callback(uint8_t* data, uint8_t length, void* context) { 8 | UNUSED(context); 9 | FURI_LOG_I(TAG, "Tag detected. Length: %d", length); 10 | if(length == 5) { 11 | FURI_LOG_I( 12 | TAG, "data: %02x %02x %02x %02x %02x", data[0], data[1], data[2], data[3], data[4]); 13 | if((data[0] != 0x13) || (data[1] != 0x37)) { 14 | FURI_LOG_W(TAG, "Tag is not for game"); 15 | return; 16 | } 17 | FURI_LOG_W(TAG, "TODO: Process tag..."); 18 | // TODO: Process tag. 19 | } 20 | } 21 | 22 | int32_t lfrfid_demo_app(void* _p) { 23 | UNUSED(_p); 24 | LFRFIDReader* reader = lfrfid_reader_alloc(); 25 | lfrfid_reader_set_tag_callback(reader, "EM4100", tag_callback, NULL); 26 | lfrfid_reader_start(reader); 27 | furi_delay_ms(45000); 28 | lfrfid_reader_stop(reader); 29 | furi_delay_ms(5000); 30 | lfrfid_reader_free(reader); 31 | return 0; 32 | } 33 | -------------------------------------------------------------------------------- /rfid/lfrfid-demo/app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/rfid/lfrfid-demo/app.png -------------------------------------------------------------------------------- /rfid/lfrfid-demo/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="lfrfid_demo", 3 | name="LFRFID Demo", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="lfrfid_demo_app", 6 | stack_size=4 * 1024, 7 | requires=[ 8 | "gui", 9 | ], 10 | order=10, 11 | fap_icon="app.png", 12 | fap_category="RFID", 13 | fap_description="Demo reading LFRFID tags", 14 | ) 15 | -------------------------------------------------------------------------------- /rfid/t5577/protocol_demo1.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | extern const ProtocolBase protocol_demo1; -------------------------------------------------------------------------------- /subghz/README.md: -------------------------------------------------------------------------------- 1 | # Sub-GHz 2 | The Flipper Zero "Sub-GHz" radio is used for receiving and transmitting frequencies below the 1GHz (1000MHz) range. In particular, the firmware supports 300-348 MHz, 387-464 MHz, and 779-928 MHz operational bands. Depending on your region there may be additional [restrictions](https://docs.flipperzero.one/sub-ghz/frequencies). 3 | 4 | This enlistment contains the following: 5 | - [Apps](./apps) are applications that utilize the subghz radio. 6 | - [Plugins](./plugins/README.md) are applications & games that can be added to the Flipper Zero. These applications utilize the subghz radio. 7 | - [Protocols](./protocols/README.md) extend the Sub-GHz "Read" feature of your Flipper with the ability to support new protocols. 8 | - [Samples](./samples/README.md) are samples captured by various remotes I own. 9 | -------------------------------------------------------------------------------- /subghz/apps/genie-recorder/.flipcorg/gallery/01-about.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/genie-recorder/.flipcorg/gallery/01-about.png -------------------------------------------------------------------------------- /subghz/apps/genie-recorder/.flipcorg/gallery/02-learn-done.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/genie-recorder/.flipcorg/gallery/02-learn-done.png -------------------------------------------------------------------------------- /subghz/apps/genie-recorder/.flipcorg/gallery/03-send-some-codes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/genie-recorder/.flipcorg/gallery/03-send-some-codes.png -------------------------------------------------------------------------------- /subghz/apps/genie-recorder/.flipcorg/gallery/04-main-menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/genie-recorder/.flipcorg/gallery/04-main-menu.png -------------------------------------------------------------------------------- /subghz/apps/genie-recorder/.flipcorg/gallery/05-config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/genie-recorder/.flipcorg/gallery/05-config.png -------------------------------------------------------------------------------- /subghz/apps/genie-recorder/.flipcorg/gallery/06-config-genie-file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/genie-recorder/.flipcorg/gallery/06-config-genie-file.png -------------------------------------------------------------------------------- /subghz/apps/genie-recorder/.flipcorg/gallery/07-learn-codes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/genie-recorder/.flipcorg/gallery/07-learn-codes.png -------------------------------------------------------------------------------- /subghz/apps/genie-recorder/.flipcorg/gallery/08-send-new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/genie-recorder/.flipcorg/gallery/08-send-new.png -------------------------------------------------------------------------------- /subghz/apps/genie-recorder/.flipcorg/gallery/09-send-complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/genie-recorder/.flipcorg/gallery/09-send-complete.png -------------------------------------------------------------------------------- /subghz/apps/genie-recorder/.flipcorg/gallery/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 3.1 2 | - Added to app catalog 3 | 4 | ## 3.0 5 | - Initial release without needing updated firmware -------------------------------------------------------------------------------- /subghz/apps/genie-recorder/007F1991.gne: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/genie-recorder/007F1991.gne -------------------------------------------------------------------------------- /subghz/apps/genie-recorder/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="genie_record", 3 | name="Genie Door Recorder", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="genie_record_app", 6 | requires=["gui", "subghz"], 7 | stack_size=4 * 1024, 8 | fap_version=(3, 1), 9 | fap_icon="genie.png", 10 | fap_category="Sub-GHz", 11 | fap_icon_assets="assets", 12 | fap_description="This application extracts the codes from a Genie garage door remote into a .GNE file. It also plays back a .GNE file to a Genie garage door opener.", 13 | ) 14 | -------------------------------------------------------------------------------- /subghz/apps/genie-recorder/assets/genie_10x10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/genie-recorder/assets/genie_10x10.png -------------------------------------------------------------------------------- /subghz/apps/genie-recorder/genie.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | #include "genie_about.h" 11 | #include "genie_app.h" 12 | #include "genie_file.h" 13 | #include "genie_learn.h" 14 | #include "genie_subghz_receive.h" 15 | #include "genie_submenu.h" 16 | 17 | const GpioPin* const pin_remote = &gpio_ext_pa7; 18 | 19 | int32_t genie_record_app(void* p) { 20 | UNUSED(p); 21 | GenieApp* app = genie_app_alloc(); 22 | view_dispatcher_run(genie_app_get_view_dispatcher(app)); 23 | genie_app_free(app); 24 | return 0; 25 | } -------------------------------------------------------------------------------- /subghz/apps/genie-recorder/genie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/genie-recorder/genie.png -------------------------------------------------------------------------------- /subghz/apps/genie-recorder/genie_config.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | 6 | typedef struct GenieConfig GenieConfig; 7 | typedef struct GenieApp GenieApp; 8 | 9 | GenieConfig* genie_config_alloc(GenieApp* app); 10 | void genie_config_free(GenieConfig* genie_config); 11 | View* genie_config_get_view(GenieConfig* genie_config); 12 | 13 | bool select_genie_file(GenieConfig* config); -------------------------------------------------------------------------------- /subghz/apps/genie-recorder/genie_file.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | typedef struct GenieFile GenieFile; 6 | 7 | GenieFile* genie_file_load(const char* path); 8 | void genie_file_free(GenieFile* file); 9 | uint32_t genie_file_get_key_hi(GenieFile* file); 10 | uint32_t genie_file_get_key_lo(GenieFile* file); 11 | uint16_t genie_file_get_last_sent(GenieFile* file); 12 | uint16_t genie_file_get_rec_count(GenieFile* file); 13 | void genie_file_set_last_sent(const char* genie_path, uint16_t last_sent); 14 | 15 | bool genie_save(uint32_t count, FuriString* key); 16 | uint32_t genie_save_bin(const char* key); 17 | uint32_t genie_load(); 18 | void genie_file_init(); -------------------------------------------------------------------------------- /subghz/apps/genie-recorder/genie_ini.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | typedef struct GenieApp GenieApp; 4 | 5 | void genie_ini_load(GenieApp* app); 6 | void genie_ini_save(GenieApp* app); -------------------------------------------------------------------------------- /subghz/apps/genie-recorder/genie_learn.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | View* genie_learn_alloc(void* app); 9 | 10 | void genie_learn_free(View* view); -------------------------------------------------------------------------------- /subghz/apps/genie-recorder/genie_send.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | typedef struct GenieApp GenieApp; 6 | typedef struct GenieSend GenieSend; 7 | 8 | GenieSend* genie_send_alloc(GenieApp* app); 9 | void genie_send_free(GenieSend* genie_send); 10 | View* genie_send_get_view(GenieSend* genie_send); -------------------------------------------------------------------------------- /subghz/apps/genie-recorder/genie_submenu.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | 7 | typedef struct GenieSubmenu GenieSubmenu; 8 | typedef struct GenieApp GenieApp; 9 | 10 | uint32_t genie_navigation_submenu_callback(void* context); 11 | GenieSubmenu* genie_submenu_alloc(GenieApp* app); 12 | View* genie_submenu_get_view(GenieSubmenu* submenu); 13 | void genie_submenu_free(GenieSubmenu* submenu); -------------------------------------------------------------------------------- /subghz/apps/genie-recorder/wiring-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/genie-recorder/wiring-2.jpg -------------------------------------------------------------------------------- /subghz/apps/genie-recorder/wiring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/genie-recorder/wiring.png -------------------------------------------------------------------------------- /subghz/apps/princeton-send/README.md: -------------------------------------------------------------------------------- 1 | # Princeton Sender 2 | 3 | This is a demo application that sends a Princeton 24-bit code using the internal radio, then 4 | it sends a 24-bit code using an external radio. It also enables the 5v pin for the external 5 | radio, in case the radio has a 5-volt to 3.3-volt regulator attached. 6 | 7 | There is no UI for this project, it just sends the two signals and then exits. Hopefully you 8 | can borrow this code for other projects, such as sending a beacon on a time interval. 9 | -------------------------------------------------------------------------------- /subghz/apps/princeton-send/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="princeton_send", 3 | name="Princeton Sender", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="princeton_send_app", 6 | requires=["gui", "subghz"], 7 | stack_size=2 * 1024, 8 | fap_icon="princeton_send.png", 9 | fap_category="Sub-GHz", 10 | ) 11 | -------------------------------------------------------------------------------- /subghz/apps/princeton-send/princeton_send.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/princeton-send/princeton_send.png -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/.flipcorg/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/rolling-flaws/.flipcorg/banner.png -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/.flipcorg/gallery/00-about.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/rolling-flaws/.flipcorg/gallery/00-about.png -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/.flipcorg/gallery/01-opened.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/rolling-flaws/.flipcorg/gallery/01-opened.png -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/.flipcorg/gallery/02-closed_PAST.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/rolling-flaws/.flipcorg/gallery/02-closed_PAST.png -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/.flipcorg/gallery/03-mainmenu-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/rolling-flaws/.flipcorg/gallery/03-mainmenu-1.png -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/.flipcorg/gallery/04-mainmenu-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/rolling-flaws/.flipcorg/gallery/04-mainmenu-2.png -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/.flipcorg/gallery/05-config-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/rolling-flaws/.flipcorg/gallery/05-config-1.png -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/.flipcorg/gallery/06-config-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/rolling-flaws/.flipcorg/gallery/06-config-2.png -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/.flipcorg/gallery/07-config-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/rolling-flaws/.flipcorg/gallery/07-config-3.png -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/.flipcorg/gallery/08-sync-remote.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/rolling-flaws/.flipcorg/gallery/08-sync-remote.png -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/.flipcorg/gallery/09-about-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/rolling-flaws/.flipcorg/gallery/09-about-2.png -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="rolling_flaws", 3 | name="Subghz Rolling Flaws", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="rolling_flaws_app", 6 | requires=["gui", "subghz"], 7 | stack_size=2 * 1024, 8 | fap_version=(1, 5), 9 | fap_icon="rolling_flaws.png", 10 | fap_category="Sub-GHz", 11 | fap_icon_assets="assets", 12 | fap_description="Rolling code receiver (version 1.5), used to learn about rolling code flaws. Watch video at https://youtu.be/gMnGuDC9EQo", 13 | ) 14 | -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/assets/Lock_10x8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/rolling-flaws/assets/Lock_10x8.png -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/assets/Unlock_10x8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/rolling-flaws/assets/Unlock_10x8.png -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/docs/clone-fz-remote.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/rolling-flaws/docs/clone-fz-remote.png -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/docs/enc00-attack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/rolling-flaws/docs/enc00-attack.png -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/docs/keeloq-codes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/rolling-flaws/docs/keeloq-codes.png -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/docs/kgb-attack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/rolling-flaws/docs/kgb-attack.png -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/docs/pair-fz-remote.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/rolling-flaws/docs/pair-fz-remote.png -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/docs/replay-attack-diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/rolling-flaws/docs/replay-attack-diagram.png -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/docs/replay-attack-failed-diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/rolling-flaws/docs/replay-attack-failed-diagram.png -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/docs/rollback-attack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/rolling-flaws/docs/rollback-attack.png -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/docs/rolljam-attack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/rolling-flaws/docs/rolljam-attack.png -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/docs/test-attack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/rolling-flaws/docs/test-attack.png -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/docs/unknown-mf-attack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/rolling-flaws/docs/unknown-mf-attack.png -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/docs/window-future-attack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/rolling-flaws/docs/window-future-attack.png -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/docs/window-next-attack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/rolling-flaws/docs/window-next-attack.png -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/rolling_flaws.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/rolling-flaws/rolling_flaws.png -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/rolling_flaws_keeloq.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "rolling_flaws_structs.h" 4 | 5 | #define FAILED_TO_PARSE 0x0BADC0DE 6 | 7 | void decode_keeloq(RollingFlawsModel* model, FuriString* buffer, bool sync); -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/rolling_flaws_send_keeloq.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | void send_keeloq_count(uint32_t fix, uint32_t count, const char* name, uint32_t frequency); -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/rolling_flaws_utils.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | #ifdef TAG 6 | #undef TAG 7 | #endif 8 | #define TAG "RollingFlawsUtils" 9 | 10 | size_t __furi_string_extract_string( 11 | FuriString* buffer, 12 | size_t start_index, 13 | char* text, 14 | char delim, 15 | FuriString* result); 16 | 17 | size_t __furi_string_extract_string_until( 18 | FuriString* buffer, 19 | size_t start_index, 20 | char* text, 21 | char until_delim, 22 | FuriString* result); 23 | 24 | uint32_t 25 | __furi_string_extract_int(FuriString* buffer, char* text, char delim, uint32_t default_value); 26 | 27 | uint32_t __furi_string_hex_to_uint32(FuriString* str); 28 | 29 | void __gui_redraw(); -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/sub/k-dh-enc00-cnt3DC9.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz Key File 2 | Version: 1 3 | Frequency: 433920000 4 | Preset: FuriHalSubGhzPresetOok650Async 5 | Protocol: KeeLoq 6 | Bit: 64 7 | Key: C0 00 0B D4 AB 97 72 14 8 | -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/sub/k-dh-enc00-cnt3DCA.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz Key File 2 | Version: 1 3 | Frequency: 433920000 4 | Preset: FuriHalSubGhzPresetOok650Async 5 | Protocol: KeeLoq 6 | Bit: 64 7 | Key: C0 02 8A 33 AB 97 72 14 8 | -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/sub/k-dh-enc00-cntA247.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz Key File 2 | Version: 1 3 | Frequency: 433920000 4 | Preset: FuriHalSubGhzPresetOok650Async 5 | Protocol: KeeLoq 6 | Bit: 64 7 | Key: C0 04 6A 34 AB 97 72 14 8 | -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/sub/k-dh-enc00-cntA248.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz Key File 2 | Version: 1 3 | Frequency: 433920000 4 | Preset: FuriHalSubGhzPresetOok650Async 5 | Protocol: KeeLoq 6 | Bit: 64 7 | Key: C0 03 89 EC AB 97 72 14 8 | -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/sub/k-dh-enc00-cntFD75.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz Key File 2 | Version: 1 3 | Frequency: 433920000 4 | Preset: FuriHalSubGhzPresetOok650Async 5 | Protocol: KeeLoq 6 | Bit: 64 7 | Key: C0 03 E4 C9 AB 97 72 14 8 | -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/sub/k-dh-enc00-cntFD76.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz Key File 2 | Version: 1 3 | Frequency: 433920000 4 | Preset: FuriHalSubGhzPresetOok650Async 5 | Protocol: KeeLoq 6 | Bit: 64 7 | Key: C0 0E BE 3B AB 97 72 14 8 | -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/sub/k-dh-sn0000000.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz Key File 2 | Version: 1 3 | Frequency: 433920000 4 | Preset: FuriHalSubGhzPresetOok650Async 5 | Protocol: KeeLoq 6 | Bit: 64 7 | Key: BE 2B 2D F9 00 00 00 04 8 | -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/sub/k-dh-sn01EA8D8-cnt0004.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz Key File 2 | Version: 1 3 | Frequency: 433920000 4 | Preset: FuriHalSubGhzPresetOok650Async 5 | Protocol: KeeLoq 6 | Bit: 64 7 | Key: BD 92 92 F3 1B 15 78 04 8 | -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/sub/k-dh-sn84EE9D5-cnt0004.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz Key File 2 | Version: 1 3 | Frequency: 433920000 4 | Preset: FuriHalSubGhzPresetOok650Async 5 | Protocol: KeeLoq 6 | Bit: 64 7 | Key: AD 04 58 14 AB 97 72 14 8 | -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/sub/k-dh-sn84EE9D5-cnt000B.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz Key File 2 | Version: 1 3 | Frequency: 433920000 4 | Preset: FuriHalSubGhzPresetOok650Async 5 | Protocol: KeeLoq 6 | Bit: 64 7 | Key: 9F 5E C1 A4 AB 97 72 14 8 | -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/sub/k-dh-sn84EE9D5-cnt0042.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz Key File 2 | Version: 1 3 | Frequency: 433920000 4 | Preset: FuriHalSubGhzPresetOok650Async 5 | Protocol: KeeLoq 6 | Bit: 64 7 | Key: 17 6A ED 5F AB 97 72 14 8 | -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/sub/k-dh-sn84EE9D5-cnt0043.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz Key File 2 | Version: 1 3 | Frequency: 433920000 4 | Preset: FuriHalSubGhzPresetOok650Async 5 | Protocol: KeeLoq 6 | Bit: 64 7 | Key: 82 70 AD 05 AB 97 72 14 8 | -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/sub/k-dh-sn84EE9D5-cnt3E90.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz Key File 2 | Version: 1 3 | Frequency: 433920000 4 | Preset: FuriHalSubGhzPresetOok650Async 5 | Protocol: KeeLoq 6 | Bit: 64 7 | Key: D7 60 F6 78 AB 97 72 14 8 | -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/sub/k-dh-sn84EE9D5-cntEC01.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz Key File 2 | Version: 1 3 | Frequency: 433920000 4 | Preset: FuriHalSubGhzPresetOok650Async 5 | Protocol: KeeLoq 6 | Bit: 64 7 | Key: A4 F2 F4 F7 AB 97 72 14 8 | -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/sub/k-dh-sn84EE9D5-cntEC02.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz Key File 2 | Version: 1 3 | Frequency: 433920000 4 | Preset: FuriHalSubGhzPresetOok650Async 5 | Protocol: KeeLoq 6 | Bit: 64 7 | Key: B9 26 02 C7 AB 97 72 14 8 | -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/sub/k-dh-sn84EE9D5-cntEC03.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz Key File 2 | Version: 1 3 | Frequency: 433920000 4 | Preset: FuriHalSubGhzPresetOok650Async 5 | Protocol: KeeLoq 6 | Bit: 64 7 | Key: 19 A1 2A D9 AB 97 72 14 8 | -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/sub/k-dh-sn84EE9D5-cntXXXX.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz Key File 2 | Version: 1 3 | Frequency: 433920000 4 | Preset: FuriHalSubGhzPresetOok650Async 5 | Protocol: KeeLoq 6 | Bit: 64 7 | Key: C0 02 8A 33 AB 97 72 14 8 | -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/sub/k-kgb-sn84E9D5-cntEC0D.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz Key File 2 | Version: 1 3 | Frequency: 433920000 4 | Preset: FuriHalSubGhzPresetOok650Async 5 | Protocol: KeeLoq 6 | Bit: 64 7 | Key: AD 04 58 7A AB 97 72 14 8 | -------------------------------------------------------------------------------- /subghz/apps/rolling-flaws/sub/k-unknown-sn84EE9D5-hop6A2C4803.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz Key File 2 | Version: 1 3 | Frequency: 433920000 4 | Preset: FuriHalSubGhzPresetOok650Async 5 | Protocol: KeeLoq 6 | Bit: 64 7 | Key: C0 12 34 56 AB 97 72 14 8 | -------------------------------------------------------------------------------- /subghz/apps/signal_send_demo/app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/signal_send_demo/app.png -------------------------------------------------------------------------------- /subghz/apps/signal_send_demo/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="my_app_aug_22_2023", 3 | name="Signal Send Demo", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="signal_send_demo_app", 6 | stack_size=4 * 1024, 7 | requires=[ 8 | "gui", 9 | "subghz", 10 | ], 11 | order=10, 12 | fap_icon="app.png", 13 | fap_category="Sub-GHz", 14 | fap_icon_assets="assets", 15 | ) 16 | -------------------------------------------------------------------------------- /subghz/apps/signal_send_demo/assets/glyph_1_7x9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/apps/signal_send_demo/assets/glyph_1_7x9.png -------------------------------------------------------------------------------- /subghz/apps/signal_send_demo/nice_flo.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | void send_nice_flo(uint32_t key, uint32_t frequency); -------------------------------------------------------------------------------- /subghz/apps/signal_send_demo/nice_flo.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz Key File 2 | Version: 1 3 | Frequency: 433920000 4 | Preset: FuriHalSubGhzPresetOok650Async 5 | Protocol: Nice FLO 6 | Bit: 12 7 | Key: 00 00 00 00 00 00 0D A1 8 | -------------------------------------------------------------------------------- /subghz/apps/signal_send_demo/princeton.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | void send_princeton(uint32_t key, uint32_t frequency); -------------------------------------------------------------------------------- /subghz/apps/signal_send_demo/princeton.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz Key File 2 | Version: 1 3 | Frequency: 433920000 4 | Preset: FuriHalSubGhzPresetOok650Async 5 | Protocol: Princeton 6 | Bit: 24 7 | Key: 00 00 00 00 00 96 7A B4 8 | TE: 390 9 | -------------------------------------------------------------------------------- /subghz/apps/signal_send_demo/tag.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #define TAG "MyAppId" -------------------------------------------------------------------------------- /subghz/fmf_to_sub/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="fmf_to_sub", 3 | name="Music to Sub-GHz Radio", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="fmf_to_sub_app", 6 | stack_size=4 * 1024, 7 | requires=[ 8 | "gui", 9 | ], 10 | order=10, 11 | fap_version="1.2", 12 | fap_icon="fmf.png", 13 | fap_category="Sub-GHz", 14 | fap_icon_assets="assets", 15 | fap_description="Converts Flipper music files (.FMF and .TXT) into Sub-GHz files (.SUB).", 16 | ) 17 | -------------------------------------------------------------------------------- /subghz/fmf_to_sub/assets/fmf_10x10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/fmf_to_sub/assets/fmf_10x10.png -------------------------------------------------------------------------------- /subghz/fmf_to_sub/fmf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/fmf_to_sub/fmf.png -------------------------------------------------------------------------------- /subghz/fmf_to_sub/gallery/00-main-menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/fmf_to_sub/gallery/00-main-menu.png -------------------------------------------------------------------------------- /subghz/fmf_to_sub/gallery/01-about1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/fmf_to_sub/gallery/01-about1.png -------------------------------------------------------------------------------- /subghz/fmf_to_sub/gallery/02-about2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/fmf_to_sub/gallery/02-about2.png -------------------------------------------------------------------------------- /subghz/fmf_to_sub/gallery/03-configure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/fmf_to_sub/gallery/03-configure.png -------------------------------------------------------------------------------- /subghz/fmf_to_sub/gallery/04-convert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/fmf_to_sub/gallery/04-convert.png -------------------------------------------------------------------------------- /subghz/fmf_to_sub/gallery/05-file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/fmf_to_sub/gallery/05-file.png -------------------------------------------------------------------------------- /subghz/fmf_to_sub/gallery/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 1.2 2 | - Improved timing of notes 3 | 4 | ## 1.1 5 | - Bug fix: super fast notes/pauses causing SUB file to fail. 6 | - Repro... A-Team:d=4,o=5,b=125:4d#6,8a#,2d#6,16p,8g#,4a#,4d#.,8p,16g,16a#,8d#6,8a#,8f6,2d#6,16p,8c#.6,16c6,16a#,8g#.,2a# 7 | 8 | ## 1.0 9 | - Initial release 10 | - Converts FMF or TXT files to SUB format 11 | - Outputs file: SD Card/subghz/flip##.sub -------------------------------------------------------------------------------- /subghz/fmf_to_sub/rick.fmf: -------------------------------------------------------------------------------- 1 | Filetype: Flipper Music Format 2 | Version: 0 3 | BPM: 120 4 | Duration: 4 5 | Octave: 4 6 | Notes: 8F#., 8F#., 4E, 16A3, 16B3, 16D, 16B3, 8E., 8E., 8D., 16C#, 8B3, 16A3, 16B3, 16D, 16C#, 4D, 8E, 8C#., 16B3, 16A3, 8A3, 8A3, 4E, 2D, 16A3, 16B3, 16D, 16B3, 8F#., 8F#., 4E., 16A3, 16B3, 16D, 16B3, 4A, 8C#, 8D., 16C#, 8B3, 16A3, 16B3, 16D, 16B3 7 | -------------------------------------------------------------------------------- /subghz/fmf_to_sub/rick.txt: -------------------------------------------------------------------------------- 1 | Rick : d=4,o=4,b=120:8F#., 8F#., 4E, 16A3, 16B3, 16D, 16B3, 8E., 8E., 8D., 16C#, 8B3, 16A3, 16B3, 16D, 16C#, 4D, 8E, 8C#., 16B3, 16A3, 8A3, 8A3, 4E, 2D, 16A3, 16B3, 16D, 16B3, 8F#., 8F#., 4E., 16A3, 16B3, 16D, 16B3, 4A, 8C#, 8D., 16C#, 8B3, 16A3, 16B3, 16D, 16B3 -------------------------------------------------------------------------------- /subghz/plugins/README.md: -------------------------------------------------------------------------------- 1 | # Sub-GHz Plugins 2 | Add new applications to your Flipper Zero that utilize the Sub-GHz protocol. 3 | 4 | - [Subghz demo](./subghz_demo/README.md) is a tutorial to demonstrate how to add Sub-GHz support into your own applications. 5 | - [Rock Paper Scissors](./rock_paper_scissors/README.md) is a two-player game that utilizes the Sub-GHz chat protocol. -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/.flipcorg/README.md: -------------------------------------------------------------------------------- 1 | This is a multiplayer adaptation of the classic rock-paper-scissors game—you need at least two devices to play the game. 2 | 3 | Select "Host game" from the Main menu to allow your opponent to connect using the "Join game" option. Once the Sub-Ghz connection is established, you can start the battle. 4 | 5 | On your Flipper Zero, press the OK button twice and then press one of three buttons: 6 | 7 | - The Up button to select a rock. 8 | - The Right button to select paper. 9 | - The Down button to select scissors. 10 | 11 | Rock beats scissors, scissors beat paper, and paper beats rock. 12 | 13 | Wins and losses stats are available in the app, as well as the ability to change your name for games. 14 | 15 | -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/.flipcorg/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/.flipcorg/banner.png -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/.flipcorg/gallery/game-over.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/.flipcorg/gallery/game-over.png -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/.flipcorg/gallery/host-game.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/.flipcorg/gallery/host-game.png -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/.flipcorg/gallery/join-game.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/.flipcorg/gallery/join-game.png -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/.flipcorg/gallery/lost.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/.flipcorg/gallery/lost.png -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/.flipcorg/gallery/main-menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/.flipcorg/gallery/main-menu.png -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/.flipcorg/gallery/past-games.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/.flipcorg/gallery/past-games.png -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/.flipcorg/gallery/playing-game.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/.flipcorg/gallery/playing-game.png -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/.flipcorg/gallery/share-github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/.flipcorg/gallery/share-github.png -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/.flipcorg/gallery/share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/.flipcorg/gallery/share.png -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/.flipcorg/gallery/win.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/.flipcorg/gallery/win.png -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="rock_paper_scissors", 3 | name="Rock Paper Scissors", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="rock_paper_scissors_app", 6 | requires=["gui", "subghz"], 7 | stack_size=2 * 1024, 8 | fap_version=(1, 5), 9 | fap_icon="rock_paper_scissors.png", 10 | fap_icon_assets="images", 11 | fap_icon_assets_symbol="rock_paper_scissors", 12 | fap_category="Games", 13 | fap_author="jamisonderek", 14 | fap_description="Play the rock-paper-scissors game with your friends using the Flipper Zero Sub-GHz radio!", 15 | fap_weburl="https://github.com/jamisonderek/flipper-zero-tutorials/blob/main/subghz/plugins/rock_paper_scissors/README.md", 16 | ) 17 | -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/images/BLE_Pairing_128x64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/images/BLE_Pairing_128x64.png -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/images/DolphinCommon_56x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/images/DolphinCommon_56x48.png -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/images/DolphinNice_96x59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/images/DolphinNice_96x59.png -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/images/DolphinReadingSuccess_59x63.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/images/DolphinReadingSuccess_59x63.png -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/images/Local_Count.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/images/Local_Count.png -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/images/Local_Looking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/images/Local_Looking.png -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/images/Local_Paper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/images/Local_Paper.png -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/images/Local_Ready.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/images/Local_Ready.png -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/images/Local_Rock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/images/Local_Rock.png -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/images/Local_Scissors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/images/Local_Scissors.png -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/images/Remote_Count.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/images/Remote_Count.png -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/images/Remote_Paper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/images/Remote_Paper.png -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/images/Remote_Ready.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/images/Remote_Ready.png -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/images/Remote_Rock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/images/Remote_Rock.png -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/images/Remote_Scissors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/images/Remote_Scissors.png -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/images/WarningDolphin_45x42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/images/WarningDolphin_45x42.png -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/prebuilt/v1.0/official-firmware/rc-0.80.0/Rock_Paper_Scissors.fap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/prebuilt/v1.0/official-firmware/rc-0.80.0/Rock_Paper_Scissors.fap -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/prebuilt/v1.0/official-firmware/release-0.79.1/Rock_Paper_Scissors.fap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/prebuilt/v1.0/official-firmware/release-0.79.1/Rock_Paper_Scissors.fap -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/prebuilt/v1.0/official-firmware/release-0.80.1/Rock_Paper_Scissors.fap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/prebuilt/v1.0/official-firmware/release-0.80.1/Rock_Paper_Scissors.fap -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/prebuilt/win.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/prebuilt/win.png -------------------------------------------------------------------------------- /subghz/plugins/rock_paper_scissors/rock_paper_scissors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/rock_paper_scissors/rock_paper_scissors.png -------------------------------------------------------------------------------- /subghz/plugins/subghz_demo/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="subghz_demo", 3 | name="Subghz Demo", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="subghz_demo_app", 6 | requires=["gui", "subghz"], 7 | stack_size=2 * 1024, 8 | fap_icon="subghz_demo.png", 9 | fap_category="Misc", 10 | ) 11 | -------------------------------------------------------------------------------- /subghz/plugins/subghz_demo/subghz_demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/plugins/subghz_demo/subghz_demo.png -------------------------------------------------------------------------------- /subghz/protocols/README.md: -------------------------------------------------------------------------------- 1 | # Sub-GHz Protocols 2 | Extend the Sub-GHz "Read" feature of your Flipper with the ability to support new protocols. 3 | 4 | - [X10](./x10/README.md) support for x10.com devices. -------------------------------------------------------------------------------- /subghz/protocols/x10/protocol_items.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "../registry.h" 3 | 4 | #include "princeton.h" 5 | #include "keeloq.h" 6 | #include "star_line.h" 7 | #include "nice_flo.h" 8 | #include "came.h" 9 | #include "faac_slh.h" 10 | #include "nice_flor_s.h" 11 | #include "came_twee.h" 12 | #include "came_atomo.h" 13 | #include "nero_sketch.h" 14 | #include "ido.h" 15 | #include "kia.h" 16 | #include "hormann.h" 17 | #include "nero_radio.h" 18 | #include "somfy_telis.h" 19 | #include "somfy_keytis.h" 20 | #include "scher_khan.h" 21 | #include "gate_tx.h" 22 | #include "raw.h" 23 | #include "linear.h" 24 | #include "secplus_v2.h" 25 | #include "secplus_v1.h" 26 | #include "megacode.h" 27 | #include "holtek.h" 28 | #include "chamberlain_code.h" 29 | #include "power_smart.h" 30 | #include "marantec.h" 31 | #include "bett.h" 32 | #include "doitrand.h" 33 | #include "phoenix_v2.h" 34 | #include "honeywell_wdb.h" 35 | #include "magellan.h" 36 | #include "intertechno_v3.h" 37 | #include "clemsa.h" 38 | #include "ansonic.h" 39 | #include "smc5326.h" 40 | #include "holtek_ht12x.h" 41 | #include "x10.h" 42 | 43 | extern const SubGhzProtocolRegistry subghz_protocol_registry; 44 | -------------------------------------------------------------------------------- /subghz/protocols/x10/x10-codes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/protocols/x10/x10-codes.png -------------------------------------------------------------------------------- /subghz/protocols/x10/x10-details.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/protocols/x10/x10-details.png -------------------------------------------------------------------------------- /subghz/rolling/lm/Security1.0 and 2.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/subghz/rolling/lm/Security1.0 and 2.0.png -------------------------------------------------------------------------------- /subghz/samples/chevy-hhr-2006/README.md: -------------------------------------------------------------------------------- 1 | # Chevy HHR 2006 Remote 2 | 3 | ## Device 4 | These Flipper Zero subghz captures are from the remote control for my Chevy HHR 2006 vehicle. This remote operates at 3151MHz. The remote has 3 buttons, but I only captured the lock and unlock codes. The order of the button presses are the number of the file (so I did lock, unlock, lock, lock, etc.) 5 | 6 | 7 | ## Notes 8 | The remote is using a rolling code scheme. My goal is not to decode the rolling code, but rather to detect when the vehicle is locked and unlocked. 9 | 10 | I haven't spent any time looking at the raw files yet. -------------------------------------------------------------------------------- /subghz/samples/genie-girud-1t/G0001.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz Key File 2 | Version: 1 3 | Frequency: 315000000 4 | Preset: FuriHalSubGhzPresetOok650Async 5 | Protocol: Genie 6 | Bit: 64 7 | Key: 97 A3 8C 95 00 7F 19 91 8 | -------------------------------------------------------------------------------- /subghz/samples/genie-girud-1t/G0002.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz Key File 2 | Version: 1 3 | Frequency: 315000000 4 | Preset: FuriHalSubGhzPresetOok650Async 5 | Protocol: Genie 6 | Bit: 64 7 | Key: 67 9B B4 2E 00 7F 19 91 8 | -------------------------------------------------------------------------------- /subghz/samples/modulation/433am.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz RAW File 2 | Version: 1 3 | Frequency: 434176948 4 | Preset: FuriHalSubGhzPresetOok650Async 5 | Protocol: RAW 6 | RAW_Data: 200 -200 200 -200 200 -200 200 -200 200 -200 200 -200 200 -200 200 -200 200 -200 200 -200 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 600 -1200 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 600 -1200 600 -1200 1200 -600 600 -1200 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 600 -1200 600 -1200 600 -1200 1200 -600 600 -1200 1200 -600 600 -1200 600 -1200 600 -1200 1200 -600 600 -1200 1200 -600 1200 -600 1200 -600 600 -1200 600 -1200 1200 -600 600 -15000 200 -200 7 | -------------------------------------------------------------------------------- /subghz/samples/modulation/433fm-wide.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz RAW File 2 | Version: 1 3 | Frequency: 434176948 4 | Preset: FuriHalSubGhzPresetCustom 5 | Custom_preset_module: CC1101 6 | Custom_preset_data: 02 0D 0B 06 08 32 07 04 14 00 13 02 12 04 11 83 10 67 15 64 18 18 19 16 1D 91 1C 00 1B 07 20 FB 22 10 21 56 00 00 C0 00 00 00 00 00 00 00 7 | Protocol: RAW 8 | RAW_Data: 200 -200 200 -200 200 -200 200 -200 200 -200 200 -200 200 -200 200 -200 200 -200 200 -200 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 600 -1200 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 600 -1200 600 -1200 1200 -600 600 -1200 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 600 -1200 600 -1200 600 -1200 1200 -600 600 -1200 1200 -600 600 -1200 600 -1200 600 -1200 1200 -600 600 -1200 1200 -600 1200 -600 1200 -600 600 -1200 600 -1200 1200 -600 600 -15000 200 -200 -------------------------------------------------------------------------------- /subghz/samples/modulation/433fm.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz RAW File 2 | Version: 1 3 | Frequency: 434176948 4 | Preset: FuriHalSubGhzPreset2FSKDev476Async 5 | Protocol: RAW 6 | RAW_Data: 200 -200 200 -200 200 -200 200 -200 200 -200 200 -200 200 -200 200 -200 200 -200 200 -200 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 600 -1200 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 600 -1200 600 -1200 1200 -600 600 -1200 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 600 -1200 600 -1200 600 -1200 1200 -600 600 -1200 1200 -600 600 -1200 600 -1200 600 -1200 1200 -600 600 -1200 1200 -600 1200 -600 1200 -600 600 -1200 600 -1200 1200 -600 600 -15000 200 -200 -------------------------------------------------------------------------------- /subghz/samples/modulation/433gfsk-wide.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz RAW File 2 | Version: 1 3 | Frequency: 434176948 4 | Preset: FuriHalSubGhzPresetCustom 5 | Custom_preset_module: CC1101 6 | Custom_preset_data: 02 0D 0B 06 08 32 07 04 14 00 13 02 12 14 11 83 10 67 15 64 18 18 19 16 1D 91 1C 00 1B 07 20 FB 22 10 21 56 00 00 C0 00 00 00 00 00 00 00 7 | Protocol: RAW 8 | RAW_Data: 200 -200 200 -200 200 -200 200 -200 200 -200 200 -200 200 -200 200 -200 200 -200 200 -200 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 600 -1200 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 600 -1200 600 -1200 1200 -600 600 -1200 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 600 -1200 600 -1200 600 -1200 1200 -600 600 -1200 1200 -600 600 -1200 600 -1200 600 -1200 1200 -600 600 -1200 1200 -600 1200 -600 1200 -600 600 -1200 600 -1200 1200 -600 600 -15000 200 -200 9 | -------------------------------------------------------------------------------- /subghz/samples/modulation/433gfsk.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz RAW File 2 | Version: 1 3 | Frequency: 434176948 4 | Preset: FuriHalSubGhzPresetCustom 5 | Custom_preset_module: CC1101 6 | Custom_preset_data: 02 0D 0B 06 08 32 07 04 14 00 13 02 12 14 11 83 10 67 15 47 18 18 19 16 1D 91 1C 00 1B 07 20 FB 22 10 21 56 00 00 C0 00 00 00 00 00 00 00 7 | Protocol: RAW 8 | RAW_Data: 200 -200 200 -200 200 -200 200 -200 200 -200 200 -200 200 -200 200 -200 200 -200 200 -200 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 600 -1200 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 600 -1200 600 -1200 1200 -600 600 -1200 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 1200 -600 600 -1200 600 -1200 600 -1200 1200 -600 600 -1200 1200 -600 600 -1200 600 -1200 600 -1200 1200 -600 600 -1200 1200 -600 1200 -600 1200 -600 600 -1200 600 -1200 1200 -600 600 -15000 200 -200 9 | -------------------------------------------------------------------------------- /subghz/samples/modulation/README.md: -------------------------------------------------------------------------------- 1 | # Modulation 2 | The following .SUB files have the same data encoded with various modulations. I found it helpful to load the various .SUB files and play them with a Flipper Zero to an SDR to visually understand how the data looks when viewed with an SDR application. -------------------------------------------------------------------------------- /subghz/samples/quantum-fire/Princeton_a1.sub: -------------------------------------------------------------------------------- 1 | Filetype: Flipper SubGhz Key File 2 | Version: 1 3 | Frequency: 433920000 4 | Preset: FuriHalSubGhzPresetOok650Async 5 | Protocol: Princeton 6 | Bit: 24 7 | Key: 00 00 00 00 00 65 4A A1 8 | TE: 382 9 | -------------------------------------------------------------------------------- /subghz/samples/x10/README.md: -------------------------------------------------------------------------------- 1 | # X10 2 | ## About 3 | [X10 Automation](https://www.x10.com/) is a home automation system. 4 | 5 | 6 | ## Device 7 | These Flipper Zero subghz captures are from the remote control for the X10. This remote operates at 310MHz. There is a channel dial (A-P) and there are 8 buttons labeled ON and 8 buttons labeld OFF. There is a slider switch that gives buttons 9-16 instead of 1-8. There is a up button (bright) and a down button (dim). 8 | 9 | - Model CR12A x10.com 10 | - FCC ID: [b4ssr12a](https://fccid.io/b4ssr12a) 11 | 12 | - Radio Shack 61-2663T (Remote 2) 13 | - FCC ID: [b4s61-2663t](https://fccid.io/b4s61-2663t) 14 | 15 | 16 | ## Hardware 17 | NOTE: As an Amazon Affiliate I (CodeAllNight) may earn from qualifying purchases from the amzn.to links below. 18 | 19 | The signals were captured from the "X10 Camera Control System Remote Control Model CR12A" which you can purchase from https://amzn.to/3issZPs and should also be compatible with signals from https://amzn.to/3QEF7cM (but the timing may be slightly different). 20 | 21 | The receiver I used is no longer for sale, but a similar module can be purchased from https://amzn.to/3CFWy6M 22 | -------------------------------------------------------------------------------- /ui/basic_scenes/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="basic_scenes", 3 | name="Basic Scenes Demo", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="basic_scenes_app", 6 | requires=["gui"], 7 | stack_size=2 * 1024, 8 | fap_icon="basic_scenes.png", 9 | fap_category="Misc", 10 | ) -------------------------------------------------------------------------------- /ui/basic_scenes/basic_scenes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/ui/basic_scenes/basic_scenes.png -------------------------------------------------------------------------------- /ui/basic_scenes/docs/app-diagram.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/ui/basic_scenes/docs/app-diagram.jpg -------------------------------------------------------------------------------- /ui/basic_scenes/docs/app-greeting-input.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/ui/basic_scenes/docs/app-greeting-input.png -------------------------------------------------------------------------------- /ui/basic_scenes/docs/app-greeting-message.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/ui/basic_scenes/docs/app-greeting-message.png -------------------------------------------------------------------------------- /ui/basic_scenes/docs/app-hour-glass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/ui/basic_scenes/docs/app-hour-glass.png -------------------------------------------------------------------------------- /ui/basic_scenes/docs/app-installed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/ui/basic_scenes/docs/app-installed.png -------------------------------------------------------------------------------- /ui/basic_scenes/docs/app-lotto.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/ui/basic_scenes/docs/app-lotto.png -------------------------------------------------------------------------------- /ui/basic_scenes/docs/app-menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/ui/basic_scenes/docs/app-menu.png -------------------------------------------------------------------------------- /ui/basic_scenes/docs/create-app-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/ui/basic_scenes/docs/create-app-icon.png -------------------------------------------------------------------------------- /ui/basic_scenes/docs/create-directory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/ui/basic_scenes/docs/create-directory.png -------------------------------------------------------------------------------- /ui/basic_scenes_split/README.md: -------------------------------------------------------------------------------- 1 | # Scenes Demo Application Tutorial 2 | 3 | This is an exampe similar to [Basic_Scenes](https://github.com/jamisonderek/flipper-zero-tutorials/tree/main/ui/basic_scenes) but with the files broken out into separate .c and .h files. 4 | 5 | - The ``static`` keyword is used on functions that do not need to be visible beyond their own .c file. 6 | - ``#pragma once`` is used to prevent the header file from being imported multiple times. 7 | - We don't use the typical ``typedef struct App App`` pattern in ``basic_scenes_split.h`` because the various scenes access properties of the ``App`` object. 8 | -------------------------------------------------------------------------------- /ui/basic_scenes_split/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="basic_scenes_split", 3 | name="Basic Scenes Demo", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="basic_scenes_split_app", 6 | requires=["gui"], 7 | stack_size=2 * 1024, 8 | fap_icon="basic_scenes.png", 9 | fap_category="Misc", 10 | ) 11 | -------------------------------------------------------------------------------- /ui/basic_scenes_split/basic_scenes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/ui/basic_scenes_split/basic_scenes.png -------------------------------------------------------------------------------- /ui/basic_scenes_split/basic_scenes_split.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | typedef enum { 10 | BasicScenesMainMenuSceneLottoNumbers, 11 | BasicScenesMainMenuSceneGreeting, 12 | } BasicScenesMainMenuSceneIndex; 13 | 14 | typedef enum { 15 | BasicScenesSubmenuView, 16 | BasicScenesWidgetView, 17 | BasicScenesTextInputView, 18 | } BasicScenesView; 19 | 20 | typedef enum { 21 | BasicScenesMainMenuScene, 22 | BasicScenesLotteryScene, 23 | BasicScenesGreetingInputScene, 24 | BasicScenesGreetingMessageScene, 25 | BasicScenesSceneCount, 26 | } BasicScenesScene; 27 | 28 | typedef struct App { 29 | SceneManager* scene_manager; 30 | ViewDispatcher* view_dispatcher; 31 | Submenu* submenu; 32 | Widget* widget; 33 | TextInput* text_input; 34 | char* user_name; 35 | uint8_t user_name_size; 36 | } App; -------------------------------------------------------------------------------- /ui/basic_scenes_split/basic_scenes_split_i.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "main_menu.h" 4 | #include "greeting_input.h" 5 | #include "greeting_message.h" 6 | #include "lottery.h" 7 | -------------------------------------------------------------------------------- /ui/basic_scenes_split/greeting_input.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | void basic_scenes_greeting_input_scene_on_enter(void* context); 6 | bool basic_scenes_greeting_input_scene_on_event(void* context, SceneManagerEvent event); 7 | void basic_scenes_greeting_input_scene_on_exit(void* context); -------------------------------------------------------------------------------- /ui/basic_scenes_split/greeting_message.c: -------------------------------------------------------------------------------- 1 | #include "basic_scenes_split.h" 2 | 3 | void basic_scenes_greeting_message_scene_on_enter(void* context) { 4 | App* app = context; 5 | widget_reset(app->widget); 6 | FuriString* message = furi_string_alloc(); 7 | furi_string_printf(message, "Hello,\n%s!", app->user_name); 8 | widget_add_string_multiline_element( 9 | app->widget, 5, 15, AlignLeft, AlignCenter, FontPrimary, furi_string_get_cstr(message)); 10 | furi_string_free(message); 11 | view_dispatcher_switch_to_view(app->view_dispatcher, BasicScenesWidgetView); 12 | } 13 | 14 | bool basic_scenes_greeting_message_scene_on_event(void* context, SceneManagerEvent event) { 15 | UNUSED(context); 16 | UNUSED(event); 17 | return false; // event not handled. 18 | } 19 | 20 | void basic_scenes_greeting_message_scene_on_exit(void* context) { 21 | App* app = context; 22 | widget_reset(app->widget); 23 | } -------------------------------------------------------------------------------- /ui/basic_scenes_split/greeting_message.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | void basic_scenes_greeting_message_scene_on_enter(void* context); 6 | bool basic_scenes_greeting_message_scene_on_event(void* context, SceneManagerEvent event); 7 | void basic_scenes_greeting_message_scene_on_exit(void* context); -------------------------------------------------------------------------------- /ui/basic_scenes_split/lottery.c: -------------------------------------------------------------------------------- 1 | #include "basic_scenes_split.h" 2 | 3 | void basic_scenes_lottery_scene_on_enter(void* context) { 4 | App* app = context; 5 | widget_reset(app->widget); 6 | widget_add_string_element( 7 | app->widget, 25, 15, AlignLeft, AlignCenter, FontPrimary, "Lotto numbers:"); 8 | widget_add_string_element( 9 | app->widget, 30, 35, AlignLeft, AlignCenter, FontBigNumbers, "0 4 2"); 10 | view_dispatcher_switch_to_view(app->view_dispatcher, BasicScenesWidgetView); 11 | } 12 | 13 | bool basic_scenes_lottery_scene_on_event(void* context, SceneManagerEvent event) { 14 | UNUSED(context); 15 | UNUSED(event); 16 | return false; // event not handled. 17 | } 18 | 19 | void basic_scenes_lottery_scene_on_exit(void* context) { 20 | UNUSED(context); 21 | } -------------------------------------------------------------------------------- /ui/basic_scenes_split/lottery.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | void basic_scenes_lottery_scene_on_enter(void* context); 6 | bool basic_scenes_lottery_scene_on_event(void* context, SceneManagerEvent event); 7 | void basic_scenes_lottery_scene_on_exit(void* context); -------------------------------------------------------------------------------- /ui/basic_scenes_split/main_menu.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | void basic_scenes_main_menu_scene_on_enter(void* context); 6 | bool basic_scenes_main_menu_scene_on_event(void* context, SceneManagerEvent event); 7 | void basic_scenes_main_menu_scene_on_exit(void* context); -------------------------------------------------------------------------------- /ui/lucky/README.md: -------------------------------------------------------------------------------- 1 | # Scenes Demo Application Tutorial 2 | 3 | See [https://youtu.be/vQAk7fC_no4](https://youtu.be/vQAk7fC_no4) for a code walkthrough! 4 | 5 | This is an example similar to [Basic_Scenes](https://github.com/jamisonderek/flipper-zero-tutorials/tree/main/ui/basic_scenes) but with the files broken out into separate .c and .h files. 6 | 7 | - The ``static`` keyword is used on functions that do not need to be visible beyond their own .c file. 8 | - ``#pragma once`` is used to prevent the header file from being imported multiple times. 9 | - We don't use the typical ``typedef struct App App`` pattern in ``basic_scenes_split.h`` because the various scenes access properties of the ``App`` object. 10 | -------------------------------------------------------------------------------- /ui/lucky/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="lucky", 3 | name="Lucky SceneManager Demo", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="lucky_app", 6 | requires=["gui"], 7 | stack_size=2 * 1024, 8 | fap_icon="lucky.png", 9 | fap_category="Misc", 10 | fap_description="An example of using a SceneManager to switch between scenes.", 11 | ) 12 | -------------------------------------------------------------------------------- /ui/lucky/lucky.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/ui/lucky/lucky.png -------------------------------------------------------------------------------- /ui/lucky/lucky_app.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | typedef enum { 4 | LuckySceneMainMenu, 5 | LuckySceneLottery, 6 | LuckySceneGreetingInput, 7 | LuckySceneGreetingMessage, 8 | LuckySceneNum, 9 | } LuckyScene; 10 | 11 | typedef enum { 12 | LuckyViewSubmenu, 13 | LuckyViewWidget, 14 | LuckyViewTextInput, 15 | LuckyViewNum, 16 | } LuckyView; 17 | -------------------------------------------------------------------------------- /ui/lucky/lucky_app_i.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "lucky_app.h" 4 | 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | 11 | #include "lucky_scene_main_menu.h" 12 | #include "lucky_scene_greeting_input.h" 13 | #include "lucky_scene_greeting_message.h" 14 | #include "lucky_scene_lottery.h" 15 | 16 | typedef struct LuckyApp LuckyApp; 17 | struct LuckyApp { 18 | SceneManager* scene_manager; 19 | ViewDispatcher* view_dispatcher; 20 | Submenu* submenu; 21 | Widget* widget; 22 | TextInput* text_input; 23 | char* user_name; 24 | uint8_t user_name_size; 25 | }; 26 | -------------------------------------------------------------------------------- /ui/lucky/lucky_scene_greeting_input.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | void lucky_scene_greeting_input_on_enter(void* context); 6 | bool lucky_scene_greeting_input_on_event(void* context, SceneManagerEvent event); 7 | void lucky_scene_greeting_input_on_exit(void* context); 8 | -------------------------------------------------------------------------------- /ui/lucky/lucky_scene_greeting_message.c: -------------------------------------------------------------------------------- 1 | #include "lucky_app_i.h" 2 | #include "lucky_scene_greeting_message.h" 3 | 4 | void lucky_scene_greeting_message_on_enter(void* context) { 5 | LuckyApp* app = context; 6 | widget_reset(app->widget); 7 | FuriString* message = furi_string_alloc(); 8 | furi_string_printf(message, "I wish you luck\n%s!", app->user_name); 9 | widget_add_string_multiline_element( 10 | app->widget, 5, 15, AlignLeft, AlignCenter, FontPrimary, furi_string_get_cstr(message)); 11 | furi_string_free(message); 12 | view_dispatcher_switch_to_view(app->view_dispatcher, LuckyViewWidget); 13 | } 14 | 15 | bool lucky_scene_greeting_message_on_event(void* context, SceneManagerEvent event) { 16 | UNUSED(context); 17 | UNUSED(event); 18 | return false; // event not handled. 19 | } 20 | 21 | void lucky_scene_greeting_message_on_exit(void* context) { 22 | LuckyApp* app = context; 23 | widget_reset(app->widget); 24 | } -------------------------------------------------------------------------------- /ui/lucky/lucky_scene_greeting_message.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | void lucky_scene_greeting_message_on_enter(void* context); 6 | bool lucky_scene_greeting_message_on_event(void* context, SceneManagerEvent event); 7 | void lucky_scene_greeting_message_on_exit(void* context); 8 | -------------------------------------------------------------------------------- /ui/lucky/lucky_scene_lottery.c: -------------------------------------------------------------------------------- 1 | #include "lucky_app_i.h" 2 | #include "lucky_scene_lottery.h" 3 | #include "furi_hal_random.h" 4 | 5 | void lucky_scene_lottery_on_enter(void* context) { 6 | LuckyApp* app = context; 7 | widget_reset(app->widget); 8 | widget_add_string_element( 9 | app->widget, 25, 15, AlignLeft, AlignCenter, FontPrimary, "Lotto numbers:"); 10 | FuriString* message = furi_string_alloc(); 11 | furi_hal_random_init(); 12 | furi_string_printf(message, "%ld %ld %ld", furi_hal_random_get() % 10, furi_hal_random_get() % 10, 13 | furi_hal_random_get() % 10); 14 | widget_add_string_element( 15 | app->widget, 30, 35, AlignLeft, AlignCenter, FontBigNumbers, furi_string_get_cstr(message)); 16 | furi_string_free(message); 17 | view_dispatcher_switch_to_view(app->view_dispatcher, LuckyViewWidget); 18 | } 19 | 20 | bool lucky_scene_lottery_on_event(void* context, SceneManagerEvent event) { 21 | UNUSED(context); 22 | UNUSED(event); 23 | return false; // event not handled. 24 | } 25 | 26 | void lucky_scene_lottery_on_exit(void* context) { 27 | UNUSED(context); 28 | } -------------------------------------------------------------------------------- /ui/lucky/lucky_scene_lottery.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | void lucky_scene_lottery_on_enter(void* context); 6 | bool lucky_scene_lottery_on_event(void* context, SceneManagerEvent event); 7 | void lucky_scene_lottery_on_exit(void* context); 8 | -------------------------------------------------------------------------------- /ui/lucky/lucky_scene_main_menu.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | void lucky_scene_main_menu_on_enter(void* context); 6 | bool lucky_scene_main_menu_on_event(void* context, SceneManagerEvent event); 7 | void lucky_scene_main_menu_on_exit(void* context); 8 | -------------------------------------------------------------------------------- /ui/lucky_bestpractices/README.md: -------------------------------------------------------------------------------- 1 | # Scenes Demo Application Tutorial 2 | 3 | See [https://youtu.be/vQAk7fC_no4](https://youtu.be/vQAk7fC_no4) for a code walkthrough! 4 | 5 | This is an example similar to [Basic_Scenes](https://github.com/jamisonderek/flipper-zero-tutorials/tree/main/ui/basic_scenes) but with the files broken out into separate .c and .h files. 6 | 7 | - The ``static`` keyword is used on functions that do not need to be visible beyond their own .c file. 8 | - ``#pragma once`` is used to prevent the header file from being imported multiple times. 9 | - We don't use the typical ``typedef struct App App`` pattern in ``basic_scenes_split.h`` because the various scenes access properties of the ``App`` object. 10 | -------------------------------------------------------------------------------- /ui/lucky_bestpractices/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="lucky", 3 | name="Lucky SceneManager Demo", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="lucky_app", 6 | requires=["gui"], 7 | stack_size=2 * 1024, 8 | fap_icon="lucky.png", 9 | fap_category="Misc", 10 | fap_description="An example of using a SceneManager to switch between scenes.", 11 | ) 12 | -------------------------------------------------------------------------------- /ui/lucky_bestpractices/lucky.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/ui/lucky_bestpractices/lucky.png -------------------------------------------------------------------------------- /ui/lucky_bestpractices/lucky_app.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | typedef enum { 4 | LuckyViewSubmenu, 5 | LuckyViewWidget, 6 | LuckyViewTextInput, 7 | LuckyViewNum, 8 | } LuckyView; 9 | -------------------------------------------------------------------------------- /ui/lucky_bestpractices/lucky_app_i.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "lucky_app.h" 4 | 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | 11 | #include "scenes/lucky_scene.h" 12 | 13 | typedef struct LuckyApp LuckyApp; 14 | struct LuckyApp { 15 | SceneManager* scene_manager; 16 | ViewDispatcher* view_dispatcher; 17 | Submenu* submenu; 18 | Widget* widget; 19 | TextInput* text_input; 20 | char* user_name; 21 | uint8_t user_name_size; 22 | }; 23 | -------------------------------------------------------------------------------- /ui/lucky_bestpractices/scenes/lucky_scene.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | // Generate scene id and total number 6 | #define ADD_SCENE(prefix, name, id) LuckyScene##id, 7 | typedef enum { 8 | #include "lucky_scene_config.h" 9 | LuckySceneNum, 10 | } LuckyScene; 11 | #undef ADD_SCENE 12 | 13 | extern const SceneManagerHandlers lucky_scene_handlers; 14 | 15 | // Generate scene on_enter handlers declaration 16 | #define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_enter(void*); 17 | #include "lucky_scene_config.h" 18 | #undef ADD_SCENE 19 | 20 | // Generate scene on_event handlers declaration 21 | #define ADD_SCENE(prefix, name, id) \ 22 | bool prefix##_scene_##name##_on_event(void* context, SceneManagerEvent event); 23 | #include "lucky_scene_config.h" 24 | #undef ADD_SCENE 25 | 26 | // Generate scene on_exit handlers declaration 27 | #define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_exit(void* context); 28 | #include "lucky_scene_config.h" 29 | #undef ADD_SCENE 30 | -------------------------------------------------------------------------------- /ui/lucky_bestpractices/scenes/lucky_scene_config.h: -------------------------------------------------------------------------------- 1 | ADD_SCENE(lucky, main_menu, MainMenu) 2 | ADD_SCENE(lucky, lottery, Lottery) 3 | ADD_SCENE(lucky, greeting_input, GreetingInput) 4 | ADD_SCENE(lucky, greeting_message, GreetingMessage) 5 | -------------------------------------------------------------------------------- /ui/lucky_bestpractices/scenes/lucky_scene_greeting_message.c: -------------------------------------------------------------------------------- 1 | #include "lucky_app_i.h" 2 | 3 | void lucky_scene_greeting_message_on_enter(void* context) { 4 | LuckyApp* app = context; 5 | widget_reset(app->widget); 6 | FuriString* message = furi_string_alloc(); 7 | furi_string_printf(message, "I wish you luck\n%s!", app->user_name); 8 | widget_add_string_multiline_element( 9 | app->widget, 5, 15, AlignLeft, AlignCenter, FontPrimary, furi_string_get_cstr(message)); 10 | furi_string_free(message); 11 | view_dispatcher_switch_to_view(app->view_dispatcher, LuckyViewWidget); 12 | } 13 | 14 | bool lucky_scene_greeting_message_on_event(void* context, SceneManagerEvent event) { 15 | UNUSED(context); 16 | UNUSED(event); 17 | return false; // event not handled. 18 | } 19 | 20 | void lucky_scene_greeting_message_on_exit(void* context) { 21 | LuckyApp* app = context; 22 | widget_reset(app->widget); 23 | } -------------------------------------------------------------------------------- /ui/lucky_bestpractices/scenes/lucky_scene_lottery.c: -------------------------------------------------------------------------------- 1 | #include "lucky_app_i.h" 2 | #include "furi_hal_random.h" 3 | 4 | void lucky_scene_lottery_on_enter(void* context) { 5 | LuckyApp* app = context; 6 | widget_reset(app->widget); 7 | widget_add_string_element( 8 | app->widget, 25, 15, AlignLeft, AlignCenter, FontPrimary, "Lotto numbers:"); 9 | FuriString* message = furi_string_alloc(); 10 | furi_hal_random_init(); 11 | furi_string_printf(message, "%ld %ld %ld", furi_hal_random_get() % 10, furi_hal_random_get() % 10, 12 | furi_hal_random_get() % 10); 13 | widget_add_string_element( 14 | app->widget, 30, 35, AlignLeft, AlignCenter, FontBigNumbers, furi_string_get_cstr(message)); 15 | furi_string_free(message); 16 | view_dispatcher_switch_to_view(app->view_dispatcher, LuckyViewWidget); 17 | } 18 | 19 | bool lucky_scene_lottery_on_event(void* context, SceneManagerEvent event) { 20 | UNUSED(context); 21 | UNUSED(event); 22 | return false; // event not handled. 23 | } 24 | 25 | void lucky_scene_lottery_on_exit(void* context) { 26 | UNUSED(context); 27 | } -------------------------------------------------------------------------------- /ui/skeleton_app/app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/ui/skeleton_app/app.png -------------------------------------------------------------------------------- /ui/skeleton_app/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="skeleton_app", 3 | name="[WIP] Skeleton Sample App", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="main_skeleton_app", 6 | stack_size=4 * 1024, 7 | requires=[ 8 | "gui", 9 | ], 10 | order=10, 11 | fap_icon="app.png", 12 | fap_category="GPIO", 13 | fap_icon_assets="assets", 14 | fap_description="Skeleton Sample App. This is intended to be used as a starting point for new applications with one primary screen.", 15 | ) 16 | -------------------------------------------------------------------------------- /ui/skeleton_app/assets/glyph_1_14x40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/ui/skeleton_app/assets/glyph_1_14x40.png -------------------------------------------------------------------------------- /ui/viewdispatcher_demo/README.md: -------------------------------------------------------------------------------- 1 | # viewdispatcher demo 2 | This is a UI demo of the ViewDispatcher class. It is based off the wiki code for the [ViewDispatcher] (https://github.com/jamisonderek/flipper-zero-tutorials/wiki/User-Interface#viewdispatcher) section of the User-Interface page. 3 | 4 | The two [View](https://github.com/jamisonderek/flipper-zero-tutorials/wiki/User-Interface#view) objects registers draw and input callbacks and set different screen orientations. 5 | 6 | The draw callback does some basic text drawing on a [Canvas](https://github.com/jamisonderek/flipper-zero-tutorials/wiki/User-Interface#canvas). 7 | 8 | The input callback changes the X and Y position of a cursor "^" based on the key that is pressed. You can see that when the ViewPort orientation is rotated, both the screen and the keypress is translated automatically. Pressing the back button uses a [Message Queue](https://github.com/jamisonderek/flipper-zero-tutorials/wiki/Message-Queue) to signal that application should exit. Pressing OK button switches the [View](https://github.com/jamisonderek/flipper-zero-tutorials/wiki/User-Interface#view). 9 | -------------------------------------------------------------------------------- /ui/viewdispatcher_demo/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="viewdispatcher_demo", 3 | name="ViewDispatcher demo", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="viewdispatcher_demo_app", 6 | cdefines=["VIEWDISPATCHER_DEMO_APP"], 7 | requires=[ 8 | "gui", 9 | ], 10 | stack_size=2 * 1024, 11 | order=100, 12 | fap_description = "ViewDispatcher demo", 13 | fap_author = "codeallnight", 14 | fap_weburl = "https://github.com/jamisonderek/Flipper-Zero-tutorials", 15 | fap_category="UI", 16 | fap_icon="icon.png", 17 | fap_libs=["assets"], 18 | ) -------------------------------------------------------------------------------- /ui/viewdispatcher_demo/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/ui/viewdispatcher_demo/icon.png -------------------------------------------------------------------------------- /ui/viewport_demo/README.md: -------------------------------------------------------------------------------- 1 | # viewport demo 2 | This is a UI demo of the ViewPort class. It is based off the wiki code for the [ViewPort] https://github.com/jamisonderek/flipper-zero-tutorials/wiki/User-Interface#viewport section of the User-Interface page. 3 | 4 | The draw callback does some basic text drawing on a [Canvas](https://github.com/jamisonderek/flipper-zero-tutorials/wiki/User-Interface#canvas). 5 | 6 | The input callback changes the X and Y position of a cursor "^" based on the key that is pressed. You can see that when the ViewPort orientation is rotated, both the screen and the keypress is translated automatically. Pressing the back button uses a [Message Queue](https://github.com/jamisonderek/flipper-zero-tutorials/wiki/Message-Queue) to signal that application should exit. 7 | -------------------------------------------------------------------------------- /ui/viewport_demo/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="viewport_demo", 3 | name="Viewport demo", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="viewport_demo_timer_app", 6 | cdefines=["VIEWPORT_DEMO_APP"], 7 | requires=[ 8 | "gui", 9 | ], 10 | stack_size=2 * 1024, 11 | order=100, 12 | fap_description="Viewport demo", 13 | fap_author="codeallnight", 14 | fap_weburl="https://github.com/jamisonderek/Flipper-Zero-tutorials", 15 | fap_category="UI", 16 | fap_icon="icon.png", 17 | ) 18 | -------------------------------------------------------------------------------- /ui/viewport_demo/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/ui/viewport_demo/icon.png -------------------------------------------------------------------------------- /vgm/air_level/.catalog/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 1.0 2 | - Initial release 3 | -------------------------------------------------------------------------------- /vgm/air_level/.catalog/README.md: -------------------------------------------------------------------------------- 1 | # Air Level 2 | 3 | ## Overview 4 | This is a simple level that can use the motion-tracking sensor of the Video Game Module. 5 | 6 | ## Building 7 | - Clone your firmware (`git clone --recursive https://github.com/flipperdevices/flipperzero-firmware.git`) 8 | - Copy the air_level project into your firmware's applications_user folder. 9 | - Connect your Flipper Zero (make sure qFlipper and lab.flipper.net are NOT running) 10 | - Build & deploy your firmware (`fbt COMPACT=1 DEBUG=0 FORCE=1 flash_usb_full`) 11 | 12 | ## Credits 13 | - This started with the Air Arkanoid game. Edited by @CodeAllNight. 14 | - Idea by @human_tool 15 | - The [Flipper Zero Game Engine](https://github.com/flipperdevices/flipperzero-game-engine) was copied instead of using as a submodule. 16 | 17 | ## Support 18 | Contact me on Discord (@CodeAllNight) 19 | -------------------------------------------------------------------------------- /vgm/air_level/.catalog/screenshots/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/vgm/air_level/.catalog/screenshots/1.png -------------------------------------------------------------------------------- /vgm/air_level/README.md: -------------------------------------------------------------------------------- 1 | # Air Level 2 | 3 | ## Overview 4 | This is a simple level that can use the motion-tracking sensor of the Video Game Module. 5 | 6 | ## Building 7 | - Clone your firmware (`git clone --recursive https://github.com/flipperdevices/flipperzero-firmware.git`) 8 | - Copy the air_level project into your firmware's applications_user folder. 9 | - Connect your Flipper Zero (make sure qFlipper and lab.flipper.net are NOT running) 10 | - Build & deploy your firmware (`fbt COMPACT=1 DEBUG=0 FORCE=1 flash_usb_full`) 11 | 12 | ## Credits 13 | - This started with the Air Arkanoid game. Edited by @CodeAllNight. 14 | - Idea by @human_tool 15 | - The [Flipper Zero Game Engine](https://github.com/flipperdevices/flipperzero-game-engine) was copied instead of using as a submodule. 16 | 17 | ## Support 18 | Contact me on Discord (@CodeAllNight) 19 | -------------------------------------------------------------------------------- /vgm/air_level/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="air_level", 3 | name="Air Level", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="game_app", 6 | stack_size=4 * 1024, 7 | fap_icon="icon.png", 8 | fap_category="tools", 9 | fap_file_assets="assets", 10 | fap_description="Flipper Level using the Video Game Module motion sensor", 11 | fap_version="1.0", 12 | fap_extbuild=( 13 | ExtFile( 14 | path="${FAP_SRC_DIR}/assets", 15 | command="${PYTHON3} ${FAP_SRC_DIR}/engine/scripts/sprite_builder.py ${FAP_SRC_DIR.abspath}/sprites ${TARGET.abspath}/sprites", 16 | ), 17 | ), 18 | ) 19 | -------------------------------------------------------------------------------- /vgm/air_level/engine/README.md: -------------------------------------------------------------------------------- 1 | # Flipper Zero Game Engine 2 | 3 | Welcome to the Flipper Zero game engine! This engine is designed to help you create games for the Flipper Zero device. 4 | 5 | ## Example App 6 | 7 | To see the game engine in action, check out our [example app](https://github.com/flipperdevices/flipperzero-game-engine-example). This app demonstrates how to use the game engine to create a simple game. 8 | 9 | ## Contributing 10 | 11 | We welcome contributions to the Flipper Zero game engine! If you have any bug reports, feature requests, or pull requests, please submit them to the [official repository](https://github.com/flipperdevices/flipperzero-game-engine). 12 | 13 | Happy game development with Flipper Zero! 14 | -------------------------------------------------------------------------------- /vgm/air_level/engine/canvas.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include "canvas.h" 3 | 4 | void canvas_printf(Canvas* canvas, uint8_t x, uint8_t y, const char* format, ...) { 5 | FuriString* string = furi_string_alloc(); 6 | va_list args; 7 | va_start(args, format); 8 | furi_string_vprintf(string, format, args); 9 | va_end(args); 10 | 11 | canvas_draw_str(canvas, x, y, furi_string_get_cstr(string)); 12 | 13 | furi_string_free(string); 14 | } 15 | 16 | size_t canvas_printf_width(Canvas* canvas, const char* format, ...) { 17 | FuriString* string = furi_string_alloc(); 18 | va_list args; 19 | va_start(args, format); 20 | furi_string_vprintf(string, format, args); 21 | va_end(args); 22 | 23 | size_t size = canvas_string_width(canvas, furi_string_get_cstr(string)); 24 | 25 | furi_string_free(string); 26 | 27 | return size; 28 | } -------------------------------------------------------------------------------- /vgm/air_level/engine/canvas.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | 5 | #ifdef __cplusplus 6 | extern "C" { 7 | #endif 8 | 9 | /** 10 | * @brief Print formatted string to canvas 11 | * 12 | * @param canvas canvas instance 13 | * @param x x position 14 | * @param y y position 15 | * @param format format string 16 | * @param ... arguments 17 | */ 18 | void canvas_printf(Canvas* canvas, uint8_t x, uint8_t y, const char* format, ...); 19 | 20 | /** 21 | * @brief Get width of formatted string 22 | * 23 | * @param canvas canvas instance 24 | * @param format format string 25 | * @param ... arguments 26 | * @return size_t width of formatted string 27 | */ 28 | size_t canvas_printf_width(Canvas* canvas, const char* format, ...); 29 | 30 | #ifdef __cplusplus 31 | } 32 | #endif 33 | -------------------------------------------------------------------------------- /vgm/air_level/engine/clock_timer.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #ifdef __cplusplus 4 | extern "C" { 5 | #endif 6 | 7 | typedef void (*ClockTimerCallback)(void* context); 8 | 9 | void clock_timer_start(ClockTimerCallback callback, void* context, float period); 10 | 11 | void clock_timer_stop(void); 12 | 13 | #ifdef __cplusplus 14 | } 15 | #endif -------------------------------------------------------------------------------- /vgm/air_level/engine/engine.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include "game_engine.h" 4 | #include "level.h" 5 | #include "entity.h" 6 | #include "game_manager.h" 7 | 8 | #ifdef __cplusplus 9 | extern "C" { 10 | #endif 11 | 12 | typedef struct { 13 | float target_fps; 14 | bool show_fps; 15 | bool always_backlight; 16 | void (*start)(GameManager* game_manager, void* context); 17 | void (*stop)(void* context); 18 | size_t context_size; 19 | } Game; 20 | 21 | extern const Game game; 22 | 23 | #ifdef __cplusplus 24 | } 25 | #endif -------------------------------------------------------------------------------- /vgm/air_level/engine/game_manager_i.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "game_manager.h" 3 | 4 | #ifdef __cplusplus 5 | extern "C" { 6 | #endif 7 | 8 | GameManager* game_manager_alloc(void); 9 | 10 | void game_manager_free(GameManager* manager); 11 | 12 | void game_manager_update(GameManager* manager); 13 | 14 | void game_manager_render(GameManager* manager, Canvas* canvas); 15 | 16 | void game_manager_engine_set(GameManager* manager, GameEngine* engine); 17 | 18 | void game_manager_input_set(GameManager* manager, InputState input); 19 | 20 | void game_manager_game_context_set(GameManager* manager, void* context); 21 | 22 | #ifdef __cplusplus 23 | } 24 | #endif -------------------------------------------------------------------------------- /vgm/air_level/engine/level_i.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "level.h" 3 | 4 | #ifdef __cplusplus 5 | extern "C" { 6 | #endif 7 | 8 | Level* level_alloc(const LevelBehaviour* behaviour, GameManager* manager); 9 | 10 | void level_free(Level* level); 11 | 12 | void level_update(Level* level, GameManager* manager); 13 | 14 | void level_render(Level* level, GameManager* manager, Canvas* canvas); 15 | 16 | void level_call_alloc(Level* level); 17 | 18 | void level_call_free(Level* level); 19 | 20 | void level_call_start(Level* level); 21 | 22 | void level_call_stop(Level* level); 23 | 24 | #ifdef __cplusplus 25 | } 26 | #endif -------------------------------------------------------------------------------- /vgm/air_level/engine/sensors/imu.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | typedef struct Imu Imu; 4 | 5 | Imu* imu_alloc(void); 6 | 7 | void imu_free(Imu* imu); 8 | 9 | bool imu_present(Imu* imu); 10 | 11 | float imu_pitch_get(Imu* imu); 12 | 13 | float imu_roll_get(Imu* imu); 14 | 15 | float imu_yaw_get(Imu* imu); -------------------------------------------------------------------------------- /vgm/air_level/engine/sprite.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | #include 5 | 6 | #ifdef __cplusplus 7 | extern "C" { 8 | #endif 9 | 10 | typedef struct Sprite Sprite; 11 | 12 | /** Sprite allocator 13 | * @return Sprite* Sprite instance or NULL, if failed 14 | */ 15 | Sprite* sprite_alloc(const char* path); 16 | 17 | /** Sprite deallocator 18 | * @param sprite Sprite instance 19 | */ 20 | void sprite_free(Sprite* sprite); 21 | 22 | /** Get sprite width 23 | * @param sprite Sprite instance 24 | * @return size_t sprite width 25 | */ 26 | size_t sprite_get_width(Sprite* sprite); 27 | 28 | /** Get sprite height 29 | * @param sprite Sprite instance 30 | * @return size_t sprite height 31 | */ 32 | size_t sprite_get_height(Sprite* sprite); 33 | 34 | /** Draw sprite on canvas 35 | * @param canvas Canvas instance 36 | * @param sprite Sprite instance 37 | * @param x x coordinate 38 | * @param y y coordinate 39 | */ 40 | void canvas_draw_sprite(Canvas* canvas, Sprite* sprite, int32_t x, int32_t y); 41 | 42 | #ifdef __cplusplus 43 | } 44 | #endif -------------------------------------------------------------------------------- /vgm/air_level/engine/vector.c: -------------------------------------------------------------------------------- 1 | #include "vector.h" 2 | 3 | Vector vector_add(Vector a, Vector b) { 4 | return (Vector){.x = a.x + b.x, .y = a.y + b.y}; 5 | } 6 | 7 | Vector vector_sub(Vector a, Vector b) { 8 | return (Vector){.x = a.x - b.x, .y = a.y - b.y}; 9 | } 10 | 11 | Vector vector_mul(Vector a, Vector b) { 12 | return (Vector){.x = a.x * b.x, .y = a.y * b.y}; 13 | } 14 | 15 | Vector vector_div(Vector a, Vector b) { 16 | return (Vector){.x = a.x / b.x, .y = a.y / b.y}; 17 | } 18 | 19 | Vector vector_addf(Vector a, float b) { 20 | return (Vector){.x = a.x + b, .y = a.y + b}; 21 | } 22 | 23 | Vector vector_subf(Vector a, float b) { 24 | return (Vector){.x = a.x - b, .y = a.y - b}; 25 | } 26 | 27 | Vector vector_mulf(Vector a, float b) { 28 | return (Vector){.x = a.x * b, .y = a.y * b}; 29 | } 30 | 31 | Vector vector_divf(Vector a, float b) { 32 | return (Vector){.x = a.x / b, .y = a.y / b}; 33 | } -------------------------------------------------------------------------------- /vgm/air_level/engine/vector.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #ifdef __cplusplus 4 | extern "C" { 5 | #endif 6 | 7 | typedef struct { 8 | float x; 9 | float y; 10 | } Vector; 11 | 12 | #define VECTOR_ZERO ((Vector){0, 0}) 13 | 14 | Vector vector_add(Vector a, Vector b); 15 | 16 | Vector vector_sub(Vector a, Vector b); 17 | 18 | Vector vector_mul(Vector a, Vector b); 19 | 20 | Vector vector_div(Vector a, Vector b); 21 | 22 | Vector vector_addf(Vector a, float b); 23 | 24 | Vector vector_subf(Vector a, float b); 25 | 26 | Vector vector_mulf(Vector a, float b); 27 | 28 | Vector vector_divf(Vector a, float b); 29 | 30 | #ifdef __cplusplus 31 | } 32 | #endif -------------------------------------------------------------------------------- /vgm/air_level/game.c: -------------------------------------------------------------------------------- 1 | #include "game.h" 2 | #include "levels/level_imu.h" 3 | 4 | void game_start(GameManager* game_manager, void* ctx) { 5 | GameContext* context = ctx; 6 | context->imu = imu_alloc(); 7 | context->imu_present = imu_present(context->imu); 8 | context->level = game_manager_add_level(game_manager, &level_imu); 9 | context->game_manager = game_manager; 10 | game_manager_show_fps_set(context->game_manager, false); 11 | } 12 | 13 | void game_stop(void* ctx) { 14 | GameContext* context = ctx; 15 | imu_free(context->imu); 16 | } 17 | 18 | const Game game = { 19 | .target_fps = 30, 20 | .show_fps = false, 21 | .always_backlight = true, 22 | .start = game_start, 23 | .stop = game_stop, 24 | .context_size = sizeof(GameContext), 25 | }; 26 | -------------------------------------------------------------------------------- /vgm/air_level/game.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "engine/engine.h" 3 | #include "engine/sensors/imu.h" 4 | 5 | typedef struct { 6 | Imu* imu; 7 | bool imu_present; 8 | Level* level; 9 | GameManager* game_manager; 10 | } GameContext; 11 | -------------------------------------------------------------------------------- /vgm/air_level/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/vgm/air_level/icon.png -------------------------------------------------------------------------------- /vgm/air_level/levels/level_imu.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "../game.h" 3 | 4 | extern const LevelBehaviour level_imu; 5 | -------------------------------------------------------------------------------- /vgm/apps/air_labyrinth/.catalog/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 0.1 2 | - Initial release 3 | -------------------------------------------------------------------------------- /vgm/apps/air_labyrinth/.catalog/README.md: -------------------------------------------------------------------------------- 1 | # Air Labyrinth 2 | 3 | This is a simple game where you have to navigate a ball through a maze. The game is controlled by tilting the Flipper Zero with a Video Game Module attached. You can also play the game using the Flipper Zero's d-pad. 4 | 5 | ## How to play 6 | 7 | 1. Attach the video game module to the Flipper Zero. 8 | 2. Open the Air Labyrinth game (Apps/Games/Air Labyrinth). 9 | 3. Tilt the Flipper Zero to move the ball through the maze. 10 | 11 | ## Version history 12 | - 0.1.0 - Initial release by @CodeAllNight (https://youtube.com/@MrDerekJamison/about) 13 | 14 | 15 | ## Other 16 | 17 | This game was made based on the [air_arkanoid](https://github.com/flipperdevices/flipperzero-good-faps/tree/dev/air_arkanoid) and [flipperzero-game-engine-example](https://github.com/flipperdevices/flipperzero-game-engine-example) projects. Thanks to the authors of these projects for the inspiration and the code. -------------------------------------------------------------------------------- /vgm/apps/air_labyrinth/.catalog/screenshots/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/vgm/apps/air_labyrinth/.catalog/screenshots/1.png -------------------------------------------------------------------------------- /vgm/apps/air_labyrinth/.gitignore: -------------------------------------------------------------------------------- 1 | assets/sprites/* -------------------------------------------------------------------------------- /vgm/apps/air_labyrinth/.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "engine"] 2 | path = engine 3 | url = https://github.com/flipperdevices/flipperzero-game-engine.git 4 | -------------------------------------------------------------------------------- /vgm/apps/air_labyrinth/README.md: -------------------------------------------------------------------------------- 1 | # Air Labyrinth 2 | 3 | ![Air Labyrinth](./.catalog/screenshots/1.png) 4 | 5 | This is a simple game where you have to navigate a ball through a maze. The game is controlled by tilting the Flipper Zero with a Video Game Module attached. You can also play the game using the Flipper Zero's d-pad. 6 | 7 | ## How to play 8 | 9 | 1. Attach the video game module to the Flipper Zero. 10 | 2. Open the Air Labyrinth game (`Apps`/`Games`/`Air Labyrinth`). 11 | 3. Tilt the Flipper Zero to move the ball through the maze. 12 | 13 | ## Version history 14 | - 0.1.0 - Initial release by @CodeAllNight (https://youtube.com/@MrDerekJamison/about) 15 | 16 | 17 | ## Other 18 | 19 | This game was made based on the [air_arkanoid](https://github.com/flipperdevices/flipperzero-good-faps/tree/dev/air_arkanoid) and [flipperzero-game-engine-example](https://github.com/flipperdevices/flipperzero-game-engine-example) projects. Thanks to the authors of these projects for the inspiration and the code. -------------------------------------------------------------------------------- /vgm/apps/air_labyrinth/application.fam: -------------------------------------------------------------------------------- 1 | App( 2 | appid="air_labyrinth", 3 | name="Air Labyrinth", 4 | apptype=FlipperAppType.EXTERNAL, 5 | entry_point="game_app", 6 | stack_size=4 * 1024, # Game stack, change accordingly 7 | fap_icon="icon.png", 8 | fap_category="Games", 9 | fap_description="Labyrinth game v0.1 that supports the Video Game Module motion sensor. Written by @CodeAllNight (https://youtube.com/MrDerekJamison/about)", 10 | fap_weburl="https://github.com/jamisonderek/flipper-zero-tutorials/tree/main/vgm/apps/air_labyrinth", 11 | fap_author="@CodeAllNight (MrDerekJamison)", 12 | fap_version="0.1", 13 | fap_file_assets="assets", # Do not touch this and the next line, it is needed to generate sprites 14 | # fap_extbuild=( 15 | # ExtFile( 16 | # path="${FAP_SRC_DIR}/assets", 17 | # command="${PYTHON3} ${FAP_SRC_DIR}/engine/scripts/sprite_builder.py ${FAP_SRC_DIR.abspath}/sprites ${TARGET.abspath}/sprites", 18 | # ), 19 | # ), 20 | ) 21 | -------------------------------------------------------------------------------- /vgm/apps/air_labyrinth/assets/sprites/player.fxbm: -------------------------------------------------------------------------------- 1 |  2 | 3 | (P -------------------------------------------------------------------------------- /vgm/apps/air_labyrinth/game.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "engine/engine.h" 3 | #include "engine/sensors/imu.h" 4 | 5 | typedef struct { 6 | Imu* imu; 7 | bool imu_present; 8 | uint32_t score; 9 | } GameContext; 10 | -------------------------------------------------------------------------------- /vgm/apps/air_labyrinth/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/vgm/apps/air_labyrinth/icon.png -------------------------------------------------------------------------------- /vgm/apps/air_labyrinth/sprites/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/vgm/apps/air_labyrinth/sprites/.gitkeep -------------------------------------------------------------------------------- /vgm/apps/air_labyrinth/sprites/player.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/vgm/apps/air_labyrinth/sprites/player.png -------------------------------------------------------------------------------- /vgm/apps/air_labyrinth/walls.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | typedef struct { 5 | bool horizontal; 6 | int x; 7 | int y; 8 | int length; 9 | } Wall; 10 | 11 | #define WALL(h, y, x, l) \ 12 | (Wall) { \ 13 | h, x * 2, y * 2, l \ 14 | } 15 | 16 | Wall walls[] = { 17 | WALL(true, 12, 0, 3), WALL(false, 3, 3, 17), WALL(false, 23, 3, 6), 18 | WALL(true, 3, 4, 57), WALL(true, 28, 4, 56), WALL(false, 4, 7, 5), 19 | WALL(false, 12, 7, 13), WALL(true, 8, 8, 34), WALL(true, 12, 8, 42), 20 | WALL(true, 24, 8, 8), WALL(true, 16, 11, 8), WALL(false, 17, 11, 4), 21 | WALL(true, 20, 12, 22), WALL(false, 6, 17, 2), WALL(true, 24, 19, 15), 22 | WALL(true, 16, 22, 16), WALL(false, 4, 24, 1), WALL(false, 21, 28, 2), 23 | WALL(false, 6, 33, 2), WALL(false, 13, 34, 3), WALL(false, 17, 37, 11), 24 | WALL(true, 16, 41, 14), WALL(false, 20, 41, 5), WALL(true, 20, 45, 12), 25 | WALL(true, 24, 45, 12), WALL(false, 4, 46, 2), WALL(false, 9, 46, 3), 26 | WALL(false, 6, 50, 3), WALL(true, 12, 53, 7), WALL(true, 8, 54, 6), 27 | WALL(false, 4, 60, 19), WALL(false, 26, 60, 6), 28 | }; 29 | -------------------------------------------------------------------------------- /vgm/imu_controller/flipper-pitch-roll-yaw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamisonderek/flipper-zero-tutorials/17a4238df955c21a3816b944618ae936710bfa58/vgm/imu_controller/flipper-pitch-roll-yaw.png --------------------------------------------------------------------------------