├── LICENSE ├── README.md ├── data ├── PRESET_PID.txt.gz ├── betaflight.html.gz ├── changelog.html.gz ├── content │ ├── advanced.html.gz │ ├── configuration.html.gz │ ├── data_output.html.gz │ ├── rates.html.gz │ ├── tpa.html.gz │ └── welcome.html.gz ├── images │ ├── btn-donate.png.gz │ ├── cf.png.gz │ ├── mixer │ │ ├── 0.png.gz │ │ ├── 1.png.gz │ │ ├── 2.png.gz │ │ ├── 3.png.gz │ │ ├── 4.png.gz │ │ ├── 5.png.gz │ │ └── 6.png.gz │ ├── moto │ │ ├── custom.svg.gz │ │ ├── quad_x.svg.gz │ │ └── tri.svg.gz │ ├── position.png.gz │ ├── triangleArrowDown.gif │ ├── triangleArrowUp.gif │ ├── warning_stripe.png.gz │ └── welcome.jpg.gz ├── ind │ ├── altitude_pressure.svg.gz │ ├── altitude_ticks.svg.gz │ ├── fi_box.svg.gz │ ├── fi_circle.svg.gz │ ├── fi_needle.svg.gz │ ├── fi_needle_small.svg.gz │ ├── fi_tc_airplane.svg.gz │ ├── heading_mechanics.svg.gz │ ├── heading_yaw.svg.gz │ ├── horizon_back.svg.gz │ ├── horizon_ball.svg.gz │ ├── horizon_circle.svg.gz │ ├── horizon_mechanics.svg.gz │ ├── speed_mechanics.svg.gz │ ├── turn_coordinator.svg.gz │ └── vertical_mechanics.svg.gz ├── index.html.gz ├── kiss.html.gz ├── models │ ├── fallback.json.gz │ ├── quad_x.json.gz │ └── tricopter.json.gz ├── osd │ ├── bold.mcm.gz │ ├── default.mcm.gz │ └── large.mcm.gz └── tabs │ ├── adjustments.html.gz │ ├── auxiliary.html.gz │ ├── blank.html.gz │ ├── cli.html.gz │ ├── configuration.html.gz │ ├── failsafe.html.gz │ ├── gps.html.gz │ ├── help.html.gz │ ├── landing.html.gz │ ├── led_strip.html.gz │ ├── map.html.gz │ ├── motors.html.gz │ ├── onboard_logging.html.gz │ ├── options.html.gz │ ├── osd.html.gz │ ├── pid_tuning.html.gz │ ├── ports.html.gz │ ├── receiver.html.gz │ ├── review.html.gz │ ├── sensors.html.gz │ ├── servos.html.gz │ ├── setup.html.gz │ └── transponder.html.gz ├── doc ├── esp8266fcgui.jpg ├── ide_settings.png ├── mac_browser.png ├── mobile_bf.PNG ├── mobile_bf2.PNG ├── mobile_bf3.PNG ├── mobile_index.PNG ├── win_browser.png └── win_network.png ├── esp8266fcgui.ino ├── fc_config.h └── websrc ├── bf ├── LICENSE ├── README.md ├── betaflight.html ├── changelog.html ├── css │ ├── dropdown-lists │ │ ├── LICENSE │ │ └── css │ │ │ └── style_lists.css │ └── fonts.css ├── images │ ├── btn-donate.png │ ├── ind │ │ ├── altitude_pressure.svg │ │ ├── altitude_ticks.svg │ │ ├── fi_box.svg │ │ ├── fi_circle.svg │ │ ├── fi_needle.svg │ │ ├── fi_needle_small.svg │ │ ├── fi_tc_airplane.svg │ │ ├── heading_mechanics.svg │ │ ├── heading_yaw.svg │ │ ├── horizon_back.svg │ │ ├── horizon_ball.svg │ │ ├── horizon_circle.svg │ │ ├── horizon_mechanics.svg │ │ ├── speed_mechanics.svg │ │ ├── turn_coordinator.svg │ │ └── vertical_mechanics.svg │ ├── moto │ │ ├── custom.svg │ │ ├── quad_x.svg │ │ └── tri.svg │ └── position.png ├── js │ ├── Features.js │ ├── RateCurve.js │ ├── boards.js │ ├── data_storage.js │ ├── fc.js │ ├── gui.js │ ├── injected_methods.js │ ├── libraries │ │ ├── bluebird.min.js │ │ ├── d3.min.js │ │ ├── flightindicators.css │ │ ├── inflection.min.js │ │ ├── jbox │ │ │ ├── jBox.css │ │ │ ├── jBox.min.js │ │ │ └── themes │ │ │ │ ├── ModalBorder.css │ │ │ │ ├── NoticeBorder.css │ │ │ │ ├── TooltipBorder.css │ │ │ │ └── TooltipDark.css │ │ ├── jquery-2.1.4.min.js │ │ ├── jquery-2.1.4.min.map │ │ ├── jquery-ui-1.11.2.min.js │ │ ├── jquery-ui-1.11.4.min.js │ │ ├── jquery.ba-throttle-debounce.min.js │ │ ├── jquery.flightindicators.js │ │ ├── jquery.liblink.js │ │ ├── jquery.nouislider.all.min.js │ │ ├── jquery.nouislider.min.css │ │ ├── jquery.nouislider.pips.min.css │ │ ├── q.js │ │ ├── semver.js │ │ ├── switchery │ │ │ ├── switchery.css │ │ │ └── switchery.js │ │ └── three │ │ │ ├── CanvasRenderer.js │ │ │ ├── Projector.js │ │ │ └── three.min.js │ ├── locale.js │ ├── localization.js │ ├── model.js │ ├── msp.js │ ├── msp │ │ ├── MSPCodes.js │ │ └── MSPHelper.js │ ├── port_handler.js │ ├── port_usage.js │ ├── protocols │ │ └── stm32.js │ ├── serial.js │ ├── serial_backend.js │ └── workers │ │ └── hex_parser.js ├── main.css ├── main.html ├── main.js ├── models │ ├── fallback.json │ ├── fallback.png │ ├── quad_x.json │ └── tricopter.json ├── osd │ ├── bold.mcm │ ├── default.mcm │ └── large.mcm ├── tabs │ ├── adjustments.css │ ├── adjustments.html │ ├── adjustments.js │ ├── auxiliary.css │ ├── auxiliary.html │ ├── auxiliary.js │ ├── blank.html │ ├── cli.css │ ├── cli.html │ ├── cli.js │ ├── configuration.css │ ├── configuration.html │ ├── configuration.js │ ├── failsafe.css │ ├── failsafe.html │ ├── failsafe.js │ ├── gps.css │ ├── gps.html │ ├── gps.js │ ├── help.css │ ├── help.html │ ├── help.js │ ├── landing.css │ ├── landing.html │ ├── landing.js │ ├── led_strip.css │ ├── led_strip.html │ ├── led_strip.js │ ├── map.html │ ├── motors.css │ ├── motors.html │ ├── motors.js │ ├── onboard_logging.css │ ├── onboard_logging.html │ ├── onboard_logging.js │ ├── options.html │ ├── osd.css │ ├── osd.html │ ├── osd.js │ ├── pid_tuning.css │ ├── pid_tuning.html │ ├── pid_tuning.js │ ├── ports.css │ ├── ports.html │ ├── ports.js │ ├── receiver.css │ ├── receiver.html │ ├── receiver.js │ ├── review.html │ ├── sensors.css │ ├── sensors.html │ ├── sensors.js │ ├── servos.css │ ├── servos.html │ ├── servos.js │ ├── setup.css │ ├── setup.html │ ├── setup.js │ ├── transponder.css │ ├── transponder.html │ └── transponder.js └── tmpl │ ├── 1.html │ ├── 2.html │ └── 3.html ├── build.sh ├── index.html └── kiss ├── PRESET_PID.txt ├── content ├── advanced.html ├── advanced.js ├── configuration.css ├── configuration.html ├── configuration.js ├── data_output.css ├── data_output.html ├── data_output.js ├── rates.css ├── rates.html ├── rates.js ├── tpa.css ├── tpa.html ├── tpa.js ├── welcome.css ├── welcome.html └── welcome.js ├── images ├── cf.png ├── mixer │ ├── 0.png │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ └── 6.png ├── triangleArrowDown.gif ├── triangleArrowUp.gif ├── warning_stripe.png └── welcome.jpg ├── js ├── connection_handler.js ├── gui.js ├── input_validation.js ├── libraries │ ├── hex_parser.js │ ├── jquery-2.1.3.min.js │ ├── jquery.minicolors.css │ ├── jquery.minicolors.min.js │ └── three.min.js ├── plugins │ ├── jquery.kiss.aux.css │ ├── jquery.kiss.aux.js │ ├── jquery.kiss.model.js │ ├── jquery.kiss.rates.chart.js │ └── jquery.kiss.tpa.chart.js ├── protocol.js ├── serial.js └── websocket_serial.js ├── main.css ├── main.html ├── main.js └── tmpl ├── 1.html ├── 2.html └── 3.html /README.md: -------------------------------------------------------------------------------- 1 | # ESP8266 FC GUI 2 | KISS and BetaFlight GUI on ESP8266 3 | 4 | ## What is this? 5 | - Simple sketch for ESP8266 Arduino that uses asyncronous networking to provide web and some other services 6 | - Transparent WebSocket <=> UART 7 | - inlined, optimized and gzipped version of [KISSFC_GUI_Dshot_T8](https://www.rcgroups.com/forums/showatt.php?attachmentid=9464379&d=1477306491) 8 | - inlined, optimized and gzipped version of [Betaflight Configurator](https://github.com/betaflight/betaflight-configurator/tree/bcb361cac665b8ba9c4de2d93bdca2944e157dec) 9 | 10 | ## Why did you do this? 11 | - Got really sick of having to carry a laptop to the field, just to change pid or recalibrate something 12 | - ESP8266 has really evolved and is able to take on the load 13 | - Various small ESP8266 based modules are available for close to nothing 14 | - I carry a small computer in the form of smartphone everywhere 15 | - Phone apps lack functionality and lag on implementation 16 | - It's easy to do 17 | 18 | ## I want to try it! 19 | 20 | ### Requirements 21 | - ESP8266 module with at least 4MB flash. [This module](https://www.wemos.cc/product/d1-mini-pro.html) weights 2.5g and is ready to go 22 | - Recent version of [Arduino IDE](https://www.arduino.cc/en/Main/Software) 23 | - Latest [Arduino ESP8266 filesystem uploader](https://github.com/esp8266/arduino-esp8266fs-plugin) plugin installed 24 | - Git version of [ESP8266 Arduino](https://github.com/esp8266/Arduino#using-git-version) 25 | - Git version of [ESPAsyncTCP](https://github.com/me-no-dev/ESPAsyncTCP) 26 | - Git version of [ESPAsyncWebServer](https://github.com/me-no-dev/ESPAsyncWebServer) 27 | 28 | ### Compiling and upload 29 | - Fullfill all requirements above 30 | - Clone or download this repository to your computer 31 | - Sketch ino and folder name MUST match 32 | - Open the ino sketch with Arduino IDE 33 | - Connect the ESP8266 module to your computer via USB 34 | - Edit definitions in ```fc_config.h``` to your liking 35 | - Select the following options for board in Arduino IDE 36 | - Board: Core Development Module 37 | - Flash Mode: QIO or DIO (depends on flash chip type) 38 | - Flash Size: 4M (3M SPIFFS) 39 | - Debug Port: Disabled 40 | - Debug Level: None 41 | - LwIP Variant: Prebuilt Source (gcc) 42 | - Reset Method: ck or nodemcu (depends on ESP module reset circuit) 43 | - Flash Frequency: 80MHz 44 | - CPU Frequency: 160 MHz 45 | - Upload Speed: 115200 (some can do 921600) 46 | - Port: Select the serial port of the ESP module 47 | - Compile and upload the sketch 48 | - From the "Tools" menu, select "ESP8266 Sketch Data Upload" to upload the web contents 49 | - Restart the ESP to apply the new file system image 50 | 51 | ### Cool! Then what? 52 | 53 | #### Connecting the module to your quad 54 | - Select module that can accept 5 volts or get separate LDO to 3.3V for the ESP 55 | - Connect 56 | 1. ESP GND > FC GND 57 | 2. ESP 5V > FC 5V (select pin that is also powered by the USB, if available) 58 | 3. ESP TX > FC RX (UART port that you do not use and have configured for Telemetry/MSP) 59 | 4. ESP RX > FC TX (Same port as above) 60 | 61 | On my KISS quad, I also have OSD, so I use the GUI only when connected through USB to a power bank. 62 | 63 | #### Using the AP defined in ```fc_config.h``` 64 | - Power the ESP module 65 | - Connect to it's Access Point 66 | - Try to open any website. It should forward you to the main page 67 | 68 | #### Using your WiFi at home (```STA_SSID``` must be defined in ```fc_config.h```) 69 | - Power the ESP module 70 | - Windows 71 | - Check for the ESP in the Network Browser and doubliclick it 72 | - Or just open a browser to http://esp8266fcgui (the value of ```AP_SSID``` in ```fc_config.h```) 73 | - Mac and Linux 74 | - Open a browser to http://esp8266fcgui.local (the value of ```AP_SSID``` in ```fc_config.h``` plus ".local") 75 | - The sketch is [Arduino OTA](https://github.com/esp8266/Arduino/blob/master/doc/ota_updates/readme.md#arduino-ide) enabled, which means that when at home, you can update the firmware/file system over WiFi 76 | 77 | ## Credits 78 | All web content is created by the KISS and BetaFlight teams. This a cut-down version of their work. 79 | 80 | ## Screen Shots 81 | 82 | ### Arduino IDE Settings 83 | ![image](doc/ide_settings.png) 84 | 85 | ### Windows 86 | 87 | #### Network Browser 88 | ![image](doc/win_network.png) 89 | 90 | #### Web Browser 91 | ![image](doc/win_browser.png) 92 | 93 | ### Mac and Linux 94 | 95 | #### Web Browser 96 | ![image](doc/mac_browser.png) 97 | 98 | ### Mobile 99 | ![image](doc/mobile_bf.PNG) 100 | ![image](doc/mobile_bf2.PNG) 101 | ![image](doc/mobile_bf3.PNG) 102 | 103 | ### Hardware 104 | ![image](doc/esp8266fcgui.jpg) 105 | 106 | -------------------------------------------------------------------------------- /data/PRESET_PID.txt.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/PRESET_PID.txt.gz -------------------------------------------------------------------------------- /data/betaflight.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/betaflight.html.gz -------------------------------------------------------------------------------- /data/changelog.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/changelog.html.gz -------------------------------------------------------------------------------- /data/content/advanced.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/content/advanced.html.gz -------------------------------------------------------------------------------- /data/content/configuration.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/content/configuration.html.gz -------------------------------------------------------------------------------- /data/content/data_output.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/content/data_output.html.gz -------------------------------------------------------------------------------- /data/content/rates.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/content/rates.html.gz -------------------------------------------------------------------------------- /data/content/tpa.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/content/tpa.html.gz -------------------------------------------------------------------------------- /data/content/welcome.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/content/welcome.html.gz -------------------------------------------------------------------------------- /data/images/btn-donate.png.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/images/btn-donate.png.gz -------------------------------------------------------------------------------- /data/images/cf.png.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/images/cf.png.gz -------------------------------------------------------------------------------- /data/images/mixer/0.png.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/images/mixer/0.png.gz -------------------------------------------------------------------------------- /data/images/mixer/1.png.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/images/mixer/1.png.gz -------------------------------------------------------------------------------- /data/images/mixer/2.png.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/images/mixer/2.png.gz -------------------------------------------------------------------------------- /data/images/mixer/3.png.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/images/mixer/3.png.gz -------------------------------------------------------------------------------- /data/images/mixer/4.png.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/images/mixer/4.png.gz -------------------------------------------------------------------------------- /data/images/mixer/5.png.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/images/mixer/5.png.gz -------------------------------------------------------------------------------- /data/images/mixer/6.png.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/images/mixer/6.png.gz -------------------------------------------------------------------------------- /data/images/moto/custom.svg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/images/moto/custom.svg.gz -------------------------------------------------------------------------------- /data/images/moto/quad_x.svg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/images/moto/quad_x.svg.gz -------------------------------------------------------------------------------- /data/images/moto/tri.svg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/images/moto/tri.svg.gz -------------------------------------------------------------------------------- /data/images/position.png.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/images/position.png.gz -------------------------------------------------------------------------------- /data/images/triangleArrowDown.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/images/triangleArrowDown.gif -------------------------------------------------------------------------------- /data/images/triangleArrowUp.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/images/triangleArrowUp.gif -------------------------------------------------------------------------------- /data/images/warning_stripe.png.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/images/warning_stripe.png.gz -------------------------------------------------------------------------------- /data/images/welcome.jpg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/images/welcome.jpg.gz -------------------------------------------------------------------------------- /data/ind/altitude_pressure.svg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/ind/altitude_pressure.svg.gz -------------------------------------------------------------------------------- /data/ind/altitude_ticks.svg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/ind/altitude_ticks.svg.gz -------------------------------------------------------------------------------- /data/ind/fi_box.svg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/ind/fi_box.svg.gz -------------------------------------------------------------------------------- /data/ind/fi_circle.svg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/ind/fi_circle.svg.gz -------------------------------------------------------------------------------- /data/ind/fi_needle.svg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/ind/fi_needle.svg.gz -------------------------------------------------------------------------------- /data/ind/fi_needle_small.svg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/ind/fi_needle_small.svg.gz -------------------------------------------------------------------------------- /data/ind/fi_tc_airplane.svg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/ind/fi_tc_airplane.svg.gz -------------------------------------------------------------------------------- /data/ind/heading_mechanics.svg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/ind/heading_mechanics.svg.gz -------------------------------------------------------------------------------- /data/ind/heading_yaw.svg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/ind/heading_yaw.svg.gz -------------------------------------------------------------------------------- /data/ind/horizon_back.svg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/ind/horizon_back.svg.gz -------------------------------------------------------------------------------- /data/ind/horizon_ball.svg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/ind/horizon_ball.svg.gz -------------------------------------------------------------------------------- /data/ind/horizon_circle.svg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/ind/horizon_circle.svg.gz -------------------------------------------------------------------------------- /data/ind/horizon_mechanics.svg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/ind/horizon_mechanics.svg.gz -------------------------------------------------------------------------------- /data/ind/speed_mechanics.svg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/ind/speed_mechanics.svg.gz -------------------------------------------------------------------------------- /data/ind/turn_coordinator.svg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/ind/turn_coordinator.svg.gz -------------------------------------------------------------------------------- /data/ind/vertical_mechanics.svg.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/ind/vertical_mechanics.svg.gz -------------------------------------------------------------------------------- /data/index.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/index.html.gz -------------------------------------------------------------------------------- /data/kiss.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/kiss.html.gz -------------------------------------------------------------------------------- /data/models/fallback.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/models/fallback.json.gz -------------------------------------------------------------------------------- /data/models/quad_x.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/models/quad_x.json.gz -------------------------------------------------------------------------------- /data/models/tricopter.json.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/models/tricopter.json.gz -------------------------------------------------------------------------------- /data/osd/bold.mcm.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/osd/bold.mcm.gz -------------------------------------------------------------------------------- /data/osd/default.mcm.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/osd/default.mcm.gz -------------------------------------------------------------------------------- /data/osd/large.mcm.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/osd/large.mcm.gz -------------------------------------------------------------------------------- /data/tabs/adjustments.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/tabs/adjustments.html.gz -------------------------------------------------------------------------------- /data/tabs/auxiliary.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/tabs/auxiliary.html.gz -------------------------------------------------------------------------------- /data/tabs/blank.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/tabs/blank.html.gz -------------------------------------------------------------------------------- /data/tabs/cli.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/tabs/cli.html.gz -------------------------------------------------------------------------------- /data/tabs/configuration.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/tabs/configuration.html.gz -------------------------------------------------------------------------------- /data/tabs/failsafe.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/tabs/failsafe.html.gz -------------------------------------------------------------------------------- /data/tabs/gps.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/tabs/gps.html.gz -------------------------------------------------------------------------------- /data/tabs/help.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/tabs/help.html.gz -------------------------------------------------------------------------------- /data/tabs/landing.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/tabs/landing.html.gz -------------------------------------------------------------------------------- /data/tabs/led_strip.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/tabs/led_strip.html.gz -------------------------------------------------------------------------------- /data/tabs/map.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/tabs/map.html.gz -------------------------------------------------------------------------------- /data/tabs/motors.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/tabs/motors.html.gz -------------------------------------------------------------------------------- /data/tabs/onboard_logging.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/tabs/onboard_logging.html.gz -------------------------------------------------------------------------------- /data/tabs/options.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/tabs/options.html.gz -------------------------------------------------------------------------------- /data/tabs/osd.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/tabs/osd.html.gz -------------------------------------------------------------------------------- /data/tabs/pid_tuning.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/tabs/pid_tuning.html.gz -------------------------------------------------------------------------------- /data/tabs/ports.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/tabs/ports.html.gz -------------------------------------------------------------------------------- /data/tabs/receiver.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/tabs/receiver.html.gz -------------------------------------------------------------------------------- /data/tabs/review.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/tabs/review.html.gz -------------------------------------------------------------------------------- /data/tabs/sensors.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/tabs/sensors.html.gz -------------------------------------------------------------------------------- /data/tabs/servos.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/tabs/servos.html.gz -------------------------------------------------------------------------------- /data/tabs/setup.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/tabs/setup.html.gz -------------------------------------------------------------------------------- /data/tabs/transponder.html.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/data/tabs/transponder.html.gz -------------------------------------------------------------------------------- /doc/esp8266fcgui.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/doc/esp8266fcgui.jpg -------------------------------------------------------------------------------- /doc/ide_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/doc/ide_settings.png -------------------------------------------------------------------------------- /doc/mac_browser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/doc/mac_browser.png -------------------------------------------------------------------------------- /doc/mobile_bf.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/doc/mobile_bf.PNG -------------------------------------------------------------------------------- /doc/mobile_bf2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/doc/mobile_bf2.PNG -------------------------------------------------------------------------------- /doc/mobile_bf3.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/doc/mobile_bf3.PNG -------------------------------------------------------------------------------- /doc/mobile_index.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/doc/mobile_index.PNG -------------------------------------------------------------------------------- /doc/win_browser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/doc/win_browser.png -------------------------------------------------------------------------------- /doc/win_network.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/doc/win_network.png -------------------------------------------------------------------------------- /esp8266fcgui.ino: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include "lwip/inet.h" 11 | #include "fc_config.h" 12 | 13 | //Home WiFi Settings 14 | const char* sta_ssid = STA_SSID; 15 | const char* sta_password = STA_PASSWORD; 16 | 17 | //Hostname, AP SSID 18 | const char * hostName = AP_SSID; 19 | 20 | //AP Password 21 | const char * passWord = AP_PASSWORD; 22 | 23 | //SSDP properties 24 | const char * modelName = "ESP8266EX"; 25 | const char * modelNumber = "929000226503"; 26 | 27 | static const char* ssdpTemplate = 28 | "" 29 | "" 30 | "" 31 | "1" 32 | "0" 33 | "" 34 | "http://%u.%u.%u.%u/" 35 | "" 36 | "upnp:rootdevice" 37 | "%s" 38 | "index.html" 39 | "%u" 40 | "%s" 41 | "%s" 42 | "http://www.espressif.com" 43 | "Espressif Systems" 44 | "http://www.espressif.com" 45 | "uuid:38323636-4558-4dda-9188-cda0e6%02x%02x%02x" 46 | "" 47 | "\r\n" 48 | "\r\n"; 49 | 50 | DNSServer dnsServer; 51 | 52 | AsyncWebServer server(80); 53 | AsyncWebSocket ws("/ws"); 54 | 55 | AsyncWebServer server2(81);//compatibility 56 | AsyncWebSocket ws2("/"); 57 | 58 | void handleWebSocket(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len){ 59 | if(type == WS_EVT_DATA){ 60 | AwsFrameInfo * info = (AwsFrameInfo*)arg; 61 | for(size_t i=0; i < info->len; i++) { 62 | Serial.write(data[i]); 63 | } 64 | } 65 | } 66 | 67 | void setup(){ 68 | Serial.begin(115200); 69 | Serial.setDebugOutput(false); 70 | 71 | WiFi.mode(WIFI_OFF); 72 | WiFi.softAP(hostName, passWord); 73 | WiFi.softAPConfig(IPAddress(192,168,4,1),IPAddress(192,168,4,1),IPAddress(255,255,255,0)); 74 | if(sta_ssid){ 75 | WiFi.hostname(hostName); 76 | WiFi.begin(sta_ssid, sta_password); 77 | WiFi.waitForConnectResult(); 78 | } 79 | 80 | dnsServer.start(53, "*", WiFi.softAPIP()); 81 | 82 | MDNS.addService("http","tcp",80); 83 | 84 | ArduinoOTA.setHostname(hostName); 85 | ArduinoOTA.begin(); 86 | 87 | NBNS.begin(hostName); 88 | 89 | SSDP.setSchemaURL("description.xml"); 90 | SSDP.setHTTPPort(80); 91 | SSDP.setDeviceType("upnp:rootdevice"); 92 | SSDP.setModelName(modelName); 93 | SSDP.setModelNumber(modelNumber); 94 | SSDP.begin(); 95 | 96 | server.on("/description.xml", HTTP_GET, [](AsyncWebServerRequest *request){ 97 | StreamString output; 98 | if(output.reserve(1024)){ 99 | uint32_t ip = WiFi.localIP(); 100 | uint32_t chipId = ESP.getChipId(); 101 | output.printf(ssdpTemplate, 102 | IP2STR(&ip), 103 | hostName, 104 | chipId, 105 | modelName, 106 | modelNumber, 107 | (uint8_t) ((chipId >> 16) & 0xff), 108 | (uint8_t) ((chipId >> 8) & 0xff), 109 | (uint8_t) chipId & 0xff 110 | ); 111 | request->send(200, "text/xml", (String)output); 112 | } else { 113 | request->send(500); 114 | } 115 | }); 116 | 117 | SPIFFS.begin(); 118 | 119 | ws.onEvent(&handleWebSocket); 120 | server.addHandler(&ws); 121 | 122 | server.on("/favicon.ico", HTTP_GET, [](AsyncWebServerRequest *request){ 123 | AsyncWebServerResponse *response = request->beginResponse_P(200, "image/x-icon", favicon_ico_gz, favicon_ico_gz_len); 124 | response->addHeader("Content-Encoding", "gzip"); 125 | request->send(response); 126 | }); 127 | server.serveStatic("/", SPIFFS, "/").setDefaultFile("index.html"); 128 | server.begin(); 129 | 130 | //compatibility 131 | ws2.onEvent(&handleWebSocket); 132 | server2.addHandler(&ws2); 133 | server2.begin(); 134 | } 135 | 136 | void loop(){ 137 | static char serialBuf[1441]; 138 | static size_t bufLen = 0; 139 | ArduinoOTA.handle(); 140 | dnsServer.processNextRequest(); 141 | if(Serial.available()){ 142 | while(Serial.available() && bufLen < 1440){ 143 | serialBuf[bufLen++] = Serial.read(); 144 | if(!Serial.available() && bufLen < 1440){ 145 | delay(1);//wait a bit more 146 | } 147 | } 148 | serialBuf[bufLen] = 0; 149 | ws.binaryAll(serialBuf, bufLen); 150 | ws2.binaryAll(serialBuf, bufLen); 151 | bufLen = 0; 152 | } 153 | } 154 | -------------------------------------------------------------------------------- /fc_config.h: -------------------------------------------------------------------------------- 1 | #ifndef _FC_CONFIG_H_ 2 | #define _FC_CONFIG_H_ 3 | 4 | //Home WiFi Settings 5 | #define STA_SSID NULL //NULL means that it will not connect to WiFi 6 | #define STA_PASSWORD NULL //NULL means that WiFi does not require password 7 | //#define STA_SSID "my-home-wifi" 8 | //#define STA_PASSWORD "big-secret" 9 | 10 | //WiFi AP Settings 11 | #define AP_SSID "esp8266fcgui" 12 | #define AP_PASSWORD NULL //NULL means that AP does not require password 13 | 14 | 15 | //File: favicon.ico.gz, Size: 726 16 | #define favicon_ico_gz_len 726 17 | const uint8_t favicon_ico_gz[] PROGMEM = { 18 | 0x1F, 0x8B, 0x08, 0x08, 0x0B, 0x87, 0x90, 0x57, 0x00, 0x03, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6F, 19 | 0x6E, 0x2E, 0x69, 0x63, 0x6F, 0x00, 0xCD, 0x53, 0x5F, 0x48, 0x9A, 0x51, 0x14, 0xBF, 0x62, 0x6D, 20 | 0x86, 0x96, 0xA9, 0x64, 0xD3, 0xFE, 0xA8, 0x99, 0x65, 0x1A, 0xB4, 0x8A, 0xA8, 0x51, 0x54, 0x23, 21 | 0xA8, 0x11, 0x49, 0x51, 0x8A, 0x34, 0x62, 0x93, 0x85, 0x31, 0x58, 0x44, 0x12, 0x45, 0x2D, 0x58, 22 | 0xF5, 0x52, 0x41, 0x10, 0x23, 0x82, 0xA0, 0x20, 0x98, 0x2F, 0xC1, 0x26, 0xED, 0xA1, 0x20, 0x89, 23 | 0x04, 0xD7, 0x83, 0x58, 0x20, 0x28, 0x04, 0xAB, 0xD1, 0x9B, 0x8C, 0xE5, 0xC3, 0x60, 0x32, 0x64, 24 | 0x0E, 0x56, 0xBF, 0x9D, 0xEF, 0xF6, 0x30, 0x82, 0xED, 0xAD, 0x87, 0xDD, 0x8F, 0xF3, 0xDD, 0x8F, 25 | 0x73, 0xCF, 0xEF, 0x9C, 0xDF, 0x39, 0xBF, 0xFB, 0x31, 0x26, 0xA2, 0x27, 0x37, 0x97, 0xD1, 0x5B, 26 | 0xCF, 0x9E, 0x67, 0x30, 0xA6, 0x66, 0x8C, 0x99, 0xC9, 0xC8, 0x45, 0x9E, 0x6B, 0x3F, 0x5F, 0x74, 27 | 0xA6, 0x94, 0x5E, 0xDB, 0xFF, 0xB2, 0xE6, 0xE7, 0xE7, 0xF9, 0xDE, 0xD6, 0xD6, 0x96, 0xDB, 0xD8, 28 | 0xD8, 0x78, 0xBF, 0xA1, 0xA1, 0xC1, 0xDA, 0xDC, 0xDC, 0x2C, 0xEB, 0xED, 0xED, 0x15, 0x9B, 0xCD, 29 | 0xE6, 0x4A, 0x83, 0xC1, 0xE0, 0x2E, 0x29, 0x29, 0x99, 0xD6, 0x6A, 0xB5, 0x4F, 0x75, 0x3A, 0x9D, 30 | 0x61, 0x75, 0x75, 0x95, 0xB5, 0xB7, 0xB7, 0xDF, 0xC8, 0xD1, 0xD4, 0xD4, 0xF4, 0xB0, 0xBA, 0xBA, 31 | 0xFA, 0x83, 0xD5, 0x6A, 0xFD, 0x5A, 0x5E, 0x5E, 0x9E, 0x28, 0x2D, 0x2D, 0x0D, 0x10, 0xC6, 0x4B, 32 | 0x98, 0x78, 0x5E, 0x5E, 0xDE, 0x95, 0x42, 0xA1, 0x40, 0x4E, 0x4E, 0xCE, 0x65, 0x76, 0x76, 0xF6, 33 | 0x47, 0xB5, 0x5A, 0x6D, 0x4F, 0x26, 0x93, 0xA2, 0xD6, 0xD6, 0x56, 0x8E, 0x6D, 0x69, 0x69, 0xD1, 34 | 0x11, 0x36, 0x62, 0xB1, 0x58, 0x60, 0x32, 0x99, 0xA0, 0xD7, 0xEB, 0x51, 0x58, 0x58, 0x88, 0xFC, 35 | 0xFC, 0x7C, 0x10, 0x16, 0x02, 0x56, 0x2E, 0x97, 0x43, 0x2A, 0x95, 0x42, 0x2C, 0x16, 0x23, 0x33, 36 | 0x33, 0x33, 0xAE, 0x52, 0xA9, 0x1E, 0x64, 0x65, 0x65, 0x71, 0x7C, 0x7D, 0x7D, 0xBD, 0x93, 0xEA, 37 | 0xFE, 0x30, 0x1A, 0x8D, 0xE8, 0xEC, 0xEC, 0xC4, 0xE2, 0xE2, 0x22, 0x6A, 0x6A, 0x6A, 0x40, 0x39, 38 | 0x41, 0xB5, 0x38, 0x4E, 0xC8, 0x33, 0x3C, 0x3C, 0x0C, 0x87, 0xC3, 0xC1, 0x6B, 0x54, 0x54, 0x54, 39 | 0xBC, 0xE9, 0xEB, 0xEB, 0x93, 0x5F, 0x5C, 0x5C, 0x30, 0x8A, 0x9D, 0x2E, 0x2B, 0x2B, 0xBB, 0xA2, 40 | 0x3E, 0x41, 0xBD, 0x21, 0x1E, 0x8F, 0x63, 0x6A, 0x6A, 0x0A, 0x81, 0x40, 0x00, 0x94, 0x1B, 0x3D, 41 | 0x3D, 0x3D, 0x42, 0x3C, 0x96, 0x96, 0x96, 0x70, 0x7E, 0x7E, 0x8E, 0xE3, 0xE3, 0x63, 0xF8, 0xFD, 42 | 0xFE, 0xB4, 0xD7, 0xEB, 0xF5, 0x8F, 0x8F, 0x8F, 0x5B, 0x68, 0x5E, 0x6F, 0x05, 0xCE, 0xB4, 0xE3, 43 | 0xE8, 0xE8, 0x08, 0x27, 0x27, 0x27, 0xD8, 0xDF, 0xDF, 0xC7, 0xD9, 0xD9, 0x19, 0x6C, 0x36, 0x1B, 44 | 0x36, 0x36, 0x36, 0x38, 0x9F, 0x85, 0x85, 0x05, 0xAC, 0xAF, 0xAF, 0x23, 0x1A, 0x8D, 0x22, 0x91, 45 | 0x48, 0x20, 0x16, 0x8B, 0xFD, 0xDA, 0xDA, 0xDA, 0x7A, 0x41, 0x33, 0x7E, 0x57, 0x50, 0x50, 0x80, 46 | 0x89, 0x89, 0x09, 0x84, 0xC3, 0x61, 0x6C, 0x6F, 0x6F, 0x23, 0x12, 0x89, 0xE0, 0xE0, 0xE0, 0x00, 47 | 0x43, 0x43, 0x43, 0x58, 0x5E, 0x5E, 0xE6, 0x9C, 0x7D, 0x3E, 0x1F, 0x46, 0x47, 0x47, 0x79, 0xBE, 48 | 0xBD, 0xBD, 0x3D, 0xE1, 0x3C, 0x1D, 0x0C, 0x06, 0x9F, 0x10, 0xB7, 0xC7, 0x84, 0x4F, 0xF6, 0xF7, 49 | 0xF7, 0x63, 0x60, 0x60, 0x00, 0x83, 0x83, 0x83, 0x18, 0x19, 0x19, 0xC1, 0xDC, 0xDC, 0x1C, 0x8F, 50 | 0x17, 0x7C, 0xA4, 0x27, 0xE7, 0x34, 0x39, 0x39, 0x89, 0x9D, 0x9D, 0x1D, 0x6E, 0x54, 0xE3, 0x13, 51 | 0xE5, 0x34, 0x11, 0x37, 0x49, 0x51, 0x51, 0xD1, 0x4B, 0xA5, 0x52, 0xF9, 0x45, 0x26, 0x93, 0x5D, 52 | 0x0A, 0xF3, 0x92, 0x48, 0x24, 0xA0, 0x6F, 0x14, 0x17, 0x17, 0xA3, 0xB6, 0xB6, 0x16, 0x5D, 0x5D, 53 | 0x5D, 0x7C, 0x1E, 0xBB, 0xBB, 0xBB, 0x9C, 0xD7, 0xE1, 0xE1, 0x21, 0x42, 0xA1, 0xD0, 0x6B, 0xD2, 54 | 0x45, 0x4C, 0x33, 0x12, 0x34, 0xCC, 0xA0, 0x19, 0x54, 0x92, 0x56, 0x0E, 0xD2, 0xD9, 0x43, 0xF8, 55 | 0xCF, 0x82, 0x56, 0xC2, 0xDC, 0xEB, 0xEA, 0xEA, 0x38, 0x7E, 0x6C, 0x6C, 0x4C, 0xE0, 0xFE, 0x9D, 56 | 0xB8, 0xBF, 0xA7, 0xFA, 0xAF, 0x56, 0x56, 0x56, 0xEE, 0x6D, 0x6E, 0x6E, 0xDE, 0xB8, 0x47, 0x55, 57 | 0x55, 0x55, 0x6C, 0x66, 0x66, 0x46, 0x44, 0xDA, 0x3B, 0x34, 0x1A, 0x4D, 0x94, 0xB0, 0x3F, 0x09, 58 | 0x7B, 0x45, 0xBD, 0xA5, 0x5D, 0x2E, 0x57, 0x8C, 0x7A, 0x73, 0xD9, 0xED, 0xF6, 0x3B, 0x84, 0xFF, 59 | 0xE7, 0x7D, 0xA6, 0x3A, 0x2C, 0x95, 0x4A, 0xB1, 0x8E, 0x8E, 0x0E, 0x6D, 0x77, 0x77, 0xB7, 0xCD, 60 | 0xE9, 0x74, 0x3E, 0x73, 0xBB, 0xDD, 0x8F, 0x3C, 0x1E, 0x8F, 0xE6, 0xF4, 0xF4, 0x94, 0xAD, 0xAD, 61 | 0xAD, 0xDD, 0xDE, 0xCF, 0x73, 0x0B, 0x0B, 0xB8, 0xB6, 0xE0, 0x5D, 0xC6, 0x66, 0xC5, 0xE4, 0x10, 62 | 0x4C, 0xF4, 0xF7, 0xD8, 0x59, 0xF2, 0x7F, 0xA3, 0xB8, 0xB4, 0xFC, 0x0F, 0xEE, 0x37, 0x70, 0xEC, 63 | 0x16, 0x4A, 0x7E, 0x04, 0x00, 0x00 64 | }; 65 | 66 | #endif 67 | -------------------------------------------------------------------------------- /websrc/bf/README.md: -------------------------------------------------------------------------------- 1 | # Betaflight Configurator 2 | 3 | ![Betaflight](http://static.rcgroups.net/forums/attachments/6/1/0/3/7/6/a9088900-228-bf_logo.jpg) 4 | 5 | Betaflight Configurator is a crossplatform configuration tool for the Betaflight flight control system. 6 | 7 | It runs as an app within Google Chrome and allows you to configure the Betaflight software running on any [supported Betaflight target](https://github.com/betaflight/betaflight/tree/master/src/main/target). 8 | 9 | Various types of aircraft are supported by the tool and by Betaflight, e.g. quadcopters, hexacopters, octocopters and fixed-wing aircraft. 10 | 11 | ## Authors 12 | 13 | Betaflight Configurator is a [fork](#credits) of the Cleanflight Configurator with support for Betaflight instead of Cleanflight. 14 | 15 | This configurator is the only configurator with support for Betaflight specific features. It will likely require that you run the latest firmware on the flight controller. 16 | If you are experiencing any problems please make sure you are running the [latest firmware version](https://github.com/betaflight/betaflight/releases/). 17 | 18 | ## Installation 19 | 20 | ### Via chrome webstore 21 | 22 | [![available in the Chrome web store](https://developer.chrome.com/webstore/images/ChromeWebStore_Badge_v2_206x58.png)](https://chrome.google.com/webstore/detail/betaflight-configurator/kdaghagfopacdngbohiknlhcocjccjao) 23 | 24 | 1. Visit [Chrome web store](https://chrome.google.com/webstore/detail/betaflight-configurator/kdaghagfopacdngbohiknlhcocjccjao) 25 | 2. Click **+ Free** 26 | 27 | Please note - the application will automatically update itself when new versions are released. Please ensure you maintain configuration backups as described in the Betaflight documentation. 28 | 29 | ### Alternative way 30 | 31 | 1. Clone the repo to any local directory or download it as zip 32 | 2. Start Chromium or Google Chrome and go to tools -> extension 33 | 3. Check the "Developer mode" checkbox 34 | 4. Click on load unpacked extension and point it to the Betaflight Configurator directory (for example D:/betaflight-configurator) 35 | 36 | ## How to use 37 | 38 | You can find the Betaflight Configurator icon in your application tab "Apps" 39 | 40 | ## Notes 41 | 42 | ### WebGL 43 | 44 | Make sure Settings -> System -> "User hardware acceleration when available" is checked to achieve the best performance 45 | 46 | ### Linux users 47 | 48 | Dont forget to add your user into dialout group "sudo usermod -aG dialout YOUR_USERNAME" for serial access 49 | 50 | ### Linux / MacOSX users 51 | 52 | If you have 3D model animation problems, enable "Override software rendering list" in Chrome flags chrome://flags/#ignore-gpu-blacklist 53 | 54 | ## Support 55 | 56 | If you need help your please use the multiwii or rcgroups forums or visit the IRC channel before raising issues in the issue trackers. 57 | 58 | ### Issue trackers 59 | 60 | For Betaflight configurator issues raise them here 61 | 62 | https://github.com/betaflight/betaflight-configurator/issues 63 | 64 | For Betaflight firmware issues raise them here 65 | 66 | https://github.com/betaflight/betaflight/issues 67 | 68 | ## Technical details 69 | 70 | The configurator is based on chrome.serial API running on Google Chrome/Chromium core. 71 | 72 | ## Developers 73 | 74 | We accept clean and reasonable patches, submit them! 75 | 76 | ## Credits 77 | 78 | ctn - primary author and maintainer of Baseflight Configurator from which Cleanflight Configurator project was forked. 79 | 80 | Hydra - author and maintainer of Cleanflight Configurator from which this project was forked. 81 | -------------------------------------------------------------------------------- /websrc/bf/changelog.html: -------------------------------------------------------------------------------- 1 | 2016.10.25 - 1.8.5 - BetaFlight 2 |
    3 |
  • Simplified RX selection in config tab
  • 4 |
  • Saving logs as BFL extension
  • 5 |
6 | 2016.10.25 - 1.8.4 - BetaFlight 7 |
    8 |
  • Added DSHOT300
  • 9 |
  • Support for more UARTS
  • 10 |
11 | 2016.10.13 - 1.8.3 - BetaFlight 12 |
    13 |
  • Added DSHOT600 and DSHOT150
  • 14 |
15 | 2016.10.12 - 1.8.2 - BetaFlight 16 |
    17 |
  • More OSD parameters conform 3.0.1
  • 18 |
  • Changed naming convention for PID relaxation parameter
  • 19 |
  • Added second notch
  • 20 |
21 | 2016.09.15 - 1.8.1 - BetaFlight 22 |
    23 |
  • Support for jumbo frames for faster flash download
  • 24 |
  • Many small visual fixes
  • 25 |
  • Improved rate tool visualisation
  • 26 |
27 | 2016.09.07 - 1.8.0 - BetaFlight 28 |
    29 |
  • Pterm setpoint is now only P weight for more direct stick feel on super expo curve. Supported from RC14
  • 30 |
  • RC deadband is now added to rate tool
  • 31 |
  • Minor bugfixes for older versions
  • 32 |
  • Move Rc interpolation to Receiver tab
  • 33 |
34 | 2016.09.07 - 1.7.9 - BetaFlight 35 |
    36 |
  • Fix representation of rc expo above rc rate of 2.0
  • 37 |
38 | 2016.09.06 - 1.7.8 - BetaFlight 39 |
    40 |
  • Change rates to super rates
  • 41 |
  • Fix curve representation for 3.0.0
  • 42 |
  • Move max deg/sec to pid columns
  • 43 |
44 | 2016.08.25 - 1.7.7 - BetaFlight 45 |
    46 |
  • Fix dterm setpoint range
  • 47 |
48 | 2016.08.24 - 1.7.6 - BetaFlight 49 |
    50 |
  • Fix Vbat bug
  • 51 |
  • Increase D setpoint weight range
  • 52 |
53 | 2016.08.23 - 1.7.5 - BetaFlight 54 |
    55 |
  • Added separate Filter Tab
  • 56 |
57 | 2016.08.21 - 1.7.4 - BetaFlight 58 |
    59 |
  • Fix Airmode Threshold bug
  • 60 |
61 | 2016.08.20 - 1.7.3 - BetaFlight 62 |
    63 |
  • Prepared new filters
  • 64 |
  • Fixed Auto update of configurator
  • 65 |
  • Cleanups
  • 66 |
67 | 2016.08.09 - 1.7.2 - BetaFlight 68 |
    69 |
  • Bugfix in deactivation of super expo
  • 70 |
  • Replaced yaw D by yaw jump prevention strength
  • 71 |
  • Made RC interpolation dynamic
  • 72 |
  • Fixed configurator from breaking 3D deadband
  • 73 |
  • Added yaw RC rate as adjustment
  • 74 |
75 | 2016.08.05 - 1.7.1 - BetaFlight 76 |
    77 |
  • Bugfix in setting wrong airmode threshold
  • 78 |
  • Support for 3.0.0 firmware
  • 79 |
  • Added new PID parameters
  • 80 |
81 | 2016.08.02 - 1.7.0 - BetaFlight 82 |
    83 |
  • Support for 2.9.1 patch
  • 84 |
  • Support for 3.0.0 development firmware
  • 85 |
  • Many cleanups
  • 86 |
  • Added CPU percentage to status bar
  • 87 |
  • Moved VBAT PID compensation to PID tab
  • 88 |
  • Hide unused tabs
  • 89 |
  • Represent real blackbox log rate instead of denom
  • 90 |
91 | 2016.07.18 - 1.6.4 - BetaFlight 92 |
    93 |
  • Many Cleanups
  • 94 |
  • Backup restore fixes
  • 95 |
  • Added Vbat Compensation
  • 96 |
  • Preparations for 3.0.0 development firmware
  • 97 |
98 | 2016.07.07 - 1.6.3 - BetaFlight 99 |
    100 |
  • Fixed Rate Scaling for 3D model
  • 101 |
  • Moved Super Expo Feature to PID tab
  • 102 |
  • Some cleanups and fixes
  • 103 |
104 | 2016.07.05 - 1.6.2 - BetaFlight 105 |
    106 |
  • Added rate numbers to rate calculator
  • 107 |
  • More user friendly firmware flasher
  • 108 |
  • Added 3D model to RX tab
  • 109 |
110 | 2016.07.04 - 1.6.1 - BetaFlight 111 |
    112 |
  • Fixed saving level PIDs
  • 113 |
114 | 2016.07.04 - 1.6.0 - BetaFlight 115 |
    116 |
  • Added Rate Tool
  • 117 |
  • Add extra pwm protocol for 3.0
  • 118 |
  • Many Cleanups
  • 119 |
  • Added more tips
  • 120 |
121 | 2016.06.27 - 1.5 - BetaFlight 122 |
    123 |
  • Fix some saving issues
  • 124 |
125 | 2016.06.26 - 1.4 - BetaFlight 126 |
    127 |
  • Fix saving bug in 1.3 for 2.9 firmware
  • 128 |
  • Added tuning tips
  • 129 |
  • Added AIRMODE feature
  • 130 |
  • Added SUPEREXPO_RATES feature
  • 131 |
132 | 2016.06.26 - 1.3 - BetaFlight 133 |
    134 |
  • Backwards compatible with old Betaflight versions
  • 135 |
  • Added more advanced tuning parameters
  • 136 |
  • Added disabling/enabling sensors
  • 137 |
  • Made graph to reflect the changes better(Still not optimal)
  • 138 |
139 | 2016.06.21 - 1.2 - BetaFlight 140 |
    141 |
  • Added gyro sync and pid denom configuration instead of looptime.
  • 142 |
  • Added rc_rate_yaw in PID tuning tab.
  • 143 |
  • Added ESC PWM Configuration.
  • 144 |
145 | 2016.06.20 - 1.1 - BetaFlight 146 |
    147 |
  • Cosmetic changes
  • 148 |
149 | 2016.06.20 - 1.0 - BetaFlight 150 |
    151 |
  • Initial Release Configurator.
  • 152 |
  • Rebranded from Cleanflight.
  • 153 |
154 | -------------------------------------------------------------------------------- /websrc/bf/css/dropdown-lists/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2012-2013 Thibaut Courouble 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /websrc/bf/css/dropdown-lists/css/style_lists.css: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Copyright (c) 2012-2013 Thibaut Courouble 4 | * http://www.cssflow.com 5 | * 6 | * Licensed under the MIT License: 7 | * http://www.opensource.org/licenses/mit-license.php 8 | */ 9 | 10 | 11 | 12 | 13 | .dropdown { 14 | 15 | display: inline-block; 16 | position: relative; 17 | overflow: hidden; 18 | height: 20px; 19 | background: #fff; 20 | background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.06)); 21 | background-image: -moz-linear-gradient(top, transparent, rgba(0, 0, 0, 0.06)); 22 | background-image: -o-linear-gradient(top, transparent, rgba(0, 0, 0, 0.06)); 23 | background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.06)); 24 | -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.08); 25 | box-shadow: 0 1px 1px rgba(0, 0, 0, 0.08); 26 | width:99%; 27 | margin-bottom:7px; 28 | border: 1px solid; 29 | border-color: #ccc #ccc #ccc; 30 | border-radius: 3px; 31 | 32 | 33 | 34 | 35 | 36 | } 37 | .dropdown:before, .dropdown:after { 38 | content: ''; 39 | position: absolute; 40 | z-index: 2; 41 | top: 7px; 42 | right: 7px; 43 | width: 0; 44 | height: 0; 45 | border: 4px dashed; 46 | border-color: #888 transparent; 47 | pointer-events: none; 48 | } 49 | .dropdown:before { 50 | border-bottom-style: solid; 51 | border-top: none; 52 | margin-top: -2px; 53 | 54 | } 55 | .dropdown:after { 56 | margin-top: 5px; 57 | border-top-style: solid; 58 | border-bottom: none; 59 | } 60 | 61 | .dropdown-select { 62 | position: relative; 63 | overflow:visible; 64 | width: 100%; 65 | margin-top:0px; 66 | padding-bottom:0px; 67 | padding: 1px 8px 6px 5px; 68 | height: 23px; 69 | line-height: 20px; 70 | font-size: 12px; 71 | color: #62717a; 72 | text-shadow: 0 1px white; 73 | /* Fallback for IE 8 */ 74 | background: #f2f2f2; 75 | /* "transparent" doesn't work with Opera */ 76 | background: rgba(0, 0, 0, 0) !important; 77 | border: 0; 78 | border-radius: 0; 79 | -webkit-appearance: none; 80 | 81 | 82 | } 83 | .dropdown-select:focus { 84 | z-index: 3; 85 | width: 90%; 86 | color: #4fa619; 87 | outline: 0px solid #49aff2; 88 | outline: 0px solid -webkit-focus-ring-color; 89 | outline-offset: 5px; 90 | 91 | height:25px; 92 | } 93 | .dropdown-select > option { 94 | margin: 3px; 95 | padding: 6px 8px; 96 | text-shadow: none; 97 | background: #f2f2f2; 98 | border-radius: 3px; 99 | cursor: pointer; 100 | 101 | } 102 | 103 | /* Fix for IE 8 putting the arrows behind the select element. */ 104 | .lt-ie9 .dropdown { 105 | z-index: 1; 106 | } 107 | .lt-ie9 .dropdown-select { 108 | z-index: -1; 109 | } 110 | .lt-ie9 .dropdown-select:focus { 111 | z-index: 3; 112 | } 113 | 114 | .dropdown-dark { 115 | background: #636363; /* NEW2 */ 116 | background: #3e403f; /* NEW */ 117 | 118 | border-color: #111 #0a0a0a black; 119 | background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.4)); 120 | background-image: -moz-linear-gradient(top, transparent, rgba(0, 0, 0, 0.4)); 121 | background-image: -o-linear-gradient(top, transparent, rgba(0, 0, 0, 0.4)); 122 | background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.4)); 123 | -webkit-box-shadow: inset 0 1px rgba(255, 255, 255, 0.1), 0 1px 1px rgba(0, 0, 0, 0.2); 124 | box-shadow: inset 0 1px rgba(255, 255, 255, 0.1), 0 1px 1px rgba(0, 0, 0, 0.2); 125 | color:#a6a6a6; 126 | text-shadow:0px 1px rgba(0, 0, 0, 0.25); 127 | 128 | 129 | 130 | 131 | } 132 | .dropdown-dark:before { 133 | border-bottom-color: #aaa; 134 | } 135 | .dropdown-dark:after { 136 | border-top-color: #aaa; 137 | } 138 | .dropdown-dark .dropdown-select { 139 | color: #a6a6a6; 140 | text-shadow: 0 1px black; 141 | /* Fallback for IE 8 */ 142 | background: #444; 143 | 144 | } 145 | .dropdown-dark .dropdown-select:focus { 146 | color: #fff; 147 | } 148 | .dropdown-dark .dropdown-select > option { 149 | background: #56ab1a; 150 | text-shadow: 0 1px rgba(0, 0, 0, 0.4); 151 | } 152 | -------------------------------------------------------------------------------- /websrc/bf/images/btn-donate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/websrc/bf/images/btn-donate.png -------------------------------------------------------------------------------- /websrc/bf/images/ind/fi_box.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 17 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /websrc/bf/images/ind/fi_circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 18 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /websrc/bf/images/ind/fi_needle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 17 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /websrc/bf/images/ind/fi_needle_small.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 18 | 20 | 21 | 22 | 24 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /websrc/bf/images/ind/fi_tc_airplane.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 15 | 19 | 20 | 24 | 28 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /websrc/bf/images/ind/heading_mechanics.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /websrc/bf/images/ind/horizon_back.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /websrc/bf/images/ind/horizon_circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /websrc/bf/images/ind/horizon_mechanics.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /websrc/bf/images/moto/custom.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 30 | 31 | 33 | 35 | 38 | 40 | 42 | 46 | 49 | 51 | 53 | 56 | 58 | 59 | -------------------------------------------------------------------------------- /websrc/bf/images/position.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/websrc/bf/images/position.png -------------------------------------------------------------------------------- /websrc/bf/js/boards.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | // This list has been extracted from the firmware source with: 4 | // grep TARGET_BOARD_IDENTIFIER src/main/target/*/target.h | sed -n "s/^src\/main\/target\/\([^\/]*\).*#define TARGET_BOARD_IDENTIFIER \"\([^\"]*\).*$/{name: '\1', identifier: '\2', vcp: false},/p" | sort 5 | // and then manually setting vcp to true for boards that use VCP 6 | 7 | var BOARD_DEFINITIONS = [ 8 | {name: 'AIORACERF3', identifier: 'ARF3', vcp: true}, 9 | {name: 'AIR32', identifier: 'AR32', vcp: true}, 10 | {name: 'AIRHEROF3', identifier: 'AIR3', vcp: false}, 11 | {name: 'ALIENFLIGHTF1', identifier: 'AFF1', vcp: false}, 12 | {name: 'ALIENFLIGHTF3', identifier: 'AFF3', vcp: true}, 13 | {name: 'ALIENFLIGHTF4', identifier: 'AFF4', vcp: true}, 14 | {name: 'ANYFCF7', identifier: 'ANY7', vcp: true}, 15 | {name: 'BETAFLIGHTF3', identifier: 'BFF3', vcp: true}, 16 | {name: 'BLUEJAYF4', identifier: 'BJF4', vcp: true}, 17 | {name: 'CC3D', identifier: 'CC3D', vcp: true}, 18 | {name: 'CHEBUZZF3', identifier: 'CHF3', vcp: true}, 19 | {name: 'CJMCU', identifier: 'CJM1', vcp: false}, 20 | {name: 'COLIBRI', identifier: 'COLI', vcp: true}, 21 | {name: 'COLIBRI_RACE', identifier: 'CLBR', vcp: true}, 22 | {name: 'DOGE', identifier: 'DOGE', vcp: true}, 23 | {name: 'F4BY', identifier: 'F4BY', vcp: true}, 24 | {name: 'FURYF3', identifier: 'FYF3', vcp: true}, 25 | {name: 'FURYF4', identifier: 'FYF4', vcp: true}, 26 | {name: 'FURYF7', identifier: 'FYF7', vcp: true}, 27 | {name: 'IMPULSERCF3', identifier: 'IMF3', vcp: true}, 28 | {name: 'IRCFUSIONF3', identifier: 'IFF3', vcp: true}, 29 | {name: 'ISHAPEDF3', identifier: 'ISF3', vcp: false}, 30 | {name: 'KAKUTEF4', identifier: 'KTV1', vcp: true}, 31 | {name: 'KISSFC', identifier: 'KISS', vcp: true}, 32 | {name: 'LUXV2_RACE', identifier: 'LUXR', vcp: true}, 33 | {name: 'LUX_RACE', identifier: 'LUX', vcp: true}, 34 | {name: 'MICROSCISKY', identifier: 'MSKY', vcp: false}, 35 | {name: 'MOTOLAB', identifier: 'MOTO', vcp: true}, 36 | {name: 'MULTIFLITEPICO', identifier: 'MFPB', vcp: false}, 37 | {name: 'AFROMINI', identifier: 'AFMN', vcp: false}, 38 | {name: 'NAZE', identifier: 'AFNA', vcp: false}, 39 | {name: 'BEEBRAIN', identifier: 'BEBR', vcp: false}, 40 | {name: 'OMNIBUSF4', identifier: 'OBF4', vcp: true}, 41 | {name: 'OMNIBUS', identifier: 'OMNI', vcp: true}, 42 | {name: 'PIKOBLX', identifier: 'PIKO', vcp: true}, 43 | {name: 'RACEBASE', identifier: 'RBFC', vcp: false}, 44 | {name: 'RCEXPLORERF3', identifier: 'REF3', vcp: true}, 45 | {name: 'AIRBOTF4', identifier: 'AIR4', vcp: true}, 46 | {name: 'REVOLT', identifier: 'RVLT', vcp: true}, 47 | {name: 'REVO', identifier: 'REVO', vcp: true}, 48 | {name: 'REVONANO', identifier: 'REVN', vcp: true}, 49 | {name: 'RMDO', identifier: 'RMDO', vcp: false}, 50 | {name: 'SINGULARITY', identifier: 'SING', vcp: true}, 51 | {name: 'SIRINFPV', identifier: 'SIRF', vcp: true}, 52 | {name: 'SOULF4', identifier: 'SOUL', vcp: true}, 53 | {name: 'SPARKY2', identifier: 'SPK2', vcp: true}, 54 | {name: 'SPARKY', identifier: 'SPKY', vcp: true}, 55 | {name: 'SPRACINGF3EVO', identifier: 'SPEV', vcp: true}, 56 | {name: 'SPRACINGF3', identifier: 'SRF3', vcp: false}, 57 | {name: 'SPRACINGF3MINI', identifier: 'SRFM', vcp: true}, 58 | {name: 'STM32F3DISCOVERY', identifier: 'SDF3', vcp: true}, 59 | {name: 'VRRACE', identifier: 'VRRA', vcp: true}, 60 | {name: 'X_RACERSPI', identifier: 'XRC3', vcp: false}, 61 | {name: 'YUPIF4', identifier: 'YPF4', vcp: true}, 62 | {name: 'ZCOREF3', identifier: 'ZCF3', vcp: false} 63 | ]; 64 | 65 | var DEFAULT_BOARD_DEFINITION = { 66 | name: "Unknown", identifier: "????", vcp: false 67 | }; 68 | 69 | var BOARD = {}; 70 | 71 | BOARD.find_board_definition = function (identifier) { 72 | for (var i = 0; i < BOARD_DEFINITIONS.length; i++) { 73 | var candidate = BOARD_DEFINITIONS[i]; 74 | 75 | if (candidate.identifier == identifier) { 76 | return candidate; 77 | } 78 | } 79 | return DEFAULT_BOARD_DEFINITION; 80 | }; 81 | -------------------------------------------------------------------------------- /websrc/bf/js/data_storage.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var CONFIGURATOR = { 4 | // all versions are specified and compared using semantic versioning http://semver.org/ 5 | 'apiVersionAccepted': '1.2.1', 6 | 'backupRestoreMinApiVersionAccepted': '1.5.0', 7 | 'pidControllerChangeMinApiVersion': '1.5.0', 8 | 'backupFileMinVersionAccepted': '0.55.0', // chrome.runtime.getManifest().version is stored as string, so does this one 9 | 10 | 'connectionValid': false, 11 | 'connectionValidCliOnly': false, 12 | 'cliActive': false, 13 | 'cliValid': false 14 | }; 15 | -------------------------------------------------------------------------------- /websrc/bf/js/injected_methods.js: -------------------------------------------------------------------------------- 1 | Number.prototype.clamp = function(min, max) { 2 | return Math.min(Math.max(this, min), max); 3 | }; 4 | 5 | /** 6 | * String formatting now supports currying (partial application). 7 | * For a format string with N replacement indices, you can call .format 8 | * with M <= N arguments. The result is going to be a format string 9 | * with N-M replacement indices, properly counting from 0 .. N-M. 10 | * The following Example should explain the usage of partial applied format: 11 | * "{0}:{1}:{2}".format("a","b","c") === "{0}:{1}:{2}".format("a","b").format("c") 12 | * "{0}:{1}:{2}".format("a").format("b").format("c") === "{0}:{1}:{2}".format("a").format("b", "c") 13 | **/ 14 | String.prototype.format = function () { 15 | var args = arguments; 16 | return this.replace(/\{(\d+)\}/g, function (t, i) { 17 | return args[i] !== void 0 ? args[i] : "{"+(i-args.length)+"}"; 18 | }); 19 | }; 20 | 21 | Array.prototype.push8 = function(val) { 22 | this.push(0xFF & val); 23 | return this; 24 | }; 25 | 26 | Array.prototype.push16 = function(val) { 27 | // low byte 28 | this.push(0x00FF & val); 29 | // high byte 30 | this.push(val >> 8); 31 | // chainable 32 | return this; 33 | }; 34 | 35 | Array.prototype.push32 = function(val) { 36 | this.push8(val) 37 | .push8(val >> 8) 38 | .push8(val >> 16) 39 | .push8(val >> 24); 40 | return this; 41 | }; 42 | 43 | DataView.prototype.offset = 0; 44 | DataView.prototype.readU8 = function() { 45 | if (this.byteLength >= this.offset+1) { 46 | return this.getUint8(this.offset++); 47 | } else { 48 | return null; 49 | } 50 | }; 51 | 52 | DataView.prototype.readU16 = function() { 53 | if (this.byteLength >= this.offset+2) { 54 | return this.readU8() + this.readU8()*256; 55 | } else { 56 | return null; 57 | } 58 | }; 59 | 60 | DataView.prototype.readU32 = function() { 61 | if (this.byteLength >= this.offset+4) { 62 | return this.readU16() + this.readU16()*65536; 63 | } else { 64 | return null; 65 | } 66 | }; 67 | 68 | DataView.prototype.read8 = function() { 69 | if (this.byteLength >= this.offset+1) { 70 | return this.getInt8(this.offset++, 1); 71 | } else { 72 | return null; 73 | } 74 | }; 75 | 76 | DataView.prototype.read16 = function() { 77 | this.offset += 2; 78 | if (this.byteLength >= this.offset) { 79 | return this.getInt16(this.offset-2, 1); 80 | } else { 81 | return null; 82 | } 83 | }; 84 | 85 | DataView.prototype.read32 = function() { 86 | this.offset += 4; 87 | if (this.byteLength >= this.offset) { 88 | return this.getInt32(this.offset-4, 1); 89 | } else { 90 | return null; 91 | } 92 | }; -------------------------------------------------------------------------------- /websrc/bf/js/libraries/flightindicators.css: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery Flight Indicators plugin 3 | * By Sébastien Matton (seb_matton@hotmail.com) 4 | * Published under GPLv3 License. 5 | * 6 | * https://github.com/sebmatton/jQuery-Flight-Indicators 7 | */ 8 | 9 | /* Global block of an indicator*/ 10 | div.instrument { 11 | width: 250px; 12 | height: 250px; 13 | position: relative; 14 | display: inline-block; 15 | overflow: hidden; 16 | } 17 | 18 | /* The box containing any element of an indicator */ 19 | div.instrument .box { 20 | position: absolute; 21 | top: 0; 22 | left: 0; 23 | width: 100%; 24 | height: 100%; 25 | } 26 | 27 | /* Default transformations */ 28 | 29 | div.instrument.attitude div.roll { 30 | transform: rotate(0deg); 31 | } 32 | div.instrument.attitude div.roll div.pitch { 33 | top: 0%; 34 | } 35 | div.instrument.heading div.yaw { 36 | transform: rotate(0deg); 37 | } 38 | div.instrument.vario div.vario { 39 | transform: rotate(0deg); 40 | } 41 | div.instrument.speed div.airspeed { 42 | transform: rotate(90deg); 43 | } 44 | div.instrument.altimeter div.pressure { 45 | transform: rotate(40deg); 46 | } 47 | div.instrument.altimeter div.needle { 48 | transform: rotate(90deg); 49 | } 50 | div.instrument.altimeter div.needleSmall { 51 | transform: rotate(90deg); 52 | } 53 | -------------------------------------------------------------------------------- /websrc/bf/js/libraries/jbox/themes/ModalBorder.css: -------------------------------------------------------------------------------- 1 | 2 | /* Wrapper */ 3 | 4 | .jBox-ModalBorder { 5 | border-radius: 8px; 6 | background: rgba(0, 0, 0, .4); 7 | padding: 8px; 8 | box-shadow: 0 0 6px rgba(0, 0, 0, .2); 9 | } 10 | 11 | /* Container */ 12 | 13 | .jBox-ModalBorder .jBox-container { 14 | border-radius: 5px; 15 | box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); 16 | } 17 | 18 | /* Close button */ 19 | 20 | .jBox-ModalBorder.jBox-closeButton-box { 21 | border-top-right-radius: 0; 22 | } 23 | 24 | .jBox-ModalBorder.jBox-closeButton-box:before { 25 | display: none; 26 | } 27 | 28 | .jBox-ModalBorder.jBox-hasTitle.jBox-closeButton-box .jBox-closeButton, 29 | .jBox-ModalBorder.jBox-closeButton-box .jBox-closeButton { 30 | background: rgba(0, 0, 0, .4); 31 | border-radius: 0 50% 50% 0; 32 | right: -32px; 33 | top: -8px; 34 | } 35 | 36 | .jBox-ModalBorder.jBox-closeButton-box .jBox-closeButton path { 37 | fill: #d2d4d6; 38 | } 39 | 40 | .jBox-ModalBorder.jBox-closeButton-box .jBox-closeButton:hover path { 41 | fill: #fff; 42 | } 43 | 44 | .jBox-ModalBorder.jBox-closeButton-box .jBox-closeButton:active path { 45 | fill: #b2b4b6; 46 | } -------------------------------------------------------------------------------- /websrc/bf/js/libraries/jbox/themes/NoticeBorder.css: -------------------------------------------------------------------------------- 1 | 2 | /* jBox: Notice */ 3 | 4 | .jBox-NoticeBorder .jBox-container { 5 | border-radius: 6px; 6 | } 7 | 8 | .jBox-NoticeBorder .jBox-content, 9 | .jBox-NoticeBorder .jBox-title { 10 | padding-left: 26px; 11 | } 12 | 13 | .jBox-NoticeBorder.jBox-Notice-color .jBox-container { 14 | color: #fff; 15 | text-shadow: 0 -1px 0 #000; 16 | background: rgba(0, 0, 0, .92); 17 | } 18 | 19 | .jBox-NoticeBorder.jBox-Notice-color .jBox-container:after { 20 | content: ''; 21 | position: absolute; 22 | top: 0; 23 | left: 0; 24 | bottom: 0; 25 | width: 8px; 26 | border-radius: 5px 0 0 5px; 27 | background-image: linear-gradient(45deg, rgba(255, 255, 255, .5) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .5) 50%, rgba(255, 255, 255, .5) 75%, transparent 75%, transparent); 28 | background-size: 18px 18px; 29 | } 30 | 31 | .jBox-NoticeBorder.jBox-Notice-red .jBox-container:after { 32 | background-color: #ee0000; 33 | } 34 | 35 | .jBox-NoticeBorder.jBox-Notice-green .jBox-container:after { 36 | background-color: #95cc2a; 37 | } 38 | 39 | .jBox-NoticeBorder.jBox-Notice-blue .jBox-container:after { 40 | background-color: #4cb4ff; 41 | } 42 | 43 | .jBox-NoticeBorder.jBox-Notice-yellow .jBox-container:after { 44 | background-color: #ffba00; 45 | } -------------------------------------------------------------------------------- /websrc/bf/js/libraries/jbox/themes/TooltipBorder.css: -------------------------------------------------------------------------------- 1 | 2 | /* Container */ 3 | 4 | .jBox-TooltipBorder .jBox-container { 5 | border-radius: 5px; 6 | border: 2px solid #52a2cb; 7 | } 8 | 9 | /* Pointer */ 10 | 11 | .jBox-TooltipBorder .jBox-pointer:after { 12 | border: 2px solid #52a2cb; 13 | } 14 | 15 | .jBox-TooltipBorder .jBox-pointer-top, 16 | .jBox-TooltipBorder .jBox-pointer-bottom { 17 | width: 34px; 18 | height: 12px; 19 | } 20 | 21 | .jBox-TooltipBorder .jBox-pointer-left, 22 | .jBox-TooltipBorder .jBox-pointer-right { 23 | width: 12px; 24 | height: 34px; 25 | } 26 | 27 | /* Close button */ 28 | 29 | .jBox-TooltipBorder.jBox-closeButton-box:before { 30 | width: 28px; 31 | height: 28px; 32 | background: #52a2cb; 33 | } -------------------------------------------------------------------------------- /websrc/bf/js/libraries/jbox/themes/TooltipDark.css: -------------------------------------------------------------------------------- 1 | 2 | /* Container */ 3 | 4 | .jBox-TooltipDark .jBox-container { 5 | border-radius: 3px; 6 | background: #222; 7 | color: #fff; 8 | box-shadow: 0 0 6px rgba(0, 0, 0, .4); 9 | } 10 | 11 | /* Pointer */ 12 | 13 | .jBox-TooltipDark .jBox-pointer:after { 14 | background: #222; 15 | } 16 | 17 | /* Close button */ 18 | 19 | .jBox-TooltipDark .jBox-closeButton { 20 | background: #222; 21 | } 22 | 23 | .jBox-TooltipDark.jBox-closeButton-box:before { 24 | box-shadow: 0 0 6px rgba(0, 0, 0, .4); 25 | } 26 | 27 | .jBox-TooltipDark.jBox-closeButton-box .jBox-closeButton path { 28 | fill: #d2d4d6; 29 | } 30 | 31 | .jBox-TooltipDark.jBox-closeButton-box .jBox-closeButton:hover path { 32 | fill: #fff; 33 | } 34 | 35 | .jBox-TooltipDark.jBox-closeButton-box .jBox-closeButton:active path { 36 | fill: #b2b4b6; 37 | } -------------------------------------------------------------------------------- /websrc/bf/js/libraries/jquery.ba-throttle-debounce.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery throttle / debounce - v1.1 - 3/7/2010 3 | * http://benalman.com/projects/jquery-throttle-debounce-plugin/ 4 | * 5 | * Copyright (c) 2010 "Cowboy" Ben Alman 6 | * Dual licensed under the MIT and GPL licenses. 7 | * http://benalman.com/about/license/ 8 | */ 9 | (function(b,c){var $=b.jQuery||b.Cowboy||(b.Cowboy={}),a;$.throttle=a=function(e,f,j,i){var h,d=0;if(typeof f!=="boolean"){i=j;j=f;f=c}function g(){var o=this,m=+new Date()-d,n=arguments;function l(){d=+new Date();j.apply(o,n)}function k(){h=c}if(i&&!h){l()}h&&clearTimeout(h);if(i===c&&m>e){l()}else{if(f!==true){h=setTimeout(i?k:l,i===c?e-m:e)}}}if($.guid){g.guid=j.guid=j.guid||$.guid++}return g};$.debounce=function(d,e,f){return f===c?a(d,e,false):a(d,f,e!==false)}})(this); -------------------------------------------------------------------------------- /websrc/bf/js/libraries/jquery.nouislider.min.css: -------------------------------------------------------------------------------- 1 | /*! noUiSlider - 7.0.9 - 2014-10-08 16:49:45 */ 2 | 3 | 4 | .noUi-target,.noUi-target *{-webkit-touch-callout:none;-webkit-user-select:none;-ms-touch-action:none;-ms-user-select:none;-moz-user-select:none;-moz-box-sizing:border-box;box-sizing:border-box}.noUi-target{position:relative}.noUi-base{width:100%;height:100%;position:relative}.noUi-origin{position:absolute;right:0;top:0;left:0;bottom:0}.noUi-handle{position:relative;z-index:1}.noUi-stacking .noUi-handle{z-index:10}.noUi-state-tap .noUi-origin{-webkit-transition:left .3s,top .3s;transition:left .3s,top .3s}.noUi-state-drag *{cursor:inherit!important}.noUi-base{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.noUi-horizontal{height:18px}.noUi-horizontal .noUi-handle{width:34px;height:28px;left:-17px;top:-6px}.noUi-vertical{width:18px}.noUi-vertical .noUi-handle{width:28px;height:34px;left:-6px;top:-17px}.noUi-background{background:#FAFAFA;box-shadow:inset 0 1px 1px #f0f0f0}.noUi-connect{background:#3FB8AF;box-shadow:inset 0 0 3px rgba(51,51,51,.45);-webkit-transition:background 450ms;transition:background 450ms}.noUi-origin{border-radius:2px}.noUi-target{border-radius:4px;border:1px solid #D3D3D3;box-shadow:inset 0 1px 1px #F0F0F0,0 3px 6px -5px #BBB}.noUi-target.noUi-connect{box-shadow:inset 0 0 3px rgba(51,51,51,.45),0 3px 6px -5px #BBB}.noUi-dragable{cursor:w-resize}.noUi-vertical .noUi-dragable{cursor:n-resize}.noUi-handle{border:1px solid #D9D9D9;border-radius:3px;background:#FFF;cursor:default;box-shadow:inset 0 0 1px #FFF,inset 0 1px 7px #EBEBEB,0 3px 6px -3px #BBB}.noUi-active{box-shadow:inset 0 0 1px #FFF,inset 0 1px 7px #DDD,0 3px 6px -3px #BBB}.noUi-handle:after,.noUi-handle:before{content:"";display:block;position:absolute;height:14px;width:1px;background:#E8E7E6;left:14px;top:6px}.noUi-handle:after{left:17px}.noUi-vertical .noUi-handle:after,.noUi-vertical .noUi-handle:before{width:14px;height:1px;left:6px;top:14px}.noUi-vertical .noUi-handle:after{top:17px}[disabled] .noUi-connect,[disabled].noUi-connect{background:#B8B8B8}[disabled] .noUi-handle{cursor:not-allowed} -------------------------------------------------------------------------------- /websrc/bf/js/libraries/jquery.nouislider.pips.min.css: -------------------------------------------------------------------------------- 1 | /*! noUiSlider - 7.0.9 - 2014-10-08 16:49:45 */ 2 | 3 | 4 | .noUi-pips,.noUi-pips *{-moz-box-sizing:border-box;box-sizing:border-box}.noUi-pips{position:absolute;font:400 12px Arial;color:#999}.noUi-value{width:40px;position:absolute;text-align:center}.noUi-value-sub{color:#ccc;font-size:10px}.noUi-marker{position:absolute;background:#CCC}.noUi-marker-large,.noUi-marker-sub{background:#AAA}.noUi-pips-horizontal{padding:10px 0;height:50px;top:100%;left:0;width:100%}.noUi-value-horizontal{margin-left:-20px;padding-top:20px}.noUi-value-horizontal.noUi-value-sub{padding-top:15px}.noUi-marker-horizontal.noUi-marker{margin-left:-1px;width:2px;height:5px}.noUi-marker-horizontal.noUi-marker-sub{height:10px}.noUi-marker-horizontal.noUi-marker-large{height:15px}.noUi-pips-vertical{padding:0 10px;height:100%;top:0;left:100%}.noUi-value-vertical{width:15px;margin-left:20px;margin-top:-5px}.noUi-marker-vertical.noUi-marker{width:5px;height:2px;margin-top:-1px}.noUi-marker-vertical.noUi-marker-sub{width:10px}.noUi-marker-vertical.noUi-marker-large{width:15px} -------------------------------------------------------------------------------- /websrc/bf/js/libraries/switchery/switchery.css: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * Main stylesheet for Switchery. 4 | * http://abpetkov.github.io/switchery/ 5 | * 6 | */ 7 | 8 | /* Switchery defaults. */ 9 | 10 | .switchery { 11 | background-color: #fff; 12 | border: 1px solid #fff; 13 | border-radius: 20px; 14 | cursor: pointer; 15 | display: inline-block; 16 | height: 14px; 17 | position: relative; 18 | vertical-align: middle; 19 | width: 45px; 20 | z-index:1000; 21 | opacity:1 !important; 22 | -moz-user-select: none; 23 | -khtml-user-select: none; 24 | -webkit-user-select: none; 25 | -ms-user-select: none; 26 | user-select: none; 27 | box-sizing: content-box; 28 | background-clip: content-box; 29 | } 30 | 31 | .switchery > small { 32 | background: #fff; 33 | border-radius: 100%; 34 | box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4); 35 | height: 14px; 36 | position: absolute; 37 | top: 0; 38 | width: 14px; 39 | } 40 | 41 | .switcherymid { 42 | background-color: #fff; 43 | border: 1px solid #fff; 44 | border-radius: 20px; 45 | cursor: pointer; 46 | display: inline-block; 47 | height: 14px; 48 | position: relative; 49 | vertical-align: middle; 50 | width: 35px; 51 | 52 | -moz-user-select: none; 53 | -khtml-user-select: none; 54 | -webkit-user-select: none; 55 | -ms-user-select: none; 56 | user-select: none; 57 | box-sizing: content-box; 58 | background-clip: content-box; 59 | } 60 | 61 | .switcherymid > small { 62 | background: #fff; 63 | border-radius: 100%; 64 | box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4); 65 | height: 14px; 66 | position: absolute; 67 | top: 0; 68 | width: 14px; 69 | } 70 | 71 | /* Switchery sizes. */ 72 | 73 | .switchery-small { 74 | border: none !important; 75 | border-radius: 20px; 76 | height: 10px; 77 | width: 20px; 78 | margin-top:-3px; 79 | margin-right:3px; 80 | } 81 | 82 | .switchery-small > small { 83 | height: 10px; 84 | width: 10px; 85 | } 86 | 87 | .switchery-large { 88 | border-radius: 40px; 89 | height: 40px; 90 | width: 66px; 91 | } 92 | 93 | .switchery-large > small { 94 | height: 40px; 95 | width: 40px; 96 | } 97 | 98 | 99 | -------------------------------------------------------------------------------- /websrc/bf/js/localization.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | function localize() { 4 | var localized = 0; 5 | 6 | var translate = function(messageID) { 7 | localized++; 8 | 9 | return getLocalizedMessage(messageID); 10 | }; 11 | 12 | $('[i18n]:not(.i18n-replaced)').each(function() { 13 | var element = $(this); 14 | 15 | element.html(translate(element.attr('i18n'))); 16 | element.addClass('i18n-replaced'); 17 | }); 18 | 19 | $('[i18n_title]:not(.i18n_title-replaced)').each(function() { 20 | var element = $(this); 21 | 22 | element.attr('title', translate(element.attr('i18n_title'))); 23 | element.addClass('i18n_title-replaced'); 24 | }); 25 | 26 | $('[i18n_value]:not(.i18n_value-replaced)').each(function() { 27 | var element = $(this); 28 | 29 | element.val(translate(element.attr('i18n_value'))); 30 | element.addClass('i18n_value-replaced'); 31 | }); 32 | 33 | $('[i18n_placeholder]:not(.i18n_placeholder-replaced)').each(function() { 34 | var element = $(this); 35 | 36 | element.attr('placeholder', translate(element.attr('i18n_placeholder'))); 37 | element.addClass('i18n_placeholder-replaced'); 38 | }); 39 | 40 | return localized; 41 | } -------------------------------------------------------------------------------- /websrc/bf/js/msp/MSPCodes.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | //MSPCodes needs to be re-integrated inside MSP object 4 | var MSPCodes = { 5 | MSP_API_VERSION: 1, 6 | MSP_FC_VARIANT: 2, 7 | MSP_FC_VERSION: 3, 8 | MSP_BOARD_INFO: 4, 9 | MSP_BUILD_INFO: 5, 10 | 11 | MSP_NAME: 10, 12 | MSP_SET_NAME: 11, 13 | 14 | MSP_CHANNEL_FORWARDING: 32, 15 | MSP_SET_CHANNEL_FORWARDING: 33, 16 | MSP_MODE_RANGES: 34, 17 | MSP_SET_MODE_RANGE: 35, 18 | 19 | MSP_RX_CONFIG: 44, 20 | MSP_SET_RX_CONFIG: 45, 21 | MSP_LED_COLORS: 46, 22 | MSP_SET_LED_COLORS: 47, 23 | MSP_LED_STRIP_CONFIG: 48, 24 | MSP_SET_LED_STRIP_CONFIG: 49, 25 | 26 | MSP_ADJUSTMENT_RANGES: 52, 27 | MSP_SET_ADJUSTMENT_RANGE: 53, 28 | MSP_CF_SERIAL_CONFIG: 54, 29 | MSP_SET_CF_SERIAL_CONFIG: 55, 30 | MSP_SONAR: 58, 31 | MSP_PID_CONTROLLER: 59, 32 | MSP_SET_PID_CONTROLLER: 60, 33 | MSP_ARMING_CONFIG: 61, 34 | MSP_SET_ARMING_CONFIG: 62, 35 | MSP_RX_MAP: 64, 36 | MSP_SET_RX_MAP: 65, 37 | MSP_BF_CONFIG: 66, 38 | MSP_SET_BF_CONFIG: 67, 39 | MSP_SET_REBOOT: 68, 40 | MSP_BF_BUILD_INFO: 69, // Not used 41 | MSP_DATAFLASH_SUMMARY: 70, 42 | MSP_DATAFLASH_READ: 71, 43 | MSP_DATAFLASH_ERASE: 72, 44 | MSP_LOOP_TIME: 73, 45 | MSP_SET_LOOP_TIME: 74, 46 | MSP_FAILSAFE_CONFIG: 75, 47 | MSP_SET_FAILSAFE_CONFIG: 76, 48 | MSP_RXFAIL_CONFIG: 77, 49 | MSP_SET_RXFAIL_CONFIG: 78, 50 | MSP_SDCARD_SUMMARY: 79, 51 | MSP_BLACKBOX_CONFIG: 80, 52 | MSP_SET_BLACKBOX_CONFIG: 81, 53 | MSP_TRANSPONDER_CONFIG: 82, 54 | MSP_SET_TRANSPONDER_CONFIG: 83, 55 | MSP_OSD_CONFIG: 84, 56 | MSP_SET_OSD_CONFIG: 85, 57 | MSP_OSD_CHAR_READ: 86, 58 | MSP_OSD_CHAR_WRITE: 87, 59 | MSP_VTX_CONFIG: 88, 60 | MSP_SET_VTX_CONFIG: 89, 61 | MSP_ADVANCED_CONFIG: 90, 62 | MSP_SET_ADVANCED_CONFIG: 91, 63 | MSP_FILTER_CONFIG: 92, 64 | MSP_SET_FILTER_CONFIG: 93, 65 | MSP_PID_ADVANCED: 94, 66 | MSP_SET_PID_ADVANCED: 95, 67 | MSP_SENSOR_CONFIG: 96, 68 | MSP_SET_SENSOR_CONFIG: 97, 69 | MSP_SPECIAL_PARAMETERS: 98, 70 | MSP_SET_SPECIAL_PARAMETERS: 99, 71 | MSP_IDENT: 100, // Not used 72 | MSP_STATUS: 101, 73 | MSP_RAW_IMU: 102, 74 | MSP_SERVO: 103, 75 | MSP_MOTOR: 104, 76 | MSP_RC: 105, 77 | MSP_RAW_GPS: 106, 78 | MSP_COMP_GPS: 107, 79 | MSP_ATTITUDE: 108, 80 | MSP_ALTITUDE: 109, 81 | MSP_ANALOG: 110, 82 | MSP_RC_TUNING: 111, 83 | MSP_PID: 112, 84 | MSP_BOX: 113, // Not used 85 | MSP_MISC: 114, 86 | MSP_MOTOR_PINS: 115, // Not used 87 | MSP_BOXNAMES: 116, 88 | MSP_PIDNAMES: 117, 89 | MSP_WP: 118, // Not used 90 | MSP_BOXIDS: 119, 91 | MSP_SERVO_CONFIGURATIONS: 120, 92 | MSP_3D: 124, 93 | MSP_RC_DEADBAND: 125, 94 | MSP_SENSOR_ALIGNMENT: 126, 95 | MSP_LED_STRIP_MODECOLOR: 127, 96 | 97 | MSP_STATUS_EX: 150, 98 | 99 | MSP_UID: 160, 100 | MSP_GPS_SV_INFO: 164, 101 | 102 | MSP_SET_RAW_RC: 200, 103 | MSP_SET_RAW_GPS: 201, // Not used 104 | MSP_SET_PID: 202, 105 | MSP_SET_BOX: 203, 106 | MSP_SET_RC_TUNING: 204, 107 | MSP_ACC_CALIBRATION: 205, 108 | MSP_MAG_CALIBRATION: 206, 109 | MSP_SET_MISC: 207, 110 | MSP_RESET_CONF: 208, 111 | MSP_SET_WP: 209, // Not used 112 | MSP_SELECT_SETTING: 210, 113 | MSP_SET_HEAD: 211, // Not used 114 | MSP_SET_SERVO_CONFIGURATION:212, 115 | MSP_SET_MOTOR: 214, 116 | MSP_SET_3D: 217, 117 | MSP_SET_RC_DEADBAND: 218, 118 | MSP_SET_RESET_CURR_PID: 219, 119 | MSP_SET_SENSOR_ALIGNMENT: 220, 120 | MSP_SET_LED_STRIP_MODECOLOR:221, 121 | 122 | MSP_SET_ACC_TRIM: 239, 123 | MSP_ACC_TRIM: 240, 124 | MSP_SERVO_MIX_RULES: 241, 125 | MSP_SET_SERVO_MIX_RULE: 242, // Not used 126 | 127 | MSP_EEPROM_WRITE: 250, 128 | MSP_DEBUGMSG: 253, // Not used 129 | MSP_DEBUG: 254 130 | }; -------------------------------------------------------------------------------- /websrc/bf/js/port_usage.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var PortUsage = { 4 | previous_received: 0, 5 | previous_sent: 0, 6 | 7 | initialize: function() { 8 | var self = this; 9 | 10 | self.main_timer_reference = setInterval(function() { 11 | self.update(); 12 | }, 1000); 13 | }, 14 | update: function() { 15 | if (serial.bitrate) { 16 | var port_usage_down = parseInt(((serial.bytesReceived - this.previous_received) * 10 / serial.bitrate) * 100); 17 | var port_usage_up = parseInt(((serial.bytesSent - this.previous_sent) * 10 / serial.bitrate) * 100); 18 | 19 | this.previous_received = serial.bytesReceived; 20 | this.previous_sent = serial.bytesSent; 21 | 22 | // update UI 23 | $('span.port_usage_down').text(getLocalizedMessage('statusbar_usage_download', [port_usage_down])); 24 | $('span.port_usage_up').text(getLocalizedMessage('statusbar_usage_upload', [port_usage_up])); 25 | } else { 26 | $('span.port_usage_down').text(getLocalizedMessage('statusbar_usage_download', [0])); 27 | $('span.port_usage_up').text(getLocalizedMessage('statusbar_usage_upload', [0])); 28 | } 29 | }, 30 | reset: function() { 31 | this.previous_received = 0; 32 | this.previous_sent = 0; 33 | } 34 | }; -------------------------------------------------------------------------------- /websrc/bf/js/workers/hex_parser.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | // input = string 4 | // result = if hex file is valid, result is an object 5 | // if hex file wasn't valid (crc check failed on any of the lines), result will be false 6 | function read_hex_file(data) { 7 | data = data.split("\n"); 8 | 9 | // check if there is an empty line in the end of hex file, if there is, remove it 10 | if (data[data.length - 1] == "") { 11 | data.pop(); 12 | } 13 | 14 | var hexfile_valid = true; // if any of the crc checks failed, this variable flips to false 15 | 16 | var result = { 17 | data: [], 18 | end_of_file: false, 19 | bytes_total: 0, 20 | start_linear_address: 0 21 | }; 22 | 23 | var extended_linear_address = 0; 24 | var next_address = 0; 25 | 26 | for (var i = 0; i < data.length && hexfile_valid; i++) { 27 | // each byte is represnted by two chars 28 | var byte_count = parseInt(data[i].substr(1, 2), 16); 29 | var address = parseInt(data[i].substr(3, 4), 16); 30 | var record_type = parseInt(data[i].substr(7, 2), 16); 31 | var content = data[i].substr(9, byte_count * 2); // still in string format 32 | var checksum = parseInt(data[i].substr(9 + byte_count * 2, 2), 16); // (this is a 2's complement value) 33 | 34 | switch (record_type) { 35 | case 0x00: // data record 36 | if (address != next_address || next_address == 0) { 37 | result.data.push({'address': extended_linear_address + address, 'bytes': 0, 'data': []}); 38 | } 39 | 40 | // store address for next comparison 41 | next_address = address + byte_count; 42 | 43 | // process data 44 | var crc = byte_count + parseInt(data[i].substr(3, 2), 16) + parseInt(data[i].substr(5, 2), 16) + record_type; 45 | for (var needle = 0; needle < byte_count * 2; needle += 2) { // * 2 because of 2 hex chars per 1 byte 46 | var num = parseInt(content.substr(needle, 2), 16); // get one byte in hex and convert it to decimal 47 | var data_block = result.data.length - 1; 48 | 49 | result.data[data_block].data.push(num); 50 | result.data[data_block].bytes++; 51 | 52 | crc += num; 53 | result.bytes_total++; 54 | } 55 | 56 | // change crc to 2's complement 57 | crc = (~crc + 1) & 0xFF; 58 | 59 | // verify 60 | if (crc != checksum) { 61 | hexfile_valid = false; 62 | } 63 | break; 64 | case 0x01: // end of file record 65 | result.end_of_file = true; 66 | break; 67 | case 0x02: // extended segment address record 68 | // not implemented 69 | if (parseInt(content, 16) != 0) { // ignore if segment is 0 70 | console.log('extended segment address record found - NOT IMPLEMENTED !!!'); 71 | } 72 | break; 73 | case 0x03: // start segment address record 74 | // not implemented 75 | if (parseInt(content, 16) != 0) { // ignore if segment is 0 76 | console.log('start segment address record found - NOT IMPLEMENTED !!!'); 77 | } 78 | break; 79 | case 0x04: // extended linear address record 80 | extended_linear_address = (parseInt(content.substr(0, 2), 16) << 24) | parseInt(content.substr(2, 2), 16) << 16; 81 | break; 82 | case 0x05: // start linear address record 83 | result.start_linear_address = parseInt(content, 16) 84 | break; 85 | } 86 | } 87 | 88 | if (result.end_of_file && hexfile_valid) { 89 | postMessage(result); 90 | } else { 91 | postMessage(false); 92 | } 93 | } 94 | 95 | function microtime() { 96 | var now = new Date().getTime() / 1000; 97 | 98 | return now; 99 | } 100 | 101 | onmessage = function(event) { 102 | var time_parsing_start = microtime(); // track time 103 | 104 | read_hex_file(event.data); 105 | 106 | console.log('HEX_PARSER - File parsed in: ' + (microtime() - time_parsing_start).toFixed(4) + ' seconds'); 107 | 108 | // terminate worker 109 | close(); 110 | }; -------------------------------------------------------------------------------- /websrc/bf/models/fallback.json: -------------------------------------------------------------------------------- 1 | { 2 | "metadata": { 3 | "generator": "io_three", 4 | "materials": 1, 5 | "version": 3, 6 | "uvs": 1, 7 | "faces": 6, 8 | "vertices": 8, 9 | "normals": 8, 10 | "type": "Geometry" 11 | }, 12 | "uvs": [[0.6086243987083435,0.38711899518966675,0.3876524865627289,0.3871191442012787,0.3876519501209259,0.007832592353224754,0.6086239218711853,0.007832489907741547,0.6086243987083435,0.43603330850601196,0.6086243987083435,0.815055251121521,0.3876524269580841,0.815055251121521,0.38765251636505127,0.43603357672691345,0.006803446915000677,0.8639163374900818,0.006803446915000677,0.8150559663772583,0.3876524567604065,0.8639156818389893,0.6086243987083435,0.8639156222343445,0.9895890355110168,0.8150553703308105,0.9895889163017273,0.8639156818389893]], 13 | "faces": [43,0,1,2,3,0,0,1,2,3,0,1,2,3,43,4,7,6,5,0,4,5,6,7,4,5,6,7,43,0,4,5,1,0,0,4,7,1,0,4,7,1,43,1,5,6,2,0,8,9,6,10,1,7,6,2,43,2,6,7,3,0,10,6,5,11,2,6,5,3,43,4,0,3,7,0,12,13,11,5,4,0,3,5], 14 | "vertices": [1.806472897529602,0.06793666630983353,4.798364162445068,-2.0212321281433105,0.06793666630983353,4.798975467681885,-2.022766351699829,0.0679362341761589,-4.81230354309082,1.804938793182373,0.0679362341761589,-4.812912464141846,1.8064723014831543,1.3544387817382812,4.798366069793701,-2.021233081817627,1.3544387817382812,4.7989726066589355,-2.022766351699829,1.354438304901123,-4.812304973602295,1.8049381971359253,1.354438304901123,-4.81291389465332], 15 | "normals": [0.5774407386779785,-0.5773491859436035,0.5772576332092285,-0.5772576332092285,-0.5773491859436035,0.5774407386779785,-0.5774407386779785,-0.5773491859436035,-0.5772576332092285,0.5772576332092285,-0.5773491859436035,-0.5774407386779785,0.5774407386779785,0.5773491859436035,0.5772576332092285,0.5772576332092285,0.5773491859436035,-0.5774407386779785,-0.5774407386779785,0.5773491859436035,-0.5772576332092285,-0.5772576332092285,0.5773491859436035,0.5774407386779785], 16 | "name": "Cube.001Geometry", 17 | "materials": [{ 18 | "depthTest": true, 19 | "colorDiffuse": [0.6400000190734865,0.6400000190734865,0.6400000190734865], 20 | "colorAmbient": [0.6400000190734865,0.6400000190734865,0.6400000190734865], 21 | "DbgColor": 15658734, 22 | "mapDiffuseAnisotropy": 1.0, 23 | "visible": true, 24 | "mapDiffuseRepeat": [1,1], 25 | "wireframe": false, 26 | "depthWrite": true, 27 | "DbgIndex": 0, 28 | "DbgName": "Material.003", 29 | "colorEmissive": [0.0,0.0,0.0], 30 | "mapDiffuse": "fallback.png", 31 | "opacity": 1.0, 32 | "specularCoef": 50, 33 | "shading": "phong", 34 | "mapDiffuseWrap": ["RepeatWrapping","RepeatWrapping"], 35 | "blending": "NormalBlending", 36 | "colorSpecular": [0.5,0.5,0.5], 37 | "transparent": false 38 | }] 39 | } -------------------------------------------------------------------------------- /websrc/bf/models/fallback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/me-no-dev/esp8266fcgui/534a7677b5fb22f1fa9ae78ccdadeb5e09bfd21b/websrc/bf/models/fallback.png -------------------------------------------------------------------------------- /websrc/bf/tabs/adjustments.css: -------------------------------------------------------------------------------- 1 | #tab-adjustments-templates { 2 | display: none; 3 | } 4 | 5 | .tab-adjustments .range .marker, .tab-adjustments .channel-slider .noUi-connect { 6 | background: #ffbb00; 7 | box-shadow: inset 0 0px 2px rgba(0, 0, 0, 0.4), 0px 1px 0px rgba(255, 255, 255, 0.6); 8 | } 9 | 10 | .noUi-target { 11 | border-radius: 4px; 12 | border: 1px solid #D3D3D3; 13 | box-shadow: inset 0 0px 2px rgba(0, 0, 0, 0.4), 0px 1px 0px rgba(255, 255, 255, 0.6); 14 | } 15 | 16 | .noUi-background { 17 | box-shadow: inset 0 0px 2px rgba(0, 0, 0, 0.4), 0px 1px 0px rgba(255, 255, 255, 0.6); 18 | background: #D2D2D2; 19 | } 20 | 21 | .tab-adjustments .adjustments { 22 | width: 100%; 23 | border-spacing: 0px; 24 | } 25 | 26 | .tab-adjustments td { 27 | border-top: 1px solid #fff; 28 | border-bottom: 1px solid #cccccc; 29 | } 30 | 31 | .tab-adjustments .range:first-child { 32 | border-top: 0px; 33 | } 34 | 35 | .tab-adjustments .range:last-child { 36 | border-bottom: 0px; 37 | } 38 | 39 | .tab-adjustments .adjustments thead td { 40 | text-align: center; 41 | white-space: nowrap; 42 | padding: 10px 10px; 43 | background-color: #828885; 44 | color: white; 45 | } 46 | 47 | .tab-adjustments .adjustments thead td:first-child { 48 | border-top-left-radius: 5px; 49 | } 50 | 51 | .tab-adjustments .adjustments thead td:last-child { 52 | border-top-right-radius: 5px; 53 | } 54 | 55 | .tab-adjustments .adjustment:nth-child(odd) { 56 | background-color: #f4f4f4; 57 | } 58 | 59 | .tab-adjustments .adjustments { 60 | background-color: #e4e4e4; 61 | } 62 | 63 | .tab-adjustments .adjustment select { 64 | /* outline: 1px solid silver; */ 65 | border-radius: 3px; 66 | border: 1px solid silver; 67 | } 68 | 69 | .tab-adjustments .adjustment td { 70 | text-align: center; 71 | } 72 | 73 | .tab-adjustments .adjustment .info { 74 | width: 5%; 75 | height: 80px; 76 | } 77 | 78 | .tab-adjustments .adjustment .info .enabling { 79 | white-space: nowrap; 80 | } 81 | 82 | .tab-adjustments .adjustment .channelInfo { 83 | width: 5%; 84 | padding: 0px 10px; 85 | } 86 | 87 | .tab-adjustments .adjustment .channelInfo .limits { 88 | padding: 5px 0px; 89 | } 90 | 91 | .tab-adjustments .adjustment .range { 92 | width: 65%; 93 | padding: 0px 20px; 94 | } 95 | 96 | .tab-adjustments .adjustment .range .channel-slider { 97 | margin-top: -28px; 98 | } 99 | 100 | .tab-adjustments .adjustment .range .marker { 101 | position: absolute; 102 | left: 50%; 103 | top: 27px; 104 | height: 13px; 105 | width: 6px; 106 | margin-left: -3px; 107 | border-radius: 3px; 108 | } 109 | 110 | .tab-adjustments .adjustment .functionSelection { 111 | width: 5%; 112 | } 113 | 114 | .tab-adjustments .adjustment .adjustmentSlot { 115 | width: 5%; 116 | } 117 | 118 | .tab-adjustments .adjustment .functionSwitchChannel { 119 | width: 5%; 120 | } 121 | 122 | .tab-adjustments .spacebottom { 123 | margin-bottom: 15px; 124 | } -------------------------------------------------------------------------------- /websrc/bf/tabs/adjustments.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 | 6 |
7 |
8 |
9 |

10 |

11 |
    12 |
  • 13 |
  • 14 |
15 |
16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
32 |
33 |
34 |
35 | 36 |
37 |
38 |
39 | 40 |
41 | 42 | 43 | 44 | 49 | 64 | 69 | 93 | 99 | 102 | 103 | 104 |
45 |
46 | 47 |
48 |
50 |
51 | 54 |
55 |
56 |

57 | : 58 |

59 |

60 | : 61 |

62 |
63 |
65 |
66 |
67 |
68 |
105 |
106 | -------------------------------------------------------------------------------- /websrc/bf/tabs/auxiliary.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
tabAuxiliary
4 |
5 | 6 |
7 |
8 |
9 |

10 |
11 |
12 | 13 | 14 | 15 |
16 |
17 |
18 |
19 | 20 |
21 |
22 |
23 |
24 | 25 | 26 | 27 | 33 | 34 | 35 | 36 |
28 |

29 |
30 | 31 |
32 |
37 |
38 |
39 | 42 |
43 |

44 | : 45 |

46 |

47 | : 48 |

49 |
50 |
51 |
52 |
53 |
54 |
55 |   56 |
57 |
58 |
59 | -------------------------------------------------------------------------------- /websrc/bf/tabs/blank.html: -------------------------------------------------------------------------------- 1 |
2 | -------------------------------------------------------------------------------- /websrc/bf/tabs/cli.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |

6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 | 14 |
15 |
16 | -------------------------------------------------------------------------------- /websrc/bf/tabs/gps.css: -------------------------------------------------------------------------------- 1 | .tab-gps progress { 2 | width: 100%; 3 | border-radius: 3px; 4 | } 5 | 6 | .tab-gps .GPS_info .head, .tab-gps .GPS_signal_strength .head { 7 | display: block; 8 | text-align: center; 9 | line-height: 20px; 10 | font-weight: bold; 11 | border-bottom: 1px solid silver; 12 | background-color: #ececec; 13 | } 14 | 15 | .tab-gps .gps_map { 16 | height: 460px; 17 | } 18 | 19 | 20 | .tab-gps #connect { 21 | display:none; 22 | text-align:center; 23 | padding-top:40%; 24 | } 25 | 26 | .tab-gps #waiting { 27 | margin-top: 0px; 28 | display: none; 29 | text-align: center; 30 | padding-top: 0px; 31 | background-image: url('data:image/svg+xml;utf8, '); 32 | background-position: center 40%; 33 | background-size: 15%; 34 | height: 100%; 35 | background-repeat: no-repeat; 36 | float: left; 37 | width: 100%; 38 | } 39 | 40 | .tab-gps #waiting .info { 41 | margin-top: 50%; 42 | } 43 | 44 | .tab-gps #loadmap { 45 | margin-top:0px; 46 | display:none; 47 | } 48 | 49 | .tab-gps #connect a { 50 | font-weight: bold; 51 | margin-top:10px; 52 | } 53 | 54 | 55 | .tab-gps #loadmap { 56 | height: 100%; 57 | width: 100%; 58 | float: left; 59 | } 60 | 61 | 62 | .tab-gps #loadmap .controls { 63 | width: 100%; 64 | float: left; 65 | height: 33px; 66 | border-bottom-left-radius: 3px; 67 | border-bottom-right-radius: 3px; 68 | background-color: #D1D1D1; 69 | } 70 | 71 | .tab-gps #loadmap .controls a { 72 | background-color: white; 73 | border-radius: 4px; 74 | border: 1px silver solid; 75 | color: grey; 76 | height: 10px; 77 | width: 10px; 78 | text-align: center; 79 | font-size: 20px; 80 | line-height: 10px; 81 | padding: 6px; 82 | margin-top: 5px; 83 | float: right; 84 | } 85 | 86 | .tab-gps #loadmap .controls a:hover { 87 | background-color: #f5f5f5; 88 | } 89 | 90 | .tab-gps #loadmap .controls a:active { 91 | background-color: #e6e6e6; 92 | } 93 | 94 | .tab-gps #loadmap .controls a:first-child { 95 | margin-left: -1px; 96 | margin-right: 5px; 97 | border-bottom-left-radius: 0px; 98 | border-top-left-radius: 0px; 99 | } 100 | .tab-gps #loadmap .controls a:last-child { 101 | margin-right: 0px; 102 | border-bottom-right-radius: 0px; 103 | border-top-right-radius: 0px; 104 | } 105 | 106 | .tab-gps iframe { 107 | height: 400px; 108 | width: 100%; 109 | float: left; 110 | } 111 | 112 | 113 | progress[value]::-webkit-progress-bar { 114 | background-color: #d2d2d2; 115 | border-radius: 2px; 116 | box-shadow: 1px 1px 0 rgba(255, 255, 255, 0.95); 117 | box-shadow: 0 0 3px rgba(0, 0, 0, 0.25) inset; 118 | } 119 | 120 | progress[value]::-webkit-progress-value { 121 | background-image: -webkit-linear-gradient(top, rgba(255, 255, 255, .15), rgba(0, 0, 0, .15)), 122 | -webkit-linear-gradient(left, #ffbb00, #ffbb00); 123 | border-radius: 2px; 124 | box-shadow: 0px 0px 3px rgba(0, 0, 0, 0.25) inset; 125 | } 126 | 127 | 128 | @media only screen and (max-width: 1055px) , only screen and (max-device-width: 1055px) { 129 | 130 | .tab-gps iframe { 131 | height: 347px; 132 | width: 100%; 133 | float: left; 134 | } 135 | 136 | .tab-gps .gps_map { 137 | height: 403px; 138 | } 139 | 140 | } 141 | -------------------------------------------------------------------------------- /websrc/bf/tabs/gps.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | TABS.gps = {}; 4 | TABS.gps.initialize = function (callback) { 5 | var self = this; 6 | 7 | if (GUI.active_tab != 'gps') { 8 | GUI.active_tab = 'gps'; 9 | } 10 | 11 | function load_html() { 12 | $('#content').load("./tabs/gps.html", process_html); 13 | } 14 | 15 | MSP.send_message(MSPCodes.MSP_STATUS, false, false, load_html); 16 | 17 | function set_online(){ 18 | $('#connect').hide(); 19 | $('#waiting').show(); 20 | $('#loadmap').hide(); 21 | } 22 | 23 | function set_offline(){ 24 | $('#connect').show(); 25 | $('#waiting').hide(); 26 | $('#loadmap').hide(); 27 | } 28 | 29 | function process_html() { 30 | // translate to user-selected languageconsole.log('Online'); 31 | localize(); 32 | 33 | function get_raw_gps_data() { 34 | MSP.send_message(MSPCodes.MSP_RAW_GPS, false, false, get_comp_gps_data); 35 | } 36 | 37 | function get_comp_gps_data() { 38 | MSP.send_message(MSPCodes.MSP_COMP_GPS, false, false, get_gpsvinfo_data); 39 | } 40 | 41 | function get_gpsvinfo_data() { 42 | MSP.send_message(MSPCodes.MSP_GPS_SV_INFO, false, false, update_ui); 43 | } 44 | 45 | function update_ui() { 46 | var lat = GPS_DATA.lat / 10000000; 47 | var lon = GPS_DATA.lon / 10000000; 48 | var url = 'https://maps.google.com/?q=' + lat + ',' + lon; 49 | 50 | $('.GPS_info td.fix').html((GPS_DATA.fix) ? getLocalizedMessage('gpsFixTrue') : getLocalizedMessage('gpsFixFalse')); 51 | $('.GPS_info td.alt').text(GPS_DATA.alt + ' m'); 52 | $('.GPS_info td.lat a').prop('href', url).text(lat.toFixed(4) + ' deg'); 53 | $('.GPS_info td.lon a').prop('href', url).text(lon.toFixed(4) + ' deg'); 54 | $('.GPS_info td.speed').text(GPS_DATA.speed + ' cm/s'); 55 | $('.GPS_info td.sats').text(GPS_DATA.numSat); 56 | $('.GPS_info td.distToHome').text(GPS_DATA.distanceToHome + ' m'); 57 | 58 | // Update GPS Signal Strengths 59 | var e_ss_table = $('div.GPS_signal_strength table tr:not(.titles)'); 60 | 61 | for (var i = 0; i < GPS_DATA.chn.length; i++) { 62 | var row = e_ss_table.eq(i); 63 | 64 | $('td', row).eq(0).text(GPS_DATA.svid[i]); 65 | $('td', row).eq(1).text(GPS_DATA.quality[i]); 66 | $('td', row).eq(2).find('progress').val(GPS_DATA.cno[i]); 67 | } 68 | 69 | 70 | var message = { 71 | action: 'center', 72 | lat: lat, 73 | lon: lon, 74 | }; 75 | 76 | var frame = document.getElementById('map'); 77 | if (navigator.onLine) { 78 | $('#connect').hide(); 79 | 80 | //if(lat != 0 && lon != 0){ 81 | if(GPS_DATA.fix){ 82 | frame.contentWindow.postMessage(message, '*'); 83 | $('#loadmap').show(); 84 | $('#waiting').hide(); 85 | }else{ 86 | $('#loadmap').hide(); 87 | $('#waiting').show(); 88 | } 89 | }else{ 90 | $('#connect').show(); 91 | $('#waiting').hide(); 92 | $('#loadmap').hide(); 93 | } 94 | } 95 | 96 | // enable data pulling 97 | GUI.interval_add('gps_pull', function gps_update() { 98 | // avoid usage of the GPS commands until a GPS sensor is detected for targets that are compiled without GPS support. 99 | if (!have_sensor(CONFIG.activeSensors, 'gps')) { 100 | //return; 101 | } 102 | 103 | get_raw_gps_data(); 104 | }, 75, true); 105 | 106 | // status data pulled via separate timer with static speed 107 | GUI.interval_add('status_pull', function status_pull() { 108 | MSP.send_message(MSPCodes.MSP_STATUS); 109 | }, 250, true); 110 | 111 | 112 | //check for internet connection on load 113 | if (navigator.onLine) { 114 | console.log('Online'); 115 | set_online(); 116 | } else { 117 | console.log('Offline'); 118 | set_offline(); 119 | } 120 | 121 | $("#check").on('click',function(){ 122 | if (navigator.onLine) { 123 | console.log('Online'); 124 | set_online(); 125 | } else { 126 | console.log('Offline'); 127 | set_offline(); 128 | } 129 | }); 130 | 131 | var frame = document.getElementById('map'); 132 | 133 | $('#zoom_in').click(function() { 134 | console.log('zoom in'); 135 | var message = { 136 | action: 'zoom_in', 137 | }; 138 | frame.contentWindow.postMessage(message, '*'); 139 | }); 140 | 141 | $('#zoom_out').click(function() { 142 | console.log('zoom out'); 143 | var message = { 144 | action: 'zoom_out' 145 | }; 146 | frame.contentWindow.postMessage(message, '*'); 147 | }); 148 | 149 | GUI.content_ready(callback); 150 | } 151 | 152 | }; 153 | 154 | 155 | 156 | TABS.gps.cleanup = function (callback) { 157 | if (callback) callback(); 158 | }; 159 | -------------------------------------------------------------------------------- /websrc/bf/tabs/help.css: -------------------------------------------------------------------------------- 1 | .tab-help .twothird { 2 | width: calc(67% - 15px); 3 | margin-right: 15px; 4 | } 5 | 6 | .tab-help .gui_box { 7 | min-height: 500px; 8 | margin-bottom: 0px; 9 | } 10 | 11 | .tab-help ul { 12 | margin-bottom:15px; 13 | } 14 | 15 | .tab-help li { 16 | border-top: 1px dotted silver; 17 | padding-top: 5px; 18 | padding-bottom: 5px; 19 | background-image: url('data:image/svg+xml;utf8, '); 20 | background-repeat: no-repeat; 21 | background-position: 0px 8px; 22 | background-size: 12px; 23 | } 24 | 25 | .tab-help li span { 26 | margin-left: 17px; 27 | display:block; 28 | } 29 | 30 | .tab-help li span a { 31 | color: #ffbb00; 32 | } 33 | 34 | .tab-help .subline { 35 | margin-bottom: 5px; 36 | } -------------------------------------------------------------------------------- /websrc/bf/tabs/help.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |

10 |
    11 |
  • 12 |
  • 13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |

24 |
25 |
    26 |
  • 27 |
  • 28 |
29 | 30 |
31 |
    32 |
  • 33 |
  • 34 |
  • 35 |
36 | 37 |
38 |
39 |
40 |
41 |
-------------------------------------------------------------------------------- /websrc/bf/tabs/help.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | TABS.help = {}; 4 | TABS.help.initialize = function (callback) { 5 | var self = this; 6 | 7 | if (GUI.active_tab != 'help') { 8 | GUI.active_tab = 'help'; 9 | } 10 | 11 | $('#content').load("./tabs/help.html", function () { 12 | localize(); 13 | 14 | GUI.content_ready(callback); 15 | }); 16 | }; 17 | 18 | TABS.help.cleanup = function (callback) { 19 | if (callback) callback(); 20 | }; 21 | -------------------------------------------------------------------------------- /websrc/bf/tabs/landing.css: -------------------------------------------------------------------------------- 1 | /* general layout */ 2 | .tab-landing { 3 | min-height: 100%; 4 | overflow: hidden; 5 | } 6 | 7 | .tab-landing .content_wrapper { 8 | padding: 0; 9 | min-height: 100%; 10 | height: 100%; 11 | overflow-y: auto; 12 | background-color: #2e2e2e; 13 | } 14 | 15 | .tab-landing .content_top { 16 | height: 140px; 17 | background: #fff; 18 | padding: 20px; 19 | background-color: #FFFFFF; 20 | background-size: 300px; 21 | } 22 | 23 | .tab-landing .content_mid { 24 | background-color: #ffbb00; 25 | overflow: hidden; 26 | } 27 | 28 | .tab-landing .content_foot { 29 | clear: both; 30 | padding: 20px; 31 | padding-bottom: 5px; 32 | } 33 | 34 | /* hero block */ 35 | .tab-landing .logowrapper { 36 | margin-left: auto; 37 | margin-right: auto; 38 | margin-top: 5px; 39 | width: 800px; 40 | color: black; 41 | font-size: 14px; 42 | font-family: 'open_sanslight', Arial; 43 | } 44 | 45 | .tab-landing .logowrapper img { 46 | width: 600px; 47 | margin: 5px; 48 | } 49 | 50 | .tab-landing .logowrapper span { 51 | font-size: 22px; 52 | font-family: 'open_sanslight', Arial; 53 | } 54 | 55 | /* sponsors blocks */ 56 | .sponsors .title { 57 | text-transform: uppercase; 58 | font-size: 10px; 59 | } 60 | 61 | .sponsors { 62 | margin-left: auto; 63 | margin-right: auto; 64 | text-align: center; 65 | color: silver; 66 | } 67 | 68 | .sponsors ul { 69 | margin-top: 5px; 70 | } 71 | 72 | .sponsors li { 73 | display: inline-block; 74 | margin-right: 10px; 75 | } 76 | 77 | .sponsors li a { 78 | border-radius: 3px; 79 | padding: 2px; 80 | padding-left: 4px; 81 | padding-right: 4px; 82 | font-size: 13px; 83 | line-height: 22px; 84 | color: white; 85 | font-weight: normal; 86 | font-family: 'open_sanslight', Arial; 87 | } 88 | 89 | .sponsors li a:hover { 90 | background-color: rgba(255, 255, 255, 0.30); 91 | color: #fff; 92 | } 93 | 94 | .text1, .text2, .text3 { 95 | margin-top: 15px; 96 | margin-bottom: 15px; 97 | font-weight: normal; 98 | font-family: 'open_sansregular', Arial; 99 | font-size: 12px; 100 | } 101 | 102 | /* text columns */ 103 | .tab-landing .content_mid .column .wrap { 104 | padding: 15px; 105 | padding-bottom: 0px; 106 | padding-top: 0px; 107 | } 108 | 109 | .tab-landing .content_mid .column .wrap2 { 110 | padding: 10px; 111 | padding-bottom: 10px; 112 | padding-top: 10px; 113 | } 114 | 115 | .tab-landing .content_mid h2 { 116 | margin-bottom: 5px; 117 | font-size: 13px; 118 | } 119 | 120 | .tab-landing .content_mid h3 { 121 | font-size: 12px; 122 | margin-bottom: 5px; 123 | 124 | } 125 | 126 | .tab-landing .content_mid .text1 .wrap { 127 | margin-left: 0px; 128 | } 129 | 130 | .tab-landing .content_mid .text1 { 131 | width: 37%; 132 | } 133 | 134 | .tab-landing .content_mid .text2 { 135 | width: 40%; 136 | } 137 | 138 | .tab-landing .content_mid .text2 ul { 139 | margin-top: 10px; 140 | } 141 | 142 | .tab-landing .content_mid .text2 li { 143 | padding: 5px 0; 144 | border-top: 1px dotted silver; 145 | } 146 | 147 | .tab-landing .content_mid .text3 { 148 | width: 23%; 149 | } 150 | 151 | .tab-landing .content_mid .text3 .wrap2 { 152 | border: 1px solid silver; 153 | border-radius: 5px; 154 | background: white; 155 | margin-right: 25px; 156 | margin-left: 20px; 157 | margin-top: 5px; 158 | min-height: 187px; 159 | font-size: 11px; 160 | } 161 | 162 | .tab-landing .content_mid .text3 .donate { 163 | margin-top: 10px; 164 | text-align: center; 165 | } 166 | 167 | /* changelog block */ 168 | #changelog { 169 | width: 250px; 170 | height: 100%; 171 | position: fixed; 172 | right: -245px; 173 | top: 0px; 174 | } 175 | 176 | #changelog .wrapper { 177 | height: 100%; 178 | padding: 0 20px; 179 | border-left: 5px solid #ffbb00; 180 | overflow-y: auto; 181 | display: none; 182 | } 183 | 184 | #changelog .button { 185 | transform: rotate(270deg); 186 | top: 50px; 187 | right: 215px; 188 | position: absolute; 189 | background: #ffbb00; 190 | border-radius: 5px 5px 0 0; 191 | border-bottom: none; 192 | height: 30px; 193 | } 194 | 195 | #changelog .button a { 196 | display: block; 197 | padding: 5px 10px; 198 | width: 70px; 199 | text-align: center; 200 | color: #000; 201 | } 202 | 203 | #changelog .title { 204 | margin: 20px 0; 205 | font-size: 16px; 206 | } 207 | 208 | #content.log_open #changelog { 209 | right: 0px; 210 | background: white; 211 | } 212 | 213 | #content.log_open #changelog .wrapper { 214 | display: block; 215 | } 216 | 217 | /* changelog content */ 218 | #changelog .log { 219 | line-height: 17px; 220 | } 221 | 222 | #changelog .log span { 223 | display: block; 224 | font-weight: bold; 225 | padding-bottom: 5px; 226 | border-bottom: 1px solid #ddd; 227 | } 228 | 229 | #changelog .log ul { 230 | margin: 5px 0 20px 10px; 231 | } 232 | 233 | #changelog .log li { 234 | font-weight: normal; 235 | margin-bottom: 5px; 236 | } 237 | 238 | #changelog .log p { 239 | margin-bottom: 20px; 240 | } -------------------------------------------------------------------------------- /websrc/bf/tabs/landing.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 | 6 |
7 |
8 |
9 |
10 |
11 |
12 |

Hardware

13 |
14 |
15 |
16 |
17 |
18 |

19 |
20 |
21 |
22 |
23 |
24 |

25 |
26 | 32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 | Changelog 43 |
44 |
45 |
46 |
47 | 48 |
49 |
50 |
51 |
52 | -------------------------------------------------------------------------------- /websrc/bf/tabs/landing.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | TABS.landing = {}; 4 | TABS.landing.initialize = function (callback) { 5 | var self = this; 6 | 7 | if (GUI.active_tab != 'landing') { 8 | GUI.active_tab = 'landing'; 9 | } 10 | 11 | $('#content').load("./tabs/landing.html", function () { 12 | // translate to user-selected language 13 | localize(); 14 | 15 | // load changelog content 16 | $('#changelog .log').load('./changelog.html'); 17 | 18 | /** changelog trigger **/ 19 | $("#changelog_toggle").on('click', function() { 20 | var state = $(this).data('state2'); 21 | if (state) { 22 | $("#changelog").animate({right: -245}, 200, function () { 23 | $("#content").removeClass('log_open'); 24 | }); 25 | state = false; 26 | } else { 27 | $("#changelog").animate({right: 0}, 200); 28 | $("#content").addClass('log_open'); 29 | state = true; 30 | } 31 | $(this).text(state ? 'Close' : 'Changelog'); 32 | $(this).data('state2', state); 33 | }); 34 | 35 | GUI.content_ready(callback); 36 | }); 37 | 38 | }; 39 | 40 | TABS.landing.cleanup = function (callback) { 41 | if (callback) callback(); 42 | }; 43 | -------------------------------------------------------------------------------- /websrc/bf/tabs/map.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Asynchronous Loading 5 | 6 | 7 | 14 | 96 | 97 | 98 |
99 | -------------------------------------------------------------------------------- /websrc/bf/tabs/options.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
5 | 6 |
7 | -------------------------------------------------------------------------------- /websrc/bf/tabs/ports.css: -------------------------------------------------------------------------------- 1 | .tab-ports { 2 | position: relative; 3 | } 4 | 5 | #tab-ports-templates { 6 | display: none; 7 | } 8 | 9 | .tab-ports table { 10 | margin-bottom: 10px; 11 | width: 100%; 12 | border-collapse: collapse; 13 | } 14 | 15 | .tab-ports table, .tab-ports table th, .tab-ports table td { 16 | border-left: 0px; 17 | border-right: 0px; 18 | border-top: 0px; 19 | } 20 | 21 | .tab-ports table tr td:first-child { 22 | text-align: left; 23 | } 24 | 25 | .tab-ports table td { 26 | border-bottom: 1px solid #e4e4e4; 27 | padding: 6px 5px 7px 5px; 28 | border-left: 1px solid #e4e4e4; 29 | border-right: 1px solid #e4e4e4; 30 | } 31 | 32 | .tab-ports table thead tr:first-child, .tab-ports table tr:nth-child(even) { 33 | background-color: #f9f9f9; 34 | } 35 | 36 | .tab-ports table thead tr:first-child { 37 | background-color: #e4e4e4; 38 | font-size: 12px; 39 | height: 25px; 40 | font-family: 'open_sansregular', Arial; 41 | border-top: 0px; 42 | border-right: 0px; 43 | border-left: 0px; 44 | } 45 | 46 | .tab-ports .function input { 47 | vertical-align: -2px; 48 | } 49 | 50 | .tab-ports .function label { 51 | margin-right: 5px; 52 | } 53 | 54 | .tab-ports select { 55 | border: 1px solid silver; 56 | margin-right: 3px; 57 | } 58 | 59 | .tab-ports .require-support { 60 | display: none; 61 | } 62 | 63 | .tab-ports.supported .require-support { 64 | display: block; 65 | } 66 | 67 | .tab-ports .require-upgrade { 68 | display: block; 69 | } 70 | 71 | .tab-ports.supported .require-upgrade { 72 | display: none; 73 | } 74 | 75 | .tab-ports .ports thead td { 76 | text-align: left; 77 | white-space: nowrap; 78 | padding: 5px 7px; 79 | background-color: #828885; 80 | color: white; 81 | } 82 | 83 | .tab-ports .ports thead td:first-child { 84 | border-top-left-radius: 5px; 85 | border-left: 0px; 86 | } 87 | 88 | .tab-ports .ports thead td:last-child { 89 | border-top-right-radius: 5px; 90 | border-right: 0px; 91 | } 92 | 93 | .tab-ports .spacebottom { 94 | margin-bottom: 20px; 95 | } 96 | 97 | @media only screen and (max-width: 1055px) , only screen and (max-device-width: 1055px) { 98 | .tab-ports table thead tr:first-child { 99 | font-size: 12px; 100 | height: 22px; 101 | } 102 | } -------------------------------------------------------------------------------- /websrc/bf/tabs/ports.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
Ports
4 |
5 | 6 |
7 |
8 |
9 |
10 |

11 |

12 |
13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
IdentifierDataLoggingTelemetryRXGPS
28 |
29 |
30 |
31 |
32 |

33 |
34 |
35 |
36 |
37 |
38 | 39 |
40 |
41 |
42 |
43 | 44 | 45 | 46 | 47 | 48 | 51 | 54 | 57 | 60 | 61 | 64 | 65 | 66 |
49 |

50 |
67 |
68 | -------------------------------------------------------------------------------- /websrc/bf/tabs/review.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

4 |

5 |

6 |
7 |
8 |
9 |
10 |
11 |
-------------------------------------------------------------------------------- /websrc/bf/tabs/sensors.css: -------------------------------------------------------------------------------- 1 | .tab-sensors .info { 2 | margin-bottom: 10px; 3 | margin-top: 8px; 4 | margin-left: 10px; 5 | } 6 | 7 | .tab-sensors .info input { 8 | vertical-align: middle; 9 | margin: 0 5px 0 15px; 10 | } 11 | 12 | .tab-sensors .info .first { 13 | margin: 0 5px 0 0; 14 | } 15 | 16 | .tab-sensors .wrapper { 17 | display: none; 18 | } 19 | 20 | .tab-sensors .plot_control { 21 | float: right; 22 | width: 160px; 23 | /* border: 1px solid silver; */ 24 | height: 100%; 25 | height: 160px; 26 | margin: 0px; 27 | background-color: #ECECEC; 28 | border-top-right-radius: 3px; 29 | border-bottom-right-radius: 3px; 30 | } 31 | 32 | .tab-sensors .plot_control .title { 33 | line-height: 20px; 34 | font-weight: bold; 35 | padding-left: 10px; 36 | padding-top: 10px; 37 | text-align: left; 38 | } 39 | 40 | .tab-sensors .plot_control dl { 41 | padding: 10px 10px 0 10px; 42 | line-height: 22px; 43 | float: left; 44 | } 45 | 46 | .tab-sensors .plot_control dt { 47 | float: left; 48 | width: 60px; 49 | height: 22px; 50 | font-weight: bold; 51 | } 52 | 53 | .tab-sensors .plot_control dd { 54 | /* margin-left: 20px; */ 55 | height: 25px; 56 | float: right; 57 | width: 73px; 58 | } 59 | 60 | .tab-sensors .plot_control select { 61 | float: right; 62 | width: 80px; 63 | border: 1px solid silver; 64 | } 65 | 66 | .tab-sensors .plot_control .x { 67 | background-color: #00A8F0; 68 | padding: 3px; 69 | color: #fff; 70 | height: 12px; 71 | float: right; 72 | border-radius: 3px; 73 | line-height: 12px; 74 | margin-bottom: 2px; 75 | } 76 | 77 | .tab-sensors .plot_control .y { 78 | background-color: #C0D800; 79 | padding: 3px; 80 | color: #fff; 81 | height: 12px; 82 | float: right; 83 | border-radius: 3px; 84 | line-height: 12px; 85 | margin-bottom: 2px; 86 | } 87 | 88 | .tab-sensors .plot_control .z { 89 | background-color: #CB4B4B; 90 | padding: 3px; 91 | color: #fff; 92 | height: 12px; 93 | float: right; 94 | border-radius: 3px; 95 | line-height: 12px; 96 | margin-bottom: 2px; 97 | } 98 | 99 | .tab-sensors .plot_control .x, .tab-sensors .plot_control .y, .tab-sensors .plot_control .z { 100 | text-align: right; 101 | } 102 | /* SVG classes*/ 103 | .tab-sensors svg { 104 | float: left; 105 | width: calc(100% - 180px); 106 | height: 140px; 107 | margin-bottom: 10px; 108 | margin-top: 10px; 109 | margin-left: 10px; 110 | } 111 | 112 | .tab-sensors .grid .tick { 113 | stroke: silver; 114 | stroke-width: 1px; 115 | shape-rendering: crispEdges; 116 | } 117 | 118 | .tab-sensors .grid path { 119 | stroke-width: 0; 120 | } 121 | 122 | .tab-sensors .data .line { 123 | stroke-width: 2px; 124 | fill: none; 125 | } 126 | 127 | .tab-sensors .axis path, .tab-sensors .axis line { 128 | fill: none; 129 | stroke: #ccc; 130 | stroke-width: 1px; 131 | shape-rendering: crispEdges; 132 | } 133 | 134 | .tab-sensors text { 135 | stroke: none; 136 | fill: #828885; 137 | font-size: 10px; 138 | } 139 | 140 | .tab-sensors .line:nth-child(1) { 141 | stroke: #00A8F0; 142 | } 143 | 144 | .tab-sensors .line:nth-child(2) { 145 | stroke: #C0D800; 146 | } 147 | 148 | .tab-sensors .line:nth-child(3) { 149 | stroke: #CB4B4B; 150 | } 151 | 152 | .tab-sensors .line:nth-child(4) { 153 | stroke: #4DA74D; 154 | } 155 | 156 | .tab-sensors .legend .item:nth-child(1) { 157 | fill: #00A8F0; 158 | } 159 | 160 | .tab-sensors .legend .item:nth-child(2) { 161 | fill: #C0D800; 162 | } 163 | 164 | .tab-sensors .legend .item:nth-child(3) { 165 | fill: #CB4B4B; 166 | } 167 | 168 | .tab-sensors .legend .item:nth-child(4) { 169 | fill: #4DA74D; 170 | } -------------------------------------------------------------------------------- /websrc/bf/tabs/servos.css: -------------------------------------------------------------------------------- 1 | .tab-servos .title { 2 | margin-top: 0px; 3 | line-height: 30px; 4 | text-align: center; 5 | font-weight: bold; 6 | border: 1px solid #e4e4e4; 7 | border-bottom: 0; 8 | background-color: #DADADA; 9 | color: #797979; 10 | border-top-right-radius: 5px; 11 | border-top-left-radius: 5px; 12 | } 13 | 14 | .tab-servos table { 15 | margin-bottom: 10px; 16 | width: 100%; 17 | border-collapse: collapse; 18 | } 19 | 20 | .tab-servos table, .tab-servos table th, .tab-servos table td { 21 | border-left: 0px; 22 | border-right: 0px; 23 | border-top: 0px; 24 | } 25 | 26 | .tab-servos input[type="number"]::-webkit-inner-spin-button { 27 | border: 0; 28 | } 29 | 30 | .tab-servos .directions .direction select { 31 | height: 19px; 32 | line-height: 19px; 33 | } 34 | 35 | .tab-servos table th { 36 | padding-top: 3px; 37 | padding-bottom: 3px; 38 | text-align: center; 39 | border: 1px solid #e4e4e4; 40 | } 41 | 42 | .tab-servos table td { 43 | border-bottom: 1px solid #e4e4e4; 44 | padding: 6px 5px 7px 5px; 45 | border-left: 1px solid #e4e4e4; 46 | border-right: 1px solid #e4e4e4; 47 | } 48 | 49 | .tab-servos table tr:nth-child(even) { 50 | background-color: #f9f9f9; 51 | } 52 | 53 | .tab-servos table tr:first-child { 54 | border-left: 1px solid #e4e4e4; 55 | border-right: 1px solid #e4e4e4; 56 | background-color: #828885; 57 | color: #FFF; 58 | line-height: 14px; 59 | } 60 | 61 | .tab-servos table td:nth-child(2) { 62 | width: 140px; 63 | } 64 | 65 | .tab-servos table td:nth-child(3) { 66 | width: 140px; 67 | } 68 | 69 | .tab-servos table td:nth-child(4) { 70 | width: 140px; 71 | } 72 | 73 | .tab-servos table td:nth-child(19) { 74 | width: 110px; 75 | } 76 | 77 | .tab-servos table .main { 78 | font-weight: bold; 79 | text-align: center; 80 | background-color: #ececec; 81 | } 82 | 83 | .tab-servos table .channel { 84 | width: 40px; 85 | text-align: center; 86 | } 87 | 88 | .tab-servos table input { 89 | border: 1px solid silver; 90 | border-radius: 3px; 91 | } 92 | 93 | .tab-servos table select { 94 | border: 1px solid silver; 95 | } 96 | 97 | .tab-servos table .channel input { 98 | vertical-align: middle; 99 | } 100 | 101 | .tab-servos table input[type="number"] { 102 | display: block; 103 | width: 100%; 104 | height: 20px; 105 | line-height: 20px; 106 | text-align: right; 107 | } 108 | 109 | .tab-servos .direction .name { 110 | float: left; 111 | display: block; 112 | width: 60px; 113 | } 114 | 115 | .tab-servos .direction .alternate { 116 | float: left; 117 | display: block; 118 | width: 60px; 119 | } 120 | 121 | .tab-servos .direction .first { 122 | float: left; 123 | margin: 2px 10px 0 20px; 124 | } 125 | 126 | .tab-servos .direction .second { 127 | float: left; 128 | margin: 2px 10px 0 0; 129 | } 130 | 131 | .tab-servos .direction .rate { 132 | width: 110px; 133 | height: 20px; 134 | text-align: center; 135 | } 136 | 137 | .tab-servos .live { 138 | float: left; 139 | margin-top: 0px; 140 | } 141 | 142 | .tab-servos .live span { 143 | float: left; 144 | } 145 | 146 | .tab-servos .live input { 147 | float: left; 148 | margin: 0 0 0 5px; 149 | } 150 | 151 | .tab-servos .buttons { 152 | width: calc(100% - 20px); 153 | position: absolute; 154 | bottom: 10px; 155 | } 156 | 157 | .tab-servos .require-support { 158 | display: none; 159 | } 160 | 161 | .tab-servos.supported .require-support { 162 | display: block; 163 | } 164 | 165 | .tab-servos .require-upgrade { 166 | display: block; 167 | } 168 | 169 | .tab-servos.supported .require-upgrade { 170 | display: none; 171 | } 172 | 173 | .tab-servos .live span { 174 | margin-right: 10px; 175 | } 176 | 177 | .tab-servos .wide { 178 | width: 120px; 179 | } 180 | 181 | .tab-servos .short { 182 | width: 40px; 183 | } -------------------------------------------------------------------------------- /websrc/bf/tabs/servos.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
Servos
4 |
5 | 6 |
7 |
8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
CH1CH2CH3CH4
23 |
24 | 25 |
26 |
27 |
28 |
29 |

30 |
31 |
32 |
33 |
34 |
35 | 36 |
37 |
38 |
-------------------------------------------------------------------------------- /websrc/bf/tabs/transponder.css: -------------------------------------------------------------------------------- 1 | .tab-transponder .spacer_box { 2 | padding-bottom: 10px; 3 | float: left; 4 | width: calc(100% - 20px); 5 | } 6 | 7 | .tab-transponder .text input { 8 | width: 100px; 9 | padding-left: 3px; 10 | height: 20px; 11 | line-height: 20px; 12 | text-align: left; 13 | border: 1px solid silver; 14 | border-radius: 3px; 15 | margin-right: 11px; 16 | font-size: 12px; 17 | font-weight: normal; 18 | } 19 | 20 | .tab-transponder .text .disabled { 21 | width: 43px; 22 | padding: 0px 5px; 23 | background-color: #ececec; 24 | } 25 | 26 | .tab-transponder .text span { 27 | margin-left: 0px; 28 | } 29 | 30 | .tab-transponder input { 31 | float: left; 32 | } 33 | 34 | .tab-transponder span { 35 | margin: 0px; 36 | } 37 | 38 | .tab-transponder .text 39 | { 40 | margin-bottom: 5px; 41 | clear: left; 42 | padding-bottom: 5px; 43 | border-bottom: 1px solid #ddd; 44 | width: 100%; 45 | float: left; 46 | } 47 | 48 | .tab-transponder .text:last-child { 49 | border-bottom: none; 50 | padding-bottom: 0px; 51 | margin-bottom: 0px; 52 | } 53 | 54 | .tab-transponder .textspacer { 55 | float: left; 56 | width: 115px; 57 | height: 21px; 58 | } 59 | 60 | .tab-transponder .gui_box span { 61 | font-style: normal; 62 | font-family: 'open_sansregular', Arial; 63 | line-height: 19px; 64 | color: #4F4F4F; 65 | font-size: 11px; 66 | } 67 | 68 | .require-transponder-supported, 69 | .tab-transponder.transponder-supported .require-transponder-unsupported { 70 | display: none; 71 | } 72 | 73 | .tab-transponder.transponder-supported .require-transponder-supported { 74 | display: block; 75 | } 76 | -------------------------------------------------------------------------------- /websrc/bf/tabs/transponder.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
Transponder
4 |
5 | 6 |
7 | 8 |
9 |
10 |

11 |
12 |
13 | 14 |
15 | 16 |
17 |
18 |

19 |
20 |
21 | 22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 | 30 |
31 | 33 |
34 |
35 |
36 |
37 |
38 |
39 | 40 |
41 |
42 |

43 |
44 |
45 | 46 |
47 |
48 |
49 | 50 |
51 |
52 |
53 | -------------------------------------------------------------------------------- /websrc/bf/tabs/transponder.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | TABS.transponder = { 4 | available: false 5 | }; 6 | 7 | TABS.transponder.initialize = function (callback, scrollPosition) { 8 | var self = this; 9 | 10 | if (GUI.active_tab != 'transponder') { 11 | GUI.active_tab = 'transponder'; 12 | } 13 | 14 | // transponder supported added in MSP API Version 1.16.0 15 | TABS.transponder.available = semver.gte(CONFIG.apiVersion, "1.16.0"); 16 | 17 | if (!TABS.transponder.available) { 18 | load_html(); 19 | return; 20 | } 21 | 22 | function load_html() { 23 | $('#content').load("./tabs/transponder.html", process_html); 24 | } 25 | 26 | // get the transponder data and a flag to see if transponder support is enabled on the FC 27 | MSP.send_message(MSPCodes.MSP_TRANSPONDER_CONFIG, false, false, load_html); 28 | 29 | // Convert a hex string to a byte array 30 | function hexToBytes(hex) { 31 | for (var bytes = [], c = 0; c < hex.length; c += 2) 32 | bytes.push(~parseInt(hex.substr(c, 2), 16)); 33 | return bytes; 34 | } 35 | 36 | function pad(n, width) { 37 | n = n + ''; 38 | return n.length >= width ? n : new Array(width - n.length + 1).join('0') + n; 39 | } 40 | 41 | // Convert a byte array to a hex string 42 | function bytesToHex(bytes) { 43 | for (var hex = [], i = 0; i < bytes.length; i++) { 44 | hex.push(pad(((~bytes[i]) & 0xFF).toString(16),2)); 45 | } 46 | return hex.join("").toUpperCase(); 47 | } 48 | function process_html() { 49 | // translate to user-selected language 50 | localize(); 51 | 52 | $(".tab-transponder") 53 | .toggleClass("transponder-supported", TABS.transponder.available && TRANSPONDER.supported); 54 | 55 | if (TABS.transponder.available) { 56 | 57 | var data = bytesToHex(TRANSPONDER.data); 58 | 59 | $('input[name="data"]').val(data); 60 | $('input[name="data"]').prop('maxLength', data.length); 61 | 62 | $('a.save').click(function () { 63 | 64 | 65 | // gather data that doesn't have automatic change event bound 66 | 67 | var dataString = $('input[name="data"]').val(); 68 | var expectedLength = TRANSPONDER.data.length; 69 | var hexRegExp = new RegExp('[0-9a-fA-F]{' + (expectedLength * 2) + '}', 'gi'); 70 | if (!dataString.match(hexRegExp)) { 71 | GUI.log(getLocalizedMessage('transponderDataInvalid')); 72 | return; 73 | } 74 | 75 | TRANSPONDER.data = hexToBytes(dataString); 76 | 77 | 78 | // 79 | // send data to FC 80 | // 81 | function save_transponder_config() { 82 | MSP.send_message(MSPCodes.MSP_SET_TRANSPONDER_CONFIG, mspHelper.crunch(MSPCodes.MSP_SET_TRANSPONDER_CONFIG), false, save_to_eeprom); 83 | } 84 | function save_to_eeprom() { 85 | MSP.send_message(MSPCodes.MSP_EEPROM_WRITE, false, false, function () { 86 | GUI.log(getLocalizedMessage('transponderEepromSaved')); 87 | }); 88 | } 89 | 90 | save_transponder_config(); 91 | }); 92 | } 93 | // status data pulled via separate timer with static speed 94 | GUI.interval_add('status_pull', function status_pull() { 95 | MSP.send_message(MSPCodes.MSP_STATUS); 96 | }, 250, true); 97 | 98 | GUI.content_ready(callback); 99 | } 100 | }; 101 | 102 | TABS.transponder.cleanup = function (callback) { 103 | if (callback) callback(); 104 | }; 105 | -------------------------------------------------------------------------------- /websrc/bf/tmpl/1.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 2 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 |
41 |
42 | Connect 43 | Menu 44 | 53 |
54 |
55 |
56 |
57 | 58 | -------------------------------------------------------------------------------- /websrc/kiss/main.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | $(document).ready(function () { 4 | CONTENT.welcome.initialize(); 5 | 6 | $('#navigation li').click(function () { 7 | var self = this; 8 | var content = $(self).attr('data-name'); 9 | 10 | $("#navigation").removeClass("active-menu"); 11 | 12 | function content_ready() { 13 | GUI.contentSwitchInProgress = false; 14 | } 15 | 16 | if ($(self).hasClass('unlocked') && GUI.activeContent != content) { 17 | GUI.contentSwitchInProgress = true; 18 | GUI.contentSwitchCleanup(function () { 19 | CONTENT[content].initialize(); 20 | }); 21 | } 22 | }); 23 | 24 | $(".navigation-menu-button").on("click", function() { 25 | $("#navigation").toggleClass("active-menu"); 26 | }); 27 | }); 28 | 29 | Number.prototype.clamp = function(min, max) { 30 | return Math.min(Math.max(this, min), max); 31 | }; -------------------------------------------------------------------------------- /websrc/kiss/tmpl/1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 2 | 2 | 3 | 4 |
5 |
6 | Connect 7 | Menu 8 | 17 |
18 |
19 |
20 |
21 | 22 | --------------------------------------------------------------------------------