├── .gitignore ├── .gitmodules ├── LICENSE ├── README.md ├── docs └── dev │ └── software_development_process.md ├── images ├── ScriptKitty-Splash.xbm ├── ScriptKitty-Splash.xcf ├── ScriptKitty.xbm └── banner.png ├── src ├── Dockerfile ├── README.md ├── ScriptKitty │ ├── ScriptKitty.ino │ ├── keyboardlayout.h │ ├── src │ │ ├── ScriptKitty.cpp │ │ ├── ScriptKitty.h │ │ ├── interface │ │ │ ├── graphics.h │ │ │ ├── graphics │ │ │ │ ├── Arrow_Left.h │ │ │ │ ├── Arrow_Right.h │ │ │ │ ├── Navbar_Outline.h │ │ │ │ ├── ScriptKitty-Splash.h │ │ │ │ ├── WindowHeader.h │ │ │ │ ├── attacked_cat_image.h │ │ │ │ ├── cat_with_dots_image.h │ │ │ │ ├── cat_with_exclamation_points_image.h │ │ │ │ ├── cat_with_one_exclamation_point_image.h │ │ │ │ ├── cat_with_reload_spinner_image.h │ │ │ │ ├── main_cat_image.h │ │ │ │ ├── network_monitor_dash.h │ │ │ │ └── splash_img.h │ │ │ ├── lib │ │ │ │ ├── DevKittyInterface.cpp │ │ │ │ ├── DevKittyInterface.h │ │ │ │ └── dejavu.h │ │ │ └── screens │ │ │ │ ├── dir.cpp │ │ │ │ ├── dir.h │ │ │ │ ├── runner.cpp │ │ │ │ ├── runner.h │ │ │ │ ├── splash.cpp │ │ │ │ └── splash.h │ │ ├── utils.cpp │ │ └── utils.h │ └── webUI │ │ └── index.html ├── arduino-cli-mac.yaml ├── arduino-cli.yaml ├── fatfs │ ├── alt.img │ └── default.img ├── makefile ├── scriptkitty_fw_bin_template ├── scripts │ └── build_web_ui.sh └── third_party │ └── arduino_cli_install.sh └── v1.0-ScriptKitty-231225.bin /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode 2 | src/build 3 | src/scripts/arduino-cli 4 | src/.arduino15 5 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "src/third_party/ESPTinyUSB"] 2 | path = src/third_party/ESPTinyUSB 3 | url = https://github.com/DevKitty-io/ESPTinyUSB.git 4 | branch = international-keyboard-support 5 | [submodule "src/third_party/arduino_base64"] 6 | path = src/third_party/arduino_base64 7 | url = https://github.com/dojyorin/arduino_base64.git -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 DevKitty 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # **ScriptKitty**: Cat-Themed USB Attack Firmware 😼 2 | A USB attack tool for the [DevKitty](https://shop.devkitty.io) that lets you compromise unlocked computers in seconds! 3 | 4 | 5 | 6 | ## Features 7 | - **Web Interface** - deploy attacks from a browser! 8 | - **USB Storage** - easy exfiltration & payload access 9 | - **DuckyScript™** - script simple USB attacks 10 | 11 | 12 | ## Payloads 13 | USB attack payloads are written in DuckyScript™. 14 | - [ScriptKitty Payload Repo]() 15 | - [Syntax Reference]() 16 | 17 | ## Get Started 18 | Official documentation is available at [docs.devkitty.io](https://docs.devkitty.io). 19 | 1. Flash your [DevKitty](https://shop.devkitty.io) with the ScriptKitty firmware at [update.devkitty.io](https://update.devkitty.io). 20 | 2. Test out the default payload for your OS using the buttons! 21 | 3. Connect to the [WiFi access point]() and try running attacks from a browser! 22 | - Network: `DevKitty` 23 | - Password: `12345678` -------------------------------------------------------------------------------- /docs/dev/software_development_process.md: -------------------------------------------------------------------------------- 1 | # ScriptKitty software development process 2 | 3 | ## 1. Work planning and task creation 4 | 5 | Work that needs doing is listed on [this project's Kanban 6 | board](https://github.com/orgs/DevKitty/projects/1) under the "To do" 7 | column. Work that needs doing but is not fully defined can be added to the 8 | "Backlog" column. 9 | 10 | ## 2. Communicate intended implementation 11 | 12 | Extremely trivial changes require no communication, other than updating the 13 | Kanban board to reflect what you'll be working on. 14 | 15 | When implementing non-trivial changes, share your ideas before implementing 16 | them. 17 | - For minor features, a short discussion during regular meeting or over chat is 18 | probably sufficient 19 | - For major features, strongly consider creating a design document. This allows 20 | other developers to comment on the design, suggest improvements or 21 | alternatives, and think about edge cases. This prevents wasting time 22 | constructing flawed implementations, and provides future developers with 23 | artifacts to understand the code base and past decisions. Design documents 24 | should be as short as possible while fully capturing your ideas. Use Google 25 | docs or some other service that allows others to easily add comments in 26 | specific sentences/paragraphs. 27 | 28 | ## 3. Implementation 29 | 30 | ### Style guide 31 | Overly strict adherence to a style guide is unproductive. If there is 32 | disagreement between two valid methods of implementation, a style guide can 33 | serve as an unopinionated third-party to resolve the conflict. Code should 34 | loosely follow the guide, and reviewers can consult the guide to suggest code 35 | improvements. 36 | 37 | For this project, we will be using the [Google C++ style 38 | guide](https://google.github.io/styleguide/cppguide.html). If we find that it 39 | doesn't meet our needs, we can copy and modify it or choose another entirely. 40 | 41 | ### Use git commit best practices 42 | See [this 43 | gist](https://gist.github.com/luismts/495d982e8c5b1a0ced4a57cf3d93cf60) for 44 | some best practices. In general, things can be as messy as you want during 45 | development, but clean up before submitting a PR. Break large commits into 46 | smaller ones when it's sensible. 47 | 48 | ### Documentation 49 | Implementing larger features may require updates to documentation. 50 | Documentation should be updated alongside implementation of these features in 51 | the same commit or PR. 52 | - Product-specific documentation in the README file in the project directory root. 53 | - Developer-specific documentation belongs in `/docs/dev`. It should be written 54 | in markdown. 55 | 56 | ### Write comments as needed 57 | See [best practices for writing code comments](https://stackoverflow.blog/2021/12/23/best-practices-for-writing-code-comments/) 58 | 59 | ### Keep the Kanban board updated 60 | Keeping [the Kanban board](https://github.com/orgs/DevKitty/projects/1) 61 | updated ensures that it remains the source of truth for the current state of 62 | planned, in-progress, and completed code changes. 63 | 64 | - When first starting work on a feature, bugfix, or anything else that will 65 | result in a PR, please create (or find) a ticket in the GitHub issue tracker 66 | and assign it to yourself. Add it to the project's Kanban under the "in 67 | progress" column. This prevents developers from accidentally doing the 68 | duplicate work. 69 | - When you submit your PR for review, move the note/issue into the "Review in 70 | progress column". 71 | - When your PR is merged, move the note/issue to the "Done" column. 72 | - If the task you're working on becomes blocked, add the "blocked" label. 73 | 74 | 75 | ## 4. Code review 76 | Every change to the code base should have at least one reviewer. 77 | 78 | ### What a reviewer should look for 79 | - Descriptive and accurate variable/function names 80 | - Corresponding documentation changes are in the PR 81 | - Code that could easily cause memory leaks 82 | - Dead code/cruft: this includes blocks of code that are commented out, 83 | functions that aren't called, 84 | - Adherence to common patterns in the code base 85 | - Comments should be useful and not duplicate the code. When code changes 86 | around an existing comment, the comment should be checked to make sure it is 87 | still accurate. See [best practices for writing code 88 | comments](https://stackoverflow.blog/2021/12/23/best-practices-for-writing-code-comments/) 89 | 90 | ### Submitting code 91 | On github, there are a few options available to you when submitting your code. 92 | For most changes, the "squash and merge" option is best. This combines commits 93 | from your PR into a single commit and merges it. This makes it easier to 94 | understand git history. 95 | 96 | ### Allow the PR author to submit the pull request 97 | There may be a reason the PR author hasn't merged, and generally it's 98 | considered good etiquette. 99 | 100 | [This answer](https://softwareengineering.stackexchange.com/a/334496) on 101 | stackoverfow words it nicely: 102 | 103 | > Sometimes the author becomes aware of reasons later that a pull request 104 | > shouldn't be merged yet. Maybe another developer's PR is higher priority and 105 | > would cause conflicts. Maybe she thought of an uncovered use case. Maybe a 106 | > review comment triggered a brainstorm that needs further investigation before 107 | > the issue is fully satisfied. The author knows the most about the code, and it 108 | > makes sense to give him or her the last word about when it gets merged. 109 | 110 | -------------------------------------------------------------------------------- /images/ScriptKitty-Splash.xbm: -------------------------------------------------------------------------------- 1 | #define ScriptKitty_Splash_width 128 2 | #define ScriptKitty_Splash_height 64 3 | static unsigned char ScriptKitty_Splash_bits[] = { 4 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 5 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 6 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 7 | 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 8 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 9 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 10 | 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 11 | 0x00, 0x00, 0x00, 0x47, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 12 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x1c, 0x00, 0x00, 0x00, 13 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 14 | 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 15 | 0x00, 0x00, 0x00, 0x42, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 16 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x06, 0x00, 0x00, 0x00, 17 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 18 | 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 19 | 0x00, 0xc0, 0x00, 0x40, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 20 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x40, 0x00, 0xf0, 0x00, 0x00, 21 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x03, 0x40, 22 | 0x00, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 23 | 0x00, 0x20, 0x06, 0xe0, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 24 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0e, 0xf0, 0x01, 0x8e, 0x01, 0x00, 25 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x1c, 0xe0, 26 | 0x00, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 27 | 0x00, 0x30, 0x1c, 0x00, 0x00, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 28 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x00, 0x80, 0x03, 0x01, 0x00, 29 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x78, 0xfe, 30 | 0xcf, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 31 | 0x00, 0x10, 0xfc, 0xff, 0xff, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 32 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xff, 0xff, 0xff, 0x1f, 0x03, 0x00, 33 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0xff, 0xff, 34 | 0xff, 0x3f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 35 | 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 36 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 37 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 38 | 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 39 | 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 40 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 41 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 42 | 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 43 | 0x00, 0xfc, 0xfb, 0xff, 0xff, 0xfb, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 44 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xe3, 0xff, 0xff, 0xf8, 0x07, 0x00, 45 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x83, 0xff, 46 | 0x3f, 0xf8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 47 | 0x00, 0xfc, 0x03, 0xfe, 0x0f, 0xf8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 48 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0xfe, 0x0f, 0xf8, 0x00, 0x00, 49 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x03, 0xff, 50 | 0x1f, 0xf8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 51 | 0x00, 0xfc, 0x07, 0xff, 0x1f, 0xfc, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 52 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x8f, 0xff, 0x3f, 0xfe, 0x07, 0x00, 53 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xbb, 54 | 0xfb, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 55 | 0x00, 0xf0, 0xff, 0x13, 0xf9, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 56 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x07, 0xfc, 0xff, 0x01, 0x00, 57 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xcf, 58 | 0xfc, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 59 | 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 60 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 61 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 62 | 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 63 | 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 64 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 65 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xfa, 66 | 0xab, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 67 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 68 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 69 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 70 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 71 | 0x00, 0x00, 0x00, 0xc0, 0x30, 0x0e, 0x30, 0x06, 0x00, 0x00, 0x00, 0x00, 72 | 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x03, 0xc0, 0x30, 0xc7, 0x30, 0x06, 73 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x78, 0x6c, 0xb3, 0xf3, 74 | 0xb3, 0xc3, 0xfc, 0x9f, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 75 | 0xfc, 0x6c, 0xf0, 0xf7, 0xb3, 0x01, 0xfc, 0x9f, 0x31, 0x00, 0x00, 0x00, 76 | 0x00, 0x00, 0x00, 0x1f, 0xce, 0x3c, 0x73, 0xc6, 0xf0, 0xc0, 0x30, 0x86, 77 | 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x06, 0x0c, 0x33, 0xcc, 78 | 0xf0, 0xc0, 0x30, 0x86, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 79 | 0x06, 0x0c, 0x33, 0xcc, 0xb0, 0xc1, 0x30, 0x86, 0x31, 0x00, 0x00, 0x00, 80 | 0x00, 0x00, 0x00, 0x63, 0xce, 0x0c, 0x73, 0xce, 0xb0, 0xc3, 0x30, 0x86, 81 | 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfc, 0x0c, 0xf3, 0xc7, 82 | 0x31, 0xc7, 0x70, 0x0e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 83 | 0x78, 0x0c, 0xb3, 0x83, 0x33, 0xce, 0xe0, 0x1c, 0x3e, 0x00, 0x00, 0x00, 84 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 85 | 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 86 | 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 87 | 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 88 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 89 | 0x00, 0x00, 0x00, 0x00 }; 90 | -------------------------------------------------------------------------------- /images/ScriptKitty-Splash.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevKitty-io/ScriptKitty-Firmware/5084fc5c357f9826fed0f1cd534839a1741faec3/images/ScriptKitty-Splash.xcf -------------------------------------------------------------------------------- /images/ScriptKitty.xbm: -------------------------------------------------------------------------------- 1 | #define ScriptKitty_width 128 2 | #define ScriptKitty_width_height 64 3 | static unsigned char ScriptKitty_width_bits[] = { 4 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 5 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 6 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 7 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 8 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 9 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 10 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 11 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 12 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 13 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 14 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 15 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 16 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 17 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 18 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 19 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 20 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 21 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 22 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 23 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 24 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 25 | 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 26 | 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 27 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 28 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 29 | 0x8c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 30 | 0x00, 0x00, 0x00, 0x00, 0x8c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 31 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x08, 0x00, 0x00, 32 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 33 | 0x88, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 34 | 0x00, 0x00, 0x00, 0x06, 0x88, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 35 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xf0, 0x00, 0x1c, 0x00, 36 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 37 | 0x80, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 38 | 0x00, 0x00, 0x80, 0x11, 0x80, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 39 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0x80, 0x00, 0x62, 0x00, 40 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x30, 41 | 0xc0, 0x01, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 42 | 0x00, 0x00, 0x80, 0x24, 0xc0, 0x01, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 43 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2c, 0x00, 0x80, 0xc8, 0x00, 44 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x4c, 45 | 0x00, 0x80, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 46 | 0x00, 0x00, 0xc0, 0x4e, 0xc0, 0xdf, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 47 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xc6, 0x3f, 0x60, 0xb4, 0x00, 48 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 49 | 0x00, 0x00, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 50 | 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 51 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 52 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 53 | 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 54 | 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 55 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 56 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 57 | 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 58 | 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 59 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x80, 0x01, 0x30, 0x00, 0x06, 60 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x80, 61 | 0x01, 0x30, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 62 | 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 63 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0xe0, 0x00, 0x00, 0x1e, 64 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 65 | 0x40, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 66 | 0x00, 0x00, 0x10, 0x00, 0x48, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 67 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0xf0, 0x01, 0x00, 0x3e, 68 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 69 | 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 70 | 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 71 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 72 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 73 | 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 74 | 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 75 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 76 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 77 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 78 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 79 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 80 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 81 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 82 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 83 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 84 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 85 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 86 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 87 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 88 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 89 | 0x00, 0x00, 0x00, 0x00 }; -------------------------------------------------------------------------------- /images/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevKitty-io/ScriptKitty-Firmware/5084fc5c357f9826fed0f1cd534839a1741faec3/images/banner.png -------------------------------------------------------------------------------- /src/Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | FROM debian:buster 3 | WORKDIR /app 4 | 5 | RUN apt-get update && apt-get install -y \ 6 | wget \ 7 | zip \ 8 | bsdmainutils \ 9 | xz-utils \ 10 | xxd \ 11 | python3 python3-pip 12 | RUN pip3 install pyserial esptool==4.2.1 13 | 14 | ARG ARDUINO_CLI_VERSION=0.22.0 15 | RUN wget https://github.com/arduino/arduino-cli/releases/download/${ARDUINO_CLI_VERSION}/arduino-cli_${ARDUINO_CLI_VERSION}_Linux_64bit.tar.gz 16 | RUN tar -xf arduino-cli_${ARDUINO_CLI_VERSION}_Linux_64bit.tar.gz 17 | 18 | # TODO: version-lock these 19 | COPY arduino-cli.yaml . 20 | RUN ./arduino-cli core update-index --config-file arduino-cli.yaml 21 | RUN ./arduino-cli core install esp32:esp32@2.0.3 22 | RUN ./arduino-cli lib install \ 23 | "ESP8266 and ESP32 OLED driver for SSD1306 displays" \ 24 | "Adafruit NeoPixel" 25 | COPY third_party ./third_party 26 | RUN ./third_party/arduino_cli_install.sh $(readlink -f ./arduino-cli) 27 | 28 | # Patch to force esptool to use no_reset option. This is necessary because 29 | # arduino-cli does not provide an option to forward this flag. This may become 30 | # unncessary when esp32s2 is better supported. 31 | RUN sed -i '/.*args = parser.parse_args(argv)/a\ \ \ \ args.after="no_reset"' $(grep -r parser.parse_args /root/.arduino15/packages/esp32/tools/esptool_py/ -l) 32 | 33 | COPY ScriptKitty ./ScriptKitty 34 | COPY fatfs/default.img . 35 | COPY scripts ./scripts 36 | RUN ./scripts/build_web_ui.sh 37 | RUN ./arduino-cli compile -b esp32:esp32:lolin_s2_mini ScriptKitty \ 38 | --build-property build.partitions=noota_3gffat \ 39 | --build-property build.cdc_on_boot=1 \ 40 | --output-dir=./build 41 | -------------------------------------------------------------------------------- /src/README.md: -------------------------------------------------------------------------------- 1 | ## Building / flashing from source 2 | 3 | If want to flash the latest version of the ScriptKitty project, [the method 4 | documented 5 | here](https://update.devkitty.io) is 6 | easiest. 7 | 8 | Docker is used to produce a replicable build environment to ensure 9 | library and tool dependencies are met. Linux is recommended when developing, 10 | building, and flashing from source. 11 | 12 | ### Linux 13 | 14 | Dependencies: docker, make. 15 | ``` 16 | # Clone the repo 17 | git clone https://github.com/DevKitty-io/ScriptKitty-Firmware.git 18 | 19 | # Navigate to src 20 | cd ScriptKitty-Firmware/src 21 | 22 | # Build 23 | sudo make build 24 | 25 | # Build and flash the ESP32-S2 (may need sudo) 26 | #optionally specify port: sudo make flash PORT= 27 | #optionally install default scripts: sudo make flash RESET_SCRIPTS_DURING_FLASH=true 28 | sudo make flash 29 | 30 | 31 | # Produce .img for release 32 | sudo make generate_bin 33 | ``` 34 | 35 | ### macOS 36 | 37 | Docker on mac has issues connecting to usb devices and complicates the flashing 38 | process. A workaround is in place - ScriptKitty will be built within docker but 39 | then flashed outside of the container. Some additional steps are also 40 | necessary to prepare your development environment: 41 | 42 | 1. Install docker and ensure the daemon is running. The daemon is running if the 43 | command `docker info` is successful. 44 | 2. Install python3 and pip3, then `pip3 install esptool` 45 | 46 | ```bash 47 | # Clone the repo 48 | git clone https://github.com/DevKitty-io/ScriptKitty-Firmware.git 49 | 50 | # Navigate to src 51 | cd ScriptKitty-Firmware/src 52 | 53 | # Verify everything is installed and configured correctly 54 | make check-mac-deps 55 | 56 | # To build only, run 57 | make mac-build 58 | 59 | # Plug in your ScriptKitty dev kit in flashing mode by holding down the '0' 60 | # button while plugging it in. 61 | 62 | # Find the port of your arduino. It's likely something like 63 | # "/dev/cu.usbmodem01". 64 | ls /dev/cu* 65 | 66 | # To build and flash, run 67 | make flash-on-mac PORT= 68 | 69 | # If you want to overwrite the FAT partition to include default payloads, set 70 | # RESET_SCRIPTS_DURING_FLASH=true: 71 | make flash PORT= RESET_SCRIPTS_DURING_FLASH=true 72 | ``` 73 | 74 | ### Windows 75 | 76 | ```Not currently supported``` 77 | -------------------------------------------------------------------------------- /src/ScriptKitty/ScriptKitty.ino: -------------------------------------------------------------------------------- 1 | #include 2 | #include "src/ScriptKitty.h" 3 | #include "Arduino.h" 4 | #include 5 | #include "base64.hpp" 6 | 7 | #include 8 | #include 9 | 10 | #include "webUI/index.h" 11 | 12 | #include "src/utils.h" 13 | #include "src/interface/screens/splash.h" 14 | #include "src/interface/screens/dir.h" 15 | #include "src/interface/screens/runner.h" 16 | #include "src/interface/lib/DevKittyInterface.h" 17 | 18 | const char *ssid = "DevKitty"; 19 | const char *password = "12345678"; 20 | 21 | WebServer server(80); 22 | 23 | TaskHandle_t webapp; 24 | TaskHandle_t dkweb; 25 | 26 | void getPayloads() { 27 | String* payloadPaths = ScriptKitty::allPayloadPaths(); 28 | Serial.printf("[SERVER][getPayloads] %s\n", payloadPaths->c_str()); 29 | server.send(200, "text/plain", *payloadPaths); 30 | } 31 | 32 | void handleRoot() { 33 | Serial.println("handling root!"); 34 | server.send(200, "text/html", String(INDEX)); 35 | } 36 | 37 | void delpayload() { 38 | String path(server.arg("path")); 39 | FRESULT res = f_unlink(path.c_str()); 40 | if (res == FR_OK){ 41 | server.send(200); 42 | } else { 43 | server.send(500); 44 | } 45 | } 46 | 47 | void websave() { 48 | fileOp decodeOp = base64Decode(server.arg("payloadText")); 49 | if (!decodeOp.ok){ 50 | server.send(500, "text/plain", decodeOp.result); 51 | return; 52 | } 53 | fileOp saveOp = saveFile(server.arg("path"), decodeOp.result); 54 | if (!saveOp.ok){ 55 | server.send(500, "text/plain", saveOp.result); 56 | return; 57 | } 58 | server.send(200, "text/plain", "payload saved successfully"); 59 | } 60 | 61 | void webget() { 62 | String path = server.arg("path"); 63 | fileOp op = readFile(path); 64 | if (!op.ok) { 65 | // TODO: send 500/4XX depending on file existence vs internal error 66 | server.send(500, "text/plain", String("error getting payload: ") + op.result); 67 | return; 68 | } 69 | String payload = base64::encode(op.result); 70 | server.send(200, "text/plain", payload); 71 | } 72 | 73 | DevKittyInterface* devKittyInterface; 74 | 75 | // run payload with get request path 76 | void webrun() { 77 | fileOp op = readFile(server.arg("path")); 78 | if (op.ok) { 79 | server.send(200, "text/html", "Running payload..."); 80 | DevKittyScreen* runner = new ScriptRunnerScreen(op.result); 81 | bool ok = devKittyInterface->injectScreen(runner); 82 | return; 83 | } 84 | server.send(500, "text/html", "couldn't run payload: " + op.result); 85 | } 86 | 87 | void webrunlive() { 88 | // TODO: use server.arg "content" or "payload" instead of "plain" 89 | fileOp op = base64Decode(server.arg("plain")); 90 | if (op.ok) { 91 | server.send(200, "text/plain", "running live payload"); 92 | DevKittyScreen* runner = new ScriptRunnerScreen(op.result); 93 | bool ok = devKittyInterface->injectScreen(runner); 94 | // TODO: send 503 when device is busy 95 | return; 96 | } 97 | server.send(500, "text/html", "Device busy"); 98 | } 99 | 100 | void webserverInit(void *p) { 101 | while (1) { 102 | server.handleClient(); 103 | vTaskDelay(2); 104 | } 105 | } 106 | 107 | void setup() { 108 | Serial.begin(115200); 109 | 110 | ScriptKitty::init(); 111 | 112 | server.on("/", handleRoot); 113 | server.on("/payloads", getPayloads); 114 | server.on("/savepayload", HTTP_POST, websave); 115 | server.on("/deletepayload", HTTP_POST, delpayload); 116 | server.on("/runlive", HTTP_POST, webrunlive); 117 | server.on("/getpayload", HTTP_GET, webget); 118 | server.on("/runpayload", HTTP_GET, webrun); 119 | 120 | server.begin(); 121 | 122 | xTaskCreate(webserverInit, "webapptask", 12 * 1024, NULL, 5, &webapp); // create task priority 1 123 | devKittyInterface = new DevKittyInterface; 124 | DevKittyScreen* dirScreen = new DirScreen("/"); 125 | DevKittyScreen* splashScreen = new SplashScreen(1500); 126 | devKittyInterface->pushScreen(dirScreen); 127 | devKittyInterface->pushScreen(splashScreen); 128 | devKittyInterface->start(); 129 | 130 | } 131 | 132 | void loop() { return; } 133 | -------------------------------------------------------------------------------- /src/ScriptKitty/keyboardlayout.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "Arduino.h" 3 | #include "hidkeyboard.h" 4 | 5 | struct duckyKeys { 6 | String title; 7 | uint16_t key; 8 | }; 9 | 10 | // add keycode modifier 11 | 12 | duckyKeys keyMapRN[] = { 13 | 14 | {"ENTER", HID_KEY_ENTER}, 15 | {"MENU", HID_KEY_MENU}, 16 | {"DELETE", HID_KEY_DELETE}, 17 | {"BACKSPACE", HID_KEY_BACKSPACE}, 18 | {"HOME", HID_KEY_HOME}, 19 | {"INSERT", HID_KEY_INSERT}, 20 | {"PAGEUP", HID_KEY_PAGE_UP}, 21 | {"PAGEDOWN", HID_KEY_PAGE_DOWN}, 22 | {"UPARROW", HID_KEY_ARROW_UP}, 23 | {"UP", HID_KEY_ARROW_UP}, 24 | {"DOWNARROW", HID_KEY_ARROW_DOWN}, 25 | {"DOWN", HID_KEY_ARROW_DOWN}, 26 | {"LEFTARROW", HID_KEY_ARROW_LEFT}, 27 | {"LEFT", HID_KEY_ARROW_LEFT}, 28 | {"RIGHTARROW", HID_KEY_ARROW_RIGHT}, 29 | {"RIGHT", HID_KEY_ARROW_RIGHT}, 30 | {"TAB", HID_KEY_TAB}, 31 | {"END", HID_KEY_END}, 32 | {"ESC", HID_KEY_ESCAPE}, 33 | {"F1", HID_KEY_F1}, 34 | {"F2", HID_KEY_F2}, 35 | {"F3", HID_KEY_F3}, 36 | {"F4", HID_KEY_F4}, 37 | {"F5", HID_KEY_F5}, 38 | {"F6", HID_KEY_F6}, 39 | {"F7", HID_KEY_F7}, 40 | {"F8", HID_KEY_F8}, 41 | {"F9", HID_KEY_F9}, 42 | {"F10", HID_KEY_F10}, 43 | {"F11", HID_KEY_F11}, 44 | {"F12", HID_KEY_F12}, 45 | {"SPACE", HID_KEY_SPACE}, 46 | {"PAUSE", HID_KEY_PAUSE}, 47 | {"CAPSLOCK", HID_KEY_CAPS_LOCK}, 48 | {"NUMLOCK", HID_KEY_NUM_LOCK}, 49 | {"PRINTSCREEN", HID_KEY_CAPS_LOCK}, 50 | {"SCROLLOCK", HID_KEY_SCROLL_LOCK}, 51 | {"CONTROL", HID_KEY_CONTROL_LEFT}, 52 | {"CTRL", HID_KEY_CONTROL_LEFT}, 53 | {"SHIFT", HID_KEY_SHIFT_LEFT}, 54 | {"ALT", HID_KEY_ALT_LEFT}, 55 | {"WINDOWS", HID_KEY_GUI_LEFT}, 56 | {"GUI", HID_KEY_GUI_LEFT} 57 | }; 58 | -------------------------------------------------------------------------------- /src/ScriptKitty/src/ScriptKitty.cpp: -------------------------------------------------------------------------------- 1 | #include "Arduino.h" 2 | #include 3 | 4 | #include "ScriptKitty.h" 5 | #include "utils.h" 6 | 7 | // ESPTinyUSB libraries 8 | #include "cdcusb.h" 9 | #include "mscusb.h" 10 | #include "flashdisk.h" 11 | #include "hidkeyboard.h" 12 | 13 | HIDkeyboard keyboard; 14 | CDCusb CDCUSBSerial; 15 | FlashUSB fat1; 16 | 17 | char *l1 = "ffat"; 18 | String payloadPath = ""; 19 | 20 | /*-----------------------------------------------------------------*/ 21 | 22 | class MyCDCCallbacks : public CDCCallbacks { 23 | void onCodingChange(cdc_line_coding_t const* p_line_coding) 24 | { 25 | int bitrate = CDCUSBSerial.getBitrate(); 26 | Serial.printf("new bitrate: %d\n", bitrate); 27 | } 28 | 29 | bool onConnect(bool dtr, bool rts) 30 | { 31 | Serial.printf("connection state changed, dtr: %d, rts: %d\n", dtr, rts); 32 | return true; // allow to persist reset, when Arduino IDE is trying to enter bootloader mode 33 | } 34 | 35 | void onData() 36 | { 37 | int len = CDCUSBSerial.available(); 38 | Serial.printf("\nnew data, len %d\n", len); 39 | uint8_t buf[len] = {}; 40 | CDCUSBSerial.read(buf, len); 41 | Serial.write(buf, len); 42 | } 43 | }; 44 | 45 | class Device: public USBCallbacks { 46 | void onMount() { Serial.println("Mount"); } 47 | void onUnmount() { Serial.println("Unmount"); } 48 | void onSuspend(bool remote_wakeup_en) { Serial.println("Suspend"); } 49 | void onResume() { Serial.println("Resume"); } 50 | }; 51 | 52 | class MyHIDCallbacks : public HIDCallbacks 53 | { 54 | void onData(uint8_t report_id, hid_report_type_t report_type, uint8_t const *buffer, uint16_t bufsize) 55 | { 56 | Serial.printf("ID: %d, type: %d, size: %d\n", report_id, (int)report_type, bufsize); 57 | for (size_t i = 0; i < bufsize; i++) 58 | { 59 | Serial.printf("%d\n", buffer[i]); 60 | } 61 | } 62 | }; 63 | 64 | void echo_all(char c) { 65 | CDCUSBSerial.write(c); 66 | Serial.write(c); 67 | } 68 | 69 | /*-----------------------------------------------------------------*/ 70 | 71 | 72 | void ScriptKitty::init() { 73 | // Mount FAT fs 74 | if (fat1.init("/fat1", "ffat")) { 75 | //disable this on startup 76 | if (fat1.begin()) { 77 | Serial.println("MSC lun 1 begin"); 78 | } 79 | else { 80 | log_e("LUN 1 failed"); 81 | } 82 | } 83 | if (!CDCUSBSerial.begin()) 84 | Serial.println("Failed to start CDC USB stack"); 85 | CDCUSBSerial.setCallbacks(new MyCDCCallbacks()); 86 | EspTinyUSB::registerDeviceCallbacks(new Device()); 87 | 88 | // Read config from settings file 89 | ScriptKittyConfig c = getConfig(); 90 | 91 | // Init AP 92 | WiFi.softAP(c.network.c_str(), c.password.c_str()); 93 | IPAddress myIP = WiFi.softAPIP(); 94 | Serial.print("AP IP address: "); 95 | Serial.println(myIP); 96 | 97 | // Setup keyboard 98 | keyboard.deviceID(c.vid,c.pid); 99 | keyboard.setBaseEP(3); 100 | keyboard.begin(); 101 | keyboard.setCallbacks(new MyHIDCallbacks()); 102 | } 103 | 104 | // newFileList returns a paginated list of strings representing the files 105 | // available at the given path. resultsPerPage will be set to number of results 106 | // returned. On error, it returns nullptr and numFiles is set to -1. 107 | FILINFO* newFileList(const char* path, int& numFiles) { 108 | uint currentCapacity = 4; // arbitrary, will grow as needed 109 | uint filesSoFar = 0; 110 | bool errored = false; 111 | FILINFO* fileList = new FILINFO[currentCapacity]; 112 | 113 | FRESULT res; 114 | FF_DIR dir; 115 | FILINFO fno; 116 | 117 | res = f_opendir(&dir, path); 118 | if (res != FR_OK) { 119 | Serial.printf("[newFileList] f_opendir error: %d\n", res); 120 | goto onError; 121 | } 122 | 123 | for (;;) { 124 | res = f_readdir(&dir, &fno); // Read a directory item 125 | if (res != FR_OK) { 126 | errored = true; 127 | break; 128 | } 129 | if (fno.fname[0] == 0) { // End of dir 130 | break; 131 | } 132 | if (fno.fname[0] == '.') { // Don't show files starting with '.' 133 | continue; 134 | } 135 | // Found a file/dir. Store it, doubling capacity first if needed. 136 | if (filesSoFar >= currentCapacity) { 137 | FILINFO* newFileList = new FILINFO[currentCapacity*2]; 138 | for (int i = 0; i < currentCapacity; i++){ 139 | newFileList[i] = fileList[i]; 140 | } 141 | currentCapacity *= 2; 142 | delete[] fileList; 143 | fileList = newFileList; 144 | } 145 | fileList[filesSoFar] = fno; 146 | filesSoFar++; 147 | } 148 | if (errored) { 149 | Serial.printf("[newFileList] f_readdir error: %d\n", res); 150 | goto onError; 151 | } 152 | res = f_closedir(&dir); 153 | if (res != FR_OK) { 154 | Serial.printf("[newFileList] f_closedir error: %d\n", res); 155 | goto onError; 156 | } 157 | if (filesSoFar < 1){ 158 | Serial.println("[newFileList] directory empty"); 159 | goto onError; 160 | } 161 | numFiles = filesSoFar; 162 | return fileList; 163 | 164 | onError: 165 | numFiles = -1; 166 | delete[] fileList; 167 | return nullptr; 168 | } 169 | 170 | // allPayloadPaths returns a comma seperated list of paths to all payloads. 171 | String* ScriptKitty::allPayloadPaths(const char* path) { 172 | int numFiles = 0; 173 | FILINFO* files = newFileList(path, numFiles); 174 | 175 | // DFS on fs 176 | // TODO: measure max stack usage; if cutting it close reimplement 177 | // non-recursively. 178 | if (numFiles < 1) { 179 | return nullptr; 180 | } 181 | String* ret = new String; 182 | for(int i = 0; i < numFiles; i++) { 183 | if (files[i].fattrib & AM_DIR) { // Directory; recurse 184 | String recursivePath(path); 185 | if (recursivePath.length()>1){ // non-root 186 | recursivePath += "/"; 187 | } 188 | recursivePath += files[i].fname; 189 | String* subDirFiles = allPayloadPaths(recursivePath.c_str()); 190 | if (subDirFiles) { 191 | (*ret) += (*subDirFiles); 192 | delete subDirFiles; 193 | } 194 | } else { // file, append to list 195 | // TODO: escape commas in file names 196 | String pathString(path); 197 | if (pathString.length() > 1) { // non-root 198 | pathString += "/"; 199 | } 200 | (*ret) += pathString; 201 | (*ret) += files[i].fname; 202 | (*ret) += ","; 203 | } 204 | } 205 | delete[] files; 206 | return ret; 207 | } 208 | 209 | ScriptKittyConfig getConfig() { 210 | ScriptKittyConfig conf; 211 | conf.locale = "EN"; 212 | conf.network = "DevKitty"; 213 | conf.password = "12345678"; 214 | conf.pid = 0x20b; 215 | conf.vid = 0x05ac; 216 | 217 | fileOp configRead = readFile("config.txt"); 218 | if (!configRead.ok) { 219 | Serial.printf("config file could not be read: %s\n", configRead.result); 220 | return conf; 221 | } 222 | 223 | int lineStart = 0; 224 | String currentLine; 225 | String currentLineKeyValue; 226 | while (lineStart < configRead.result.length()) { 227 | int lineEnd = configRead.result.indexOf('\n', lineStart); 228 | if (lineEnd == -1){ 229 | lineEnd = configRead.result.length(); 230 | break; 231 | } 232 | 233 | // process line 234 | currentLine = configRead.result.substring(lineStart, lineEnd); 235 | currentLine.trim(); 236 | int valueStart = currentLine.indexOf("\""); 237 | int valueEnd = currentLine.lastIndexOf("\""); 238 | if (valueStart == -1 || valueStart==valueEnd) { 239 | // couldn't find both quotes 240 | goto nextLine; 241 | } 242 | currentLineKeyValue = currentLine.substring(valueStart+1, valueEnd); 243 | 244 | if (currentLine.indexOf("network = \"") == 0) { 245 | conf.network = currentLineKeyValue; 246 | } else 247 | if (currentLine.indexOf("password = \"") == 0) { 248 | if (currentLineKeyValue.length() < 8) { 249 | goto nextLine; 250 | } 251 | conf.password = currentLineKeyValue; 252 | } else 253 | if (currentLine.indexOf("pid = \"") == 0) { 254 | char hex[currentLineKeyValue.length() + 1]; 255 | strcpy(hex, currentLineKeyValue.c_str()); 256 | char* ptr; 257 | conf.pid = strtoul(hex, &ptr, 16); 258 | } else 259 | if (currentLine.indexOf("vid = \"") == 0) { 260 | char hex[currentLineKeyValue.length() + 1]; 261 | strcpy(hex, currentLineKeyValue.c_str()); 262 | char* ptr; 263 | conf.vid = strtoul(hex, &ptr, 16); 264 | } 265 | nextLine: 266 | // update line 267 | lineStart = lineEnd+1; 268 | } 269 | return conf; 270 | } 271 | -------------------------------------------------------------------------------- /src/ScriptKitty/src/ScriptKitty.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "Arduino.h" 4 | #include "cdcusb.h" 5 | #include "mscusb.h" 6 | #include "flashdisk.h" 7 | 8 | class ScriptKitty { 9 | public: 10 | ScriptKitty(){}; 11 | static void init(); 12 | static String* allPayloadPaths(const char* path="/"); 13 | }; 14 | 15 | struct ScriptKittyConfig { 16 | String locale; 17 | String network; 18 | String password; 19 | long pid; 20 | long vid; 21 | }; 22 | 23 | FILINFO* newFileList(const char* path, int& numFiles); 24 | ScriptKittyConfig getConfig(); 25 | -------------------------------------------------------------------------------- /src/ScriptKitty/src/interface/graphics.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "graphics/Arrow_Left.h" 3 | #include "graphics/Arrow_Right.h" 4 | #include "graphics/Navbar_Outline.h" 5 | #include "graphics/WindowHeader.h" 6 | #include "graphics/main_cat_image.h" 7 | #include "graphics/attacked_cat_image.h" 8 | #include "graphics/cat_with_exclamation_points_image.h" 9 | #include "graphics/cat_with_dots_image.h" 10 | #include "graphics/cat_with_one_exclamation_point_image.h" 11 | #include "graphics/network_monitor_dash.h" 12 | #include "graphics/cat_with_reload_spinner_image.h" 13 | #include "graphics/ScriptKitty-Splash.h" -------------------------------------------------------------------------------- /src/ScriptKitty/src/interface/graphics/Arrow_Left.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #define Arrow_Left_width 4 3 | #define Arrow_Left_height 7 4 | #define Arrow_Left_x_hot 2 5 | #define Arrow_Left_y_hot 56 6 | static unsigned char Arrow_Left_bits[] = { 7 | 0x08, 0x0c, 0x0e, 0x0f, 0x0e, 0x0c, 0x08 }; -------------------------------------------------------------------------------- /src/ScriptKitty/src/interface/graphics/Arrow_Right.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #define Arrow_Right_width 4 3 | #define Arrow_Right_height 7 4 | #define Arrow_Right_x_hot 122 5 | #define Arrow_Right_y_hot 56 6 | static unsigned char Arrow_Right_bits[] = { 7 | 0x01, 0x03, 0x07, 0x0f, 0x07, 0x03, 0x01 }; -------------------------------------------------------------------------------- /src/ScriptKitty/src/interface/graphics/Navbar_Outline.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #define Navbar_Outline_width 128 3 | #define Navbar_Outline_height 11 4 | #define Navbar_Outline_x_hot 0 5 | #define Navbar_Outline_y_hot 53 6 | static unsigned char Navbar_Outline_bits[] = { 7 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 8 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 9 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 10 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 11 | 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 12 | 0x00, 0x00, 0x60, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 13 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x06, 0x00, 0x00, 14 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 15 | 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 16 | 0x00, 0x00, 0x60, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 17 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x06, 0x00, 0x00, 18 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 19 | 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 20 | 0x00, 0x00, 0x60, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 21 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00 }; -------------------------------------------------------------------------------- /src/ScriptKitty/src/interface/graphics/ScriptKitty-Splash.h: -------------------------------------------------------------------------------- 1 | #define ScriptKitty_Splash_width 128 2 | #define ScriptKitty_Splash_height 64 3 | static unsigned char ScriptKitty_Splash_bits[] = { 4 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 5 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 6 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 7 | 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 8 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 9 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 10 | 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 11 | 0x00, 0x00, 0x00, 0x47, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 12 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x1c, 0x00, 0x00, 0x00, 13 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 14 | 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 15 | 0x00, 0x00, 0x00, 0x42, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 16 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x06, 0x00, 0x00, 0x00, 17 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 18 | 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 19 | 0x00, 0xc0, 0x00, 0x40, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 20 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x40, 0x00, 0xf0, 0x00, 0x00, 21 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x03, 0x40, 22 | 0x00, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 23 | 0x00, 0x20, 0x06, 0xe0, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 24 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0e, 0xf0, 0x01, 0x8e, 0x01, 0x00, 25 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x1c, 0xe0, 26 | 0x00, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 27 | 0x00, 0x30, 0x1c, 0x00, 0x00, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 28 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x00, 0x80, 0x03, 0x01, 0x00, 29 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x78, 0xfe, 30 | 0xcf, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 31 | 0x00, 0x10, 0xfc, 0xff, 0xff, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 32 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xff, 0xff, 0xff, 0x1f, 0x03, 0x00, 33 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0xff, 0xff, 34 | 0xff, 0x3f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 35 | 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 36 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 37 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 38 | 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 39 | 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 40 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 41 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 42 | 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 43 | 0x00, 0xfc, 0xfb, 0xff, 0xff, 0xfb, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 44 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xe3, 0xff, 0xff, 0xf8, 0x07, 0x00, 45 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x83, 0xff, 46 | 0x3f, 0xf8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 47 | 0x00, 0xfc, 0x03, 0xfe, 0x0f, 0xf8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 48 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0xfe, 0x0f, 0xf8, 0x00, 0x00, 49 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x03, 0xff, 50 | 0x1f, 0xf8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 51 | 0x00, 0xfc, 0x07, 0xff, 0x1f, 0xfc, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 52 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x8f, 0xff, 0x3f, 0xfe, 0x07, 0x00, 53 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xbb, 54 | 0xfb, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 55 | 0x00, 0xf0, 0xff, 0x13, 0xf9, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 56 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x07, 0xfc, 0xff, 0x01, 0x00, 57 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xcf, 58 | 0xfc, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 59 | 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 60 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 61 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 62 | 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 63 | 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 64 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 65 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xfa, 66 | 0xab, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 67 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 68 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 69 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 70 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 71 | 0x00, 0x00, 0x00, 0xc0, 0x30, 0x0e, 0x30, 0x06, 0x00, 0x00, 0x00, 0x00, 72 | 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x03, 0xc0, 0x30, 0xc7, 0x30, 0x06, 73 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x78, 0x6c, 0xb3, 0xf3, 74 | 0xb3, 0xc3, 0xfc, 0x9f, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 75 | 0xfc, 0x6c, 0xf0, 0xf7, 0xb3, 0x01, 0xfc, 0x9f, 0x31, 0x00, 0x00, 0x00, 76 | 0x00, 0x00, 0x00, 0x1f, 0xce, 0x3c, 0x73, 0xc6, 0xf0, 0xc0, 0x30, 0x86, 77 | 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x06, 0x0c, 0x33, 0xcc, 78 | 0xf0, 0xc0, 0x30, 0x86, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 79 | 0x06, 0x0c, 0x33, 0xcc, 0xb0, 0xc1, 0x30, 0x86, 0x31, 0x00, 0x00, 0x00, 80 | 0x00, 0x00, 0x00, 0x63, 0xce, 0x0c, 0x73, 0xce, 0xb0, 0xc3, 0x30, 0x86, 81 | 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfc, 0x0c, 0xf3, 0xc7, 82 | 0x31, 0xc7, 0x70, 0x0e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 83 | 0x78, 0x0c, 0xb3, 0x83, 0x33, 0xce, 0xe0, 0x1c, 0x3e, 0x00, 0x00, 0x00, 84 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 85 | 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 86 | 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 87 | 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 88 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 89 | 0x00, 0x00, 0x00, 0x00 }; 90 | -------------------------------------------------------------------------------- /src/ScriptKitty/src/interface/graphics/WindowHeader.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #define Window_Header_width 128 3 | #define Window_Header_height 15 4 | #define Window_Header_x_hot 0 5 | #define Window_Header_y_hot 0 6 | static unsigned char Window_Header_bits[] = { 7 | 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 8 | 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 9 | 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 10 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0xc0, 11 | 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 12 | 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 13 | 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 14 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0xc0, 15 | 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 16 | 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 17 | 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 18 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0xc0, 19 | 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 20 | 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 21 | 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 22 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0xc0, 23 | 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 24 | 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 25 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 26 | 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; -------------------------------------------------------------------------------- /src/ScriptKitty/src/interface/graphics/attacked_cat_image.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #define attacked_cat_image_width 128 3 | #define attacked_cat_image_height 64 4 | static unsigned char attacked_cat_image_bits[] = { 5 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 6 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 7 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 8 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 9 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 10 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 11 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 12 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 13 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 14 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 15 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 16 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 17 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 18 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 19 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 20 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 21 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 22 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 23 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 24 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 25 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 26 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 27 | 0x00, 0x00, 0x00, 0x00, 0xe0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 28 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x80, 0x01, 0x00, 29 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 30 | 0xf3, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 31 | 0x00, 0x00, 0x00, 0x00, 0x0c, 0xfc, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 32 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 33 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 34 | 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 35 | 0x00, 0x00, 0x00, 0x06, 0xc0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 36 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x10, 0x1c, 0x00, 37 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 38 | 0xf0, 0x0f, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 39 | 0x00, 0x00, 0x80, 0x11, 0x38, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 40 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0x60, 0x00, 0x62, 0x00, 41 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x30, 42 | 0x80, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 43 | 0x00, 0x00, 0x80, 0x24, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 44 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2c, 0x00, 0x80, 0xc8, 0x00, 45 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x4c, 46 | 0x00, 0x80, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 47 | 0x00, 0x00, 0xc0, 0x4e, 0xc0, 0xdf, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 48 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xc6, 0x3f, 0x60, 0xb4, 0x00, 49 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 50 | 0x00, 0x00, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 51 | 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 52 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 53 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 54 | 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 55 | 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 56 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 57 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x20, 58 | 0x02, 0x88, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 59 | 0x00, 0x00, 0x24, 0x40, 0x01, 0x50, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 60 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x80, 0x00, 0x20, 0x00, 0x06, 61 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 62 | 0x01, 0x50, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 63 | 0x00, 0x00, 0x10, 0x20, 0x02, 0x88, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 64 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0xe0, 0x00, 0x00, 0x1e, 65 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 66 | 0x40, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 67 | 0x00, 0x00, 0x10, 0x00, 0xe0, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 68 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x10, 0x01, 0x00, 0x3e, 69 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 70 | 0x08, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 71 | 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 72 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 73 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 74 | 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 75 | 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 76 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 77 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 78 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 79 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 80 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 81 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 82 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 83 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 84 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 85 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 86 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 87 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 88 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 89 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 90 | 0x00, 0x00, 0x00, 0x00 }; -------------------------------------------------------------------------------- /src/ScriptKitty/src/interface/graphics/cat_with_dots_image.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #define cat_with_dots_image_width 128 3 | #define cat_with_dots_image_height 64 4 | static unsigned char cat_with_dots_image_bits[] = { 5 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 6 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 7 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 8 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 9 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 10 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 11 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 12 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 13 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 14 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 15 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 16 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 17 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 18 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 19 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 20 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 21 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 22 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 23 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 24 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 25 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 26 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 27 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 28 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 29 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 30 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 31 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 32 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x04, 0x00, 0x00, 33 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 34 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 35 | 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 36 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x1c, 0x00, 37 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 38 | 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 39 | 0x00, 0x00, 0x80, 0x11, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 40 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0x00, 0x00, 0x62, 0x00, 41 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x30, 42 | 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 43 | 0x00, 0x00, 0x80, 0x24, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 44 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2c, 0x00, 0x80, 0xc8, 0x00, 45 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x4c, 46 | 0x00, 0x80, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 47 | 0x00, 0x00, 0xc0, 0x4e, 0xc0, 0xdf, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 48 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xc6, 0x3f, 0x60, 0xb4, 0x00, 49 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 50 | 0x00, 0x00, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 51 | 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 52 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 53 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 54 | 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 55 | 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 56 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 57 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 58 | 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 59 | 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 60 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x80, 0x01, 0x30, 0x00, 0x06, 61 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x80, 62 | 0x01, 0x30, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 63 | 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 64 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0xe0, 0x00, 0x00, 0x1e, 65 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 66 | 0x40, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 67 | 0x00, 0x00, 0x10, 0x00, 0x40, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 68 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0xf0, 0x01, 0x00, 0x3e, 69 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 70 | 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 71 | 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 72 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 73 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 74 | 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 75 | 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 76 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 77 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 78 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 79 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 80 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 81 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 82 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 83 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 84 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 85 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 86 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 87 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 88 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 89 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 90 | 0x00, 0x00, 0x00, 0x00 }; -------------------------------------------------------------------------------- /src/ScriptKitty/src/interface/graphics/cat_with_exclamation_points_image.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #define cat_with_exclamation_points_image_width 128 3 | #define cat_with_exclamation_points_image_height 64 4 | static unsigned char cat_with_exclamation_points_image_bits[] = { 5 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 6 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 7 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 8 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 9 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 10 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 11 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 12 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 13 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 14 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 15 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 16 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 17 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 18 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 19 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 20 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 21 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 22 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 23 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 24 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 25 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 26 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 27 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 28 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 29 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 30 | 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 31 | 0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 32 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x10, 0x00, 0x00, 33 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 34 | 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 35 | 0x00, 0x00, 0x00, 0x06, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 36 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x80, 0x00, 0x1c, 0x00, 37 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 38 | 0x84, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 39 | 0x00, 0x00, 0x80, 0x11, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 40 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0x80, 0x00, 0x62, 0x00, 41 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x30, 42 | 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 43 | 0x00, 0x00, 0x80, 0x24, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 44 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2c, 0x00, 0x80, 0xc8, 0x00, 45 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x4c, 46 | 0x00, 0x80, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 47 | 0x00, 0x00, 0xc0, 0x4e, 0xc0, 0xdf, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 48 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xc6, 0x3f, 0x60, 0xb4, 0x00, 49 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 50 | 0x00, 0x00, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 51 | 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 52 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 53 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 54 | 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 55 | 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 56 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 57 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 58 | 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 59 | 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 60 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x80, 0x01, 0x30, 0x00, 0x06, 61 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x80, 62 | 0x01, 0x30, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 63 | 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 64 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0xe0, 0x00, 0x00, 0x1e, 65 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 66 | 0x40, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 67 | 0x00, 0x00, 0x10, 0x00, 0x48, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 68 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0xf0, 0x01, 0x00, 0x3e, 69 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 70 | 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 71 | 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 72 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 73 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 74 | 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 75 | 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 76 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 77 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 78 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 79 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 80 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 81 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 82 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 83 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 84 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 85 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 86 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 87 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 88 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 89 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 90 | 0x00, 0x00, 0x00, 0x00 }; -------------------------------------------------------------------------------- /src/ScriptKitty/src/interface/graphics/cat_with_one_exclamation_point_image.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #define cat_with_one_exclamation_point_image_width 128 3 | #define cat_with_one_exclamation_point_imagel_height 64 4 | static unsigned char cat_with_one_exclamation_point_image_bits[] = { 5 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 6 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 7 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 8 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 9 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 10 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 11 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 12 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 13 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 14 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 15 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 16 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 17 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 18 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 19 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 20 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 21 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 22 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 23 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 24 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 25 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 26 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 27 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 28 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 29 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 30 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 31 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 32 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 33 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 34 | 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 35 | 0x00, 0x00, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 36 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x1c, 0x00, 37 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 38 | 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 39 | 0x00, 0x00, 0x80, 0x11, 0x00, 0x04, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 40 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0x00, 0x00, 0x62, 0x00, 41 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x30, 42 | 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 43 | 0x00, 0x00, 0x80, 0x24, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 44 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2c, 0x00, 0x80, 0xc8, 0x00, 45 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x4c, 46 | 0x00, 0x80, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 47 | 0x00, 0x00, 0xc0, 0x4e, 0xc0, 0xdf, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 48 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xc6, 0x3f, 0x60, 0xb4, 0x00, 49 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 50 | 0x00, 0x00, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 51 | 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 52 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 53 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 54 | 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 55 | 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 56 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 57 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 58 | 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 59 | 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 60 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x80, 0x01, 0x30, 0x00, 0x06, 61 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x80, 62 | 0x01, 0x30, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 63 | 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 64 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0xe0, 0x00, 0x00, 0x1e, 65 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 66 | 0x40, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 67 | 0x00, 0x00, 0x10, 0x00, 0x40, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 68 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0xf0, 0x01, 0x00, 0x3e, 69 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 70 | 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 71 | 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 72 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 73 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 74 | 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 75 | 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 76 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 77 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 78 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 79 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 80 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 81 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 82 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 83 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 84 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 85 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 86 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 87 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 88 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 89 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 90 | 0x00, 0x00, 0x00, 0x00 }; -------------------------------------------------------------------------------- /src/ScriptKitty/src/interface/graphics/cat_with_reload_spinner_image.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #define cat_with_reload_spinner_image_width 128 3 | #define cat_with_reload_spinner_image_height 64 4 | static unsigned char cat_with_reload_spinner_image_bits[] = { 5 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 6 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 7 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 8 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 9 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 10 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 11 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 12 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 13 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 14 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 15 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 16 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 17 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 18 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 19 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 20 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 21 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 22 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 23 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 24 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 25 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 26 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 27 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 28 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 29 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 30 | 0xf0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 31 | 0x00, 0x00, 0x00, 0x00, 0x1e, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 32 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 33 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 34 | 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 35 | 0x00, 0x00, 0x00, 0x86, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 36 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0x22, 0x1c, 0x00, 37 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 38 | 0x01, 0x16, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 39 | 0x00, 0x00, 0x80, 0x11, 0x01, 0x0e, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 40 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0x06, 0x1e, 0x62, 0x00, 41 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x30, 42 | 0x1c, 0x3e, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 43 | 0x00, 0x00, 0x80, 0x24, 0x30, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 44 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2c, 0x00, 0x80, 0xc8, 0x00, 45 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x4c, 46 | 0x00, 0x80, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 47 | 0x00, 0x00, 0xc0, 0x4e, 0xc0, 0xdf, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 48 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xc6, 0x3f, 0x60, 0xb4, 0x00, 49 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 50 | 0x00, 0x00, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 51 | 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 52 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 53 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 54 | 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 55 | 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 56 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 57 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 58 | 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 59 | 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 60 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x80, 0x01, 0x30, 0x00, 0x06, 61 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x80, 62 | 0x01, 0x30, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 63 | 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 64 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0xe0, 0x00, 0x00, 0x1e, 65 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 66 | 0x40, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 67 | 0x00, 0x00, 0x10, 0x00, 0x40, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 68 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0xe0, 0x01, 0x00, 0x3e, 69 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 70 | 0x20, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 71 | 0x00, 0x00, 0x10, 0x00, 0xe0, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 72 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 73 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 74 | 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 75 | 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 76 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 77 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 78 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 79 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 80 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 81 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 82 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 83 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 84 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 85 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 86 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 87 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 88 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 89 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 90 | 0x00, 0x00, 0x00, 0x00 }; -------------------------------------------------------------------------------- /src/ScriptKitty/src/interface/graphics/main_cat_image.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #define main_cat_image_width 128 3 | #define main_cat_image_height 64 4 | static unsigned char main_cat_image_bits[] = { 5 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 6 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 7 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 8 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 9 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 10 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 11 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 12 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 13 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 14 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 15 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 16 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 17 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 18 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 19 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 20 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 21 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 22 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 23 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 24 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 25 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 26 | 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 27 | 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 28 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 29 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 30 | 0x8c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 31 | 0x00, 0x00, 0x00, 0x00, 0x8c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 32 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x08, 0x00, 0x00, 33 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 34 | 0x88, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 35 | 0x00, 0x00, 0x00, 0x06, 0x88, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 36 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xf0, 0x00, 0x1c, 0x00, 37 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 38 | 0x80, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 39 | 0x00, 0x00, 0x80, 0x11, 0x80, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 40 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0x80, 0x00, 0x62, 0x00, 41 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x30, 42 | 0xc0, 0x01, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 43 | 0x00, 0x00, 0x80, 0x24, 0xc0, 0x01, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 44 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2c, 0x00, 0x80, 0xc8, 0x00, 45 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x4c, 46 | 0x00, 0x80, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 47 | 0x00, 0x00, 0xc0, 0x4e, 0xc0, 0xdf, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 48 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xc6, 0x3f, 0x60, 0xb4, 0x00, 49 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 50 | 0x00, 0x00, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 51 | 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 52 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 53 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 54 | 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 55 | 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 56 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 57 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 58 | 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 59 | 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 60 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x80, 0x01, 0x30, 0x00, 0x06, 61 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x80, 62 | 0x01, 0x30, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 63 | 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 64 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0xe0, 0x00, 0x00, 0x1e, 65 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 66 | 0x40, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 67 | 0x00, 0x00, 0x10, 0x00, 0x48, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 68 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0xf0, 0x01, 0x00, 0x3e, 69 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 70 | 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 71 | 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 72 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 73 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 74 | 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 75 | 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 76 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 77 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 78 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 79 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 80 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 81 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 82 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 83 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 84 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 85 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 86 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 87 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 88 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 89 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 90 | 0x00, 0x00, 0x00, 0x00 }; -------------------------------------------------------------------------------- /src/ScriptKitty/src/interface/graphics/network_monitor_dash.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #define network_monitor_dash_width 128 3 | #define network_monitor_dash_height 38 4 | static unsigned char network_monitor_dash_bits[] = { 5 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 6 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 7 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 8 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 9 | 0x00, 0x7f, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 10 | 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0x03, 0x00, 0x00, 0xe0, 0x7f, 0x00, 11 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xd5, 0x0f, 0x00, 12 | 0x00, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 13 | 0x78, 0x00, 0x0f, 0x00, 0x00, 0xf8, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 14 | 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x04, 0x00, 0x00, 0x38, 0xcf, 0x01, 15 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 16 | 0x00, 0x38, 0xc6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 17 | 0xc0, 0xff, 0x01, 0x00, 0x00, 0x18, 0x86, 0x01, 0x00, 0x00, 0x00, 0x00, 18 | 0x00, 0x00, 0x00, 0x00, 0xc0, 0xeb, 0x01, 0x00, 0x00, 0x18, 0x86, 0x01, 19 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 20 | 0x00, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 21 | 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 22 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 23 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 24 | 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 25 | 0x00, 0x1c, 0x00, 0x00, 0x00, 0xc0, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 26 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x36, 0x00, 27 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 28 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 29 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 30 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 31 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 32 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 33 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 34 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 35 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 36 | 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 37 | 0x00, 0x7f, 0x00, 0x00, 0x00, 0x06, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 38 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x07, 39 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 40 | 0x00, 0x06, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 41 | 0x00, 0x3e, 0x00, 0x00, 0x00, 0x86, 0x87, 0x05, 0x00, 0x00, 0x00, 0x00, 42 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0xc6, 0xcc, 0x00, 43 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 44 | 0x00, 0x66, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 45 | 0x80, 0xe3, 0x00, 0x00, 0x00, 0x26, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 46 | 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 47 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0x03, 0x00, 48 | 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 49 | 0xe0, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 50 | 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x01, 0x00, 0x00, 0xfe, 0xff, 0x07, 51 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 52 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 53 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 54 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 55 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; -------------------------------------------------------------------------------- /src/ScriptKitty/src/interface/graphics/splash_img.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #define splash_width 128 4 | #define splash_height 64 5 | static unsigned char splash_bits[] = { 6 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 7 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 8 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 9 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 10 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 11 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 12 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 13 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 14 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 15 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 16 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 17 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 18 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 19 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 20 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 21 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 22 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 23 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 24 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 25 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 26 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 27 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 28 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 29 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 30 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 31 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x8c, 0x9f, 0x1f, 0x00, 0x00, 0x00, 32 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xcc, 0x98, 33 | 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 34 | 0x00, 0x30, 0xcc, 0x80, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 35 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xcc, 0x83, 0x31, 0x00, 0x00, 0x00, 36 | 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x8c, 0x8f, 37 | 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x1c, 0x00, 38 | 0x00, 0x30, 0x0c, 0x9c, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 39 | 0x00, 0x00, 0x24, 0x00, 0x00, 0x30, 0x0c, 0x98, 0x31, 0x00, 0x00, 0x00, 40 | 0x00, 0x00, 0x80, 0x11, 0x00, 0x00, 0x22, 0x00, 0x00, 0x30, 0xcc, 0x98, 41 | 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x10, 0x00, 0x00, 0x62, 0x00, 42 | 0x00, 0xe0, 0xc7, 0x8f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x30, 43 | 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 44 | 0x00, 0x00, 0x80, 0x24, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 45 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2c, 0x00, 0x80, 0xc8, 0x00, 46 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x4c, 47 | 0x00, 0x80, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 48 | 0x00, 0x00, 0xc0, 0x4e, 0xc0, 0xdf, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x00, 49 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xc6, 0x3f, 0x60, 0xb4, 0x00, 50 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 51 | 0x00, 0x00, 0xa0, 0x01, 0x00, 0x70, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x06, 52 | 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x70, 0x0c, 0x00, 53 | 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 54 | 0x00, 0xf0, 0xcc, 0x18, 0x1f, 0x3e, 0x3c, 0x1f, 0x00, 0x00, 0x40, 0x00, 55 | 0x00, 0x00, 0x00, 0x01, 0x00, 0xb0, 0xcc, 0x98, 0x3b, 0x77, 0x66, 0x06, 56 | 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb0, 0xcd, 0x98, 57 | 0x31, 0x63, 0x43, 0x06, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 58 | 0x00, 0x30, 0xcd, 0x98, 0x31, 0x63, 0x7f, 0x06, 0x00, 0x00, 0x22, 0x00, 59 | 0x00, 0x00, 0x00, 0x33, 0x00, 0x30, 0xcf, 0x98, 0x31, 0x63, 0x03, 0x06, 60 | 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x30, 0xce, 0x9c, 61 | 0x39, 0x73, 0x46, 0x06, 0x00, 0x00, 0x18, 0x80, 0x01, 0x30, 0x00, 0x06, 62 | 0x00, 0x30, 0x8e, 0x1f, 0x3f, 0x7e, 0x3c, 0x1e, 0x00, 0x00, 0x10, 0x80, 63 | 0x01, 0x30, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0x00, 0x00, 64 | 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 65 | 0x31, 0x63, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0xe0, 0x00, 0x00, 0x1e, 66 | 0x00, 0x00, 0x00, 0x00, 0x1f, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 67 | 0x40, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 68 | 0x00, 0x00, 0x10, 0x00, 0x48, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 69 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0xf0, 0x01, 0x00, 0x3e, 70 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 71 | 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 72 | 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 73 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 74 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 75 | 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 76 | 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 77 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 78 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 79 | 0x00, 0xe0, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 80 | 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x0c, 0x08, 0x00, 0x00, 0x00, 0x00, 81 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0xff, 0x03, 0x18, 0x08, 0x08, 82 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 83 | 0x1e, 0x0e, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 84 | 0x00, 0x00, 0x02, 0x00, 0xf0, 0x03, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 85 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0e, 0x08, 86 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 87 | 0x00, 0xc0, 0x03, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 88 | 0x00, 0x00, 0x01, 0x7e, 0x00, 0x60, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 89 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x81, 0x0f, 0x1e, 0x00, 0x08, 90 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 91 | 0xf0, 0x03, 0x00, 0x08 }; 92 | -------------------------------------------------------------------------------- /src/ScriptKitty/src/interface/lib/DevKittyInterface.cpp: -------------------------------------------------------------------------------- 1 | #include "DevKittyInterface.h" 2 | #include "dejavu.h" 3 | 4 | //---------------------------------------- 5 | // DevKittyInputs 6 | 7 | DevKittyInputs::DevKittyInputs() { 8 | this->lastBtn = 0; 9 | this->pressedButton = -1; 10 | 11 | this->addButton(BTN_UP); 12 | this->addButton(BTN_DOWN); 13 | this->addButton(BTN_LEFT); 14 | this->addButton(BTN_RIGHT); 15 | } 16 | 17 | void DevKittyInputs::addButton(int pin) { 18 | pinMode(pin, INPUT_PULLUP); 19 | this->buttons[this->lastBtn++] = pin; 20 | } 21 | 22 | int DevKittyInputs::getInput() { 23 | int buttonState; 24 | if (this->pressedButton != BTN_NONE){ 25 | buttonState = digitalRead(this->pressedButton); 26 | if (buttonState==BTN_PRESS){ 27 | return BTN_NONE; 28 | } 29 | this->pressedButton = BTN_NONE; 30 | return BTN_NONE; 31 | } 32 | 33 | for (int i = 0; i < BTN_COUNT; i++){ 34 | int btn = this->buttons[i]; 35 | buttonState = digitalRead(btn); 36 | if (buttonState==BTN_PRESS){ 37 | this->pressedButton = btn; 38 | return btn; 39 | } 40 | } 41 | 42 | this->pressedButton = -1; 43 | return BTN_NONE; 44 | } 45 | 46 | //---------------------------------------- 47 | // DevKittyScreen 48 | 49 | DevKittyScreen::DevKittyScreen(){ 50 | this->alwaysUpdate = false; 51 | } 52 | DevKittyScreen::~DevKittyScreen(){ 53 | } 54 | void DevKittyScreen::setDisplay(SH1106Wire* display){ 55 | this->display = display; 56 | } 57 | void DevKittyScreen::setInputs(DevKittyInputs* inputs){ 58 | this->inputs = inputs; 59 | } 60 | void DevKittyScreen::setStrip(Adafruit_NeoPixel* strip){ 61 | this->strip = strip; 62 | } 63 | void DevKittyScreen::setDevKittyInterface(DevKittyInterface* nI){ 64 | this->devKittyInterface = nI; 65 | } 66 | void DevKittyScreen::pushScreen(DevKittyScreen* screen){ 67 | this->devKittyInterface->pushScreen(screen); 68 | } 69 | void DevKittyScreen::alwaysUpdates(bool set){ 70 | this->alwaysUpdate = set; 71 | } 72 | int DevKittyScreen::_update(){ 73 | int btn = this->inputs->getInput(); 74 | if (btn == BTN_NONE && !(this->alwaysUpdate)){ 75 | delay(2); 76 | return SCREEN_NONE; 77 | } 78 | return this->update(btn); 79 | } 80 | 81 | //---------------------------------------- 82 | // DevKittyInterface 83 | DevKittyInterface::DevKittyInterface(){ 84 | SH1106Wire* nDisplay = new SH1106Wire(0x3C, 33, 35); 85 | this->inputs = new DevKittyInputs(); 86 | this->screenLock = xSemaphoreCreateMutex(); 87 | if (this->screenLock == nullptr) { 88 | Serial.println("[DevKittyInterface] mutex could not be created"); 89 | } 90 | nDisplay->init(); 91 | nDisplay->flipScreenVertically(); 92 | nDisplay->setTextAlignment(TEXT_ALIGN_LEFT); 93 | nDisplay->setFont(DejaVu_Sans_Mono_10); 94 | this->display = nDisplay; 95 | this->currentScreenNode = nullptr; 96 | 97 | pinMode(NEOPIXEL_PIN, OUTPUT); 98 | this->strip = new Adafruit_NeoPixel(NEOPIXEL_PIN_CNT, NEOPIXEL_PIN, NEO_RGB + NEO_KHZ800); 99 | this->strip->begin(); 100 | } 101 | 102 | DevKittyInterface::~DevKittyInterface(){ 103 | while (this->currentScreenNode != nullptr){ 104 | this->popScreen(); 105 | } 106 | delete this->display; 107 | delete this->inputs; 108 | delete this->strip; 109 | } 110 | 111 | bool DevKittyInterface::start(){ 112 | while (true) { 113 | if (xSemaphoreTake(this->screenLock, 0)==pdFALSE) { 114 | delay(10); 115 | continue; 116 | } 117 | int action = SCREEN_NONE; 118 | if (!currentScreenHasRendered) { 119 | this->draw(); 120 | action = this->currentScreenNode->screen->update(EVENT_INIT); 121 | this->currentScreenHasRendered = (volatile bool*) true; 122 | } else { 123 | action = this->currentScreenNode->screen->_update(); 124 | } 125 | 126 | if (action==SCREEN_BACK){ 127 | this->popScreen(); 128 | } 129 | if (action==SCREEN_REDRAW){ 130 | this->draw(); 131 | } 132 | if (action==SCREEN_PUSH){ 133 | this->draw(); 134 | this->currentScreenNode->screen->update(EVENT_INIT); 135 | } 136 | xSemaphoreGive(this->screenLock); 137 | } 138 | } 139 | 140 | // injectScreen pushes a screen onto the stack e.g. from a thread that did 141 | // not call DevKittyInterface::start. This function returns false if the screen 142 | // could not be locked in wait TICKS 143 | bool DevKittyInterface::injectScreen(DevKittyScreen* screen){ 144 | if (xSemaphoreTake(this->screenLock, 200)==pdFALSE) { 145 | // could not acquire lock 146 | return false; 147 | } 148 | this->pushScreen(screen); 149 | //this->draw(); 150 | //this->currentScreenNode->screen->update(EVENT_INIT); 151 | xSemaphoreGive(this->screenLock); 152 | } 153 | 154 | bool DevKittyInterface::pushScreen(DevKittyScreen* screen){ 155 | if (screen==nullptr) { 156 | return false; 157 | } 158 | screen->setDisplay(this->display); 159 | screen->setInputs(this->inputs); 160 | screen->setStrip(this->strip); 161 | screen->setDevKittyInterface(this); 162 | ScreenNode* nextScreenNode = new ScreenNode; 163 | nextScreenNode->prev = this->currentScreenNode; 164 | nextScreenNode->screen = screen; 165 | 166 | this->currentScreenNode = nextScreenNode; 167 | this->currentScreenHasRendered = (volatile bool*) false; 168 | return true; 169 | } 170 | 171 | bool DevKittyInterface::popScreen(){ 172 | if (this->currentScreenNode->prev == nullptr){ 173 | return false; 174 | } 175 | volatile ScreenNode* popped = this->currentScreenNode; 176 | this->currentScreenNode = this->currentScreenNode->prev; 177 | this->currentScreenHasRendered = (volatile bool*) false; 178 | delete popped->screen; 179 | delete popped; 180 | 181 | return true; 182 | } 183 | 184 | bool DevKittyInterface::draw() { 185 | if (this->currentScreenNode == nullptr){ 186 | return false; 187 | } 188 | this->display->clear(); 189 | this->currentScreenNode->screen->draw(); 190 | this->display->display(); 191 | return true; 192 | } 193 | -------------------------------------------------------------------------------- /src/ScriptKitty/src/interface/lib/DevKittyInterface.h: -------------------------------------------------------------------------------- 1 | #ifndef DEVKITTY_INTERFACE_H 2 | #define DEVKITTY_INTERFACE_H 3 | 4 | #include 5 | #include "SH1106Wire.h" 6 | 7 | //---------------------------------------- 8 | // DevKittyInputs 9 | 10 | #define BTN_NONE -1 11 | #define BTN_PRESS 0 12 | #define BTN_NPRESS 1 13 | 14 | #define BTN_COUNT 4 15 | #define BTN_UP 9 16 | #define BTN_DOWN 18 17 | #define BTN_LEFT 11 18 | #define BTN_RIGHT 7 19 | 20 | #define NEOPIXEL_PIN 12 21 | #define NEOPIXEL_PIN_CNT 1 22 | 23 | #define EVENT_INIT 100 24 | 25 | class DevKittyInputs { 26 | public: 27 | DevKittyInputs(); 28 | int getInput(); 29 | private: 30 | void addButton(int); 31 | int buttons[BTN_COUNT]; 32 | int pressedButton; 33 | int lastBtn; 34 | }; 35 | 36 | //---------------------------------------- 37 | // DevKittyScreen 38 | 39 | class DevKittyInterface; 40 | 41 | #define SCREEN_NONE 1 42 | #define SCREEN_BACK 2 43 | #define SCREEN_REDRAW 3 44 | #define SCREEN_PUSH 4 45 | 46 | class DevKittyScreen { 47 | public: 48 | DevKittyScreen(); 49 | virtual ~DevKittyScreen(); 50 | virtual bool draw() = 0; 51 | virtual int update(int){return SCREEN_NONE;}; 52 | void setDisplay(SH1106Wire*); 53 | void setInputs(DevKittyInputs*); 54 | void setStrip(Adafruit_NeoPixel*); 55 | void setDevKittyInterface(DevKittyInterface*); 56 | int _update(); 57 | protected: 58 | SH1106Wire* display; 59 | DevKittyInputs* inputs; 60 | Adafruit_NeoPixel* strip; 61 | void pushScreen(DevKittyScreen*); 62 | void alwaysUpdates(bool); 63 | private: 64 | DevKittyInterface* devKittyInterface; 65 | bool alwaysUpdate; 66 | }; 67 | 68 | //---------------------------------------- 69 | // ScreenNode 70 | 71 | struct ScreenNode { 72 | DevKittyScreen* screen; 73 | volatile ScreenNode* prev; 74 | }; 75 | 76 | 77 | //---------------------------------------- 78 | // DevKittyInterface 79 | 80 | class DevKittyInterface { 81 | public: 82 | DevKittyInterface(); 83 | ~DevKittyInterface(); 84 | bool start(); 85 | bool draw(); 86 | bool pushScreen(DevKittyScreen*); 87 | bool popScreen(); 88 | bool injectScreen(DevKittyScreen*); 89 | private: 90 | SH1106Wire* display; 91 | DevKittyInputs* inputs; 92 | Adafruit_NeoPixel* strip; 93 | volatile ScreenNode* currentScreenNode; 94 | volatile bool* currentScreenHasRendered; 95 | volatile SemaphoreHandle_t screenLock; 96 | }; 97 | 98 | 99 | #endif -------------------------------------------------------------------------------- /src/ScriptKitty/src/interface/lib/dejavu.h: -------------------------------------------------------------------------------- 1 | #ifndef FONT_DEJAVU_SANS_MONO_10 2 | #define FONT_DEJAVU_SANS_MONO_10 3 | 4 | // Created by http://oleddisplay.squix.ch/ Consider a donation 5 | const uint8_t DejaVu_Sans_Mono_10[] PROGMEM = { 6 | 0x06, // Width: 6 7 | 0x0D, // Height: 13 8 | 0x20, // First Char: 32 9 | 0xE0, // Numbers of Chars: 224 10 | 11 | // Jump Table: 12 | 0xFF, 0xFF, 0x00, 0x06, // 32:65535 13 | 0x00, 0x00, 0x08, 0x06, // 33:0 14 | 0x00, 0x08, 0x09, 0x06, // 34:8 15 | 0x00, 0x11, 0x0B, 0x06, // 35:17 16 | 0x00, 0x1C, 0x0C, 0x06, // 36:28 17 | 0x00, 0x28, 0x0C, 0x06, // 37:40 18 | 0x00, 0x34, 0x0C, 0x06, // 38:52 19 | 0x00, 0x40, 0x07, 0x06, // 39:64 20 | 0x00, 0x47, 0x08, 0x06, // 40:71 21 | 0x00, 0x4F, 0x08, 0x06, // 41:79 22 | 0x00, 0x57, 0x0B, 0x06, // 42:87 23 | 0x00, 0x62, 0x0B, 0x06, // 43:98 24 | 0x00, 0x6D, 0x06, 0x06, // 44:109 25 | 0x00, 0x73, 0x09, 0x06, // 45:115 26 | 0x00, 0x7C, 0x06, 0x06, // 46:124 27 | 0x00, 0x82, 0x0B, 0x06, // 47:130 28 | 0x00, 0x8D, 0x0C, 0x06, // 48:141 29 | 0x00, 0x99, 0x0C, 0x06, // 49:153 30 | 0x00, 0xA5, 0x0C, 0x06, // 50:165 31 | 0x00, 0xB1, 0x0C, 0x06, // 51:177 32 | 0x00, 0xBD, 0x0B, 0x06, // 52:189 33 | 0x00, 0xC8, 0x0C, 0x06, // 53:200 34 | 0x00, 0xD4, 0x0C, 0x06, // 54:212 35 | 0x00, 0xE0, 0x0B, 0x06, // 55:224 36 | 0x00, 0xEB, 0x0C, 0x06, // 56:235 37 | 0x00, 0xF7, 0x0C, 0x06, // 57:247 38 | 0x01, 0x03, 0x06, 0x06, // 58:259 39 | 0x01, 0x09, 0x06, 0x06, // 59:265 40 | 0x01, 0x0F, 0x0C, 0x06, // 60:271 41 | 0x01, 0x1B, 0x09, 0x06, // 61:283 42 | 0x01, 0x24, 0x0B, 0x06, // 62:292 43 | 0x01, 0x2F, 0x09, 0x06, // 63:303 44 | 0x01, 0x38, 0x0C, 0x06, // 64:312 45 | 0x01, 0x44, 0x0C, 0x06, // 65:324 46 | 0x01, 0x50, 0x0C, 0x06, // 66:336 47 | 0x01, 0x5C, 0x0C, 0x06, // 67:348 48 | 0x01, 0x68, 0x0C, 0x06, // 68:360 49 | 0x01, 0x74, 0x0C, 0x06, // 69:372 50 | 0x01, 0x80, 0x0B, 0x06, // 70:384 51 | 0x01, 0x8B, 0x0C, 0x06, // 71:395 52 | 0x01, 0x97, 0x0C, 0x06, // 72:407 53 | 0x01, 0xA3, 0x0C, 0x06, // 73:419 54 | 0x01, 0xAF, 0x0A, 0x06, // 74:431 55 | 0x01, 0xB9, 0x0C, 0x06, // 75:441 56 | 0x01, 0xC5, 0x0C, 0x06, // 76:453 57 | 0x01, 0xD1, 0x0C, 0x06, // 77:465 58 | 0x01, 0xDD, 0x0C, 0x06, // 78:477 59 | 0x01, 0xE9, 0x0C, 0x06, // 79:489 60 | 0x01, 0xF5, 0x0B, 0x06, // 80:501 61 | 0x02, 0x00, 0x0C, 0x06, // 81:512 62 | 0x02, 0x0C, 0x0C, 0x06, // 82:524 63 | 0x02, 0x18, 0x0C, 0x06, // 83:536 64 | 0x02, 0x24, 0x0B, 0x06, // 84:548 65 | 0x02, 0x2F, 0x0C, 0x06, // 85:559 66 | 0x02, 0x3B, 0x0B, 0x06, // 86:571 67 | 0x02, 0x46, 0x0B, 0x06, // 87:582 68 | 0x02, 0x51, 0x0C, 0x06, // 88:593 69 | 0x02, 0x5D, 0x0B, 0x06, // 89:605 70 | 0x02, 0x68, 0x0C, 0x06, // 90:616 71 | 0x02, 0x74, 0x08, 0x06, // 91:628 72 | 0x02, 0x7C, 0x0C, 0x06, // 92:636 73 | 0x02, 0x88, 0x08, 0x06, // 93:648 74 | 0x02, 0x90, 0x09, 0x06, // 94:656 75 | 0x02, 0x99, 0x0C, 0x06, // 95:665 76 | 0x02, 0xA5, 0x05, 0x06, // 96:677 77 | 0x02, 0xAA, 0x0C, 0x06, // 97:682 78 | 0x02, 0xB6, 0x0C, 0x06, // 98:694 79 | 0x02, 0xC2, 0x0A, 0x06, // 99:706 80 | 0x02, 0xCC, 0x0C, 0x06, // 100:716 81 | 0x02, 0xD8, 0x0C, 0x06, // 101:728 82 | 0x02, 0xE4, 0x09, 0x06, // 102:740 83 | 0x02, 0xED, 0x0C, 0x06, // 103:749 84 | 0x02, 0xF9, 0x0C, 0x06, // 104:761 85 | 0x03, 0x05, 0x0C, 0x06, // 105:773 86 | 0x03, 0x11, 0x08, 0x06, // 106:785 87 | 0x03, 0x19, 0x0C, 0x06, // 107:793 88 | 0x03, 0x25, 0x0A, 0x06, // 108:805 89 | 0x03, 0x2F, 0x0C, 0x06, // 109:815 90 | 0x03, 0x3B, 0x0C, 0x06, // 110:827 91 | 0x03, 0x47, 0x0C, 0x06, // 111:839 92 | 0x03, 0x53, 0x0C, 0x06, // 112:851 93 | 0x03, 0x5F, 0x0C, 0x06, // 113:863 94 | 0x03, 0x6B, 0x0B, 0x06, // 114:875 95 | 0x03, 0x76, 0x0C, 0x06, // 115:886 96 | 0x03, 0x82, 0x0A, 0x06, // 116:898 97 | 0x03, 0x8C, 0x0C, 0x06, // 117:908 98 | 0x03, 0x98, 0x0B, 0x06, // 118:920 99 | 0x03, 0xA3, 0x0B, 0x06, // 119:931 100 | 0x03, 0xAE, 0x0C, 0x06, // 120:942 101 | 0x03, 0xBA, 0x0B, 0x06, // 121:954 102 | 0x03, 0xC5, 0x0C, 0x06, // 122:965 103 | 0x03, 0xD1, 0x0A, 0x06, // 123:977 104 | 0x03, 0xDB, 0x08, 0x06, // 124:987 105 | 0x03, 0xE3, 0x0B, 0x06, // 125:995 106 | 0x03, 0xEE, 0x0B, 0x06, // 126:1006 107 | 0x03, 0xF9, 0x0C, 0x06, // 127:1017 108 | 0x04, 0x05, 0x0C, 0x06, // 128:1029 109 | 0x04, 0x11, 0x0C, 0x06, // 129:1041 110 | 0x04, 0x1D, 0x0C, 0x06, // 130:1053 111 | 0x04, 0x29, 0x0C, 0x06, // 131:1065 112 | 0x04, 0x35, 0x0C, 0x06, // 132:1077 113 | 0x04, 0x41, 0x0C, 0x06, // 133:1089 114 | 0x04, 0x4D, 0x0C, 0x06, // 134:1101 115 | 0x04, 0x59, 0x0C, 0x06, // 135:1113 116 | 0x04, 0x65, 0x0C, 0x06, // 136:1125 117 | 0x04, 0x71, 0x0C, 0x06, // 137:1137 118 | 0x04, 0x7D, 0x0C, 0x06, // 138:1149 119 | 0x04, 0x89, 0x0C, 0x06, // 139:1161 120 | 0x04, 0x95, 0x0C, 0x06, // 140:1173 121 | 0x04, 0xA1, 0x0C, 0x06, // 141:1185 122 | 0x04, 0xAD, 0x0C, 0x06, // 142:1197 123 | 0x04, 0xB9, 0x0C, 0x06, // 143:1209 124 | 0x04, 0xC5, 0x0C, 0x06, // 144:1221 125 | 0x04, 0xD1, 0x0C, 0x06, // 145:1233 126 | 0x04, 0xDD, 0x0C, 0x06, // 146:1245 127 | 0x04, 0xE9, 0x0C, 0x06, // 147:1257 128 | 0x04, 0xF5, 0x0C, 0x06, // 148:1269 129 | 0x05, 0x01, 0x0C, 0x06, // 149:1281 130 | 0x05, 0x0D, 0x0C, 0x06, // 150:1293 131 | 0x05, 0x19, 0x0C, 0x06, // 151:1305 132 | 0x05, 0x25, 0x0C, 0x06, // 152:1317 133 | 0x05, 0x31, 0x0C, 0x06, // 153:1329 134 | 0x05, 0x3D, 0x0C, 0x06, // 154:1341 135 | 0x05, 0x49, 0x0C, 0x06, // 155:1353 136 | 0x05, 0x55, 0x0C, 0x06, // 156:1365 137 | 0x05, 0x61, 0x0C, 0x06, // 157:1377 138 | 0x05, 0x6D, 0x0C, 0x06, // 158:1389 139 | 0x05, 0x79, 0x0C, 0x06, // 159:1401 140 | 0xFF, 0xFF, 0x00, 0x06, // 160:65535 141 | 0x05, 0x85, 0x08, 0x06, // 161:1413 142 | 0x05, 0x8D, 0x0A, 0x06, // 162:1421 143 | 0x05, 0x97, 0x0C, 0x06, // 163:1431 144 | 0x05, 0xA3, 0x0C, 0x06, // 164:1443 145 | 0x05, 0xAF, 0x0B, 0x06, // 165:1455 146 | 0x05, 0xBA, 0x08, 0x06, // 166:1466 147 | 0x05, 0xC2, 0x0A, 0x06, // 167:1474 148 | 0x05, 0xCC, 0x09, 0x06, // 168:1484 149 | 0x05, 0xD5, 0x0B, 0x06, // 169:1493 150 | 0x05, 0xE0, 0x0A, 0x06, // 170:1504 151 | 0x05, 0xEA, 0x0A, 0x06, // 171:1514 152 | 0x05, 0xF4, 0x0B, 0x06, // 172:1524 153 | 0x05, 0xFF, 0x09, 0x06, // 173:1535 154 | 0x06, 0x08, 0x0B, 0x06, // 174:1544 155 | 0x06, 0x13, 0x09, 0x06, // 175:1555 156 | 0x06, 0x1C, 0x07, 0x06, // 176:1564 157 | 0x06, 0x23, 0x0C, 0x06, // 177:1571 158 | 0x06, 0x2F, 0x09, 0x06, // 178:1583 159 | 0x06, 0x38, 0x09, 0x06, // 179:1592 160 | 0x06, 0x41, 0x07, 0x06, // 180:1601 161 | 0x06, 0x48, 0x0C, 0x06, // 181:1608 162 | 0x06, 0x54, 0x0C, 0x06, // 182:1620 163 | 0x06, 0x60, 0x05, 0x06, // 183:1632 164 | 0x06, 0x65, 0x08, 0x06, // 184:1637 165 | 0x06, 0x6D, 0x09, 0x06, // 185:1645 166 | 0x06, 0x76, 0x0A, 0x06, // 186:1654 167 | 0x06, 0x80, 0x09, 0x06, // 187:1664 168 | 0x06, 0x89, 0x0C, 0x06, // 188:1673 169 | 0x06, 0x95, 0x0C, 0x06, // 189:1685 170 | 0x06, 0xA1, 0x0C, 0x06, // 190:1697 171 | 0x06, 0xAD, 0x0A, 0x06, // 191:1709 172 | 0x06, 0xB7, 0x0C, 0x06, // 192:1719 173 | 0x06, 0xC3, 0x0C, 0x06, // 193:1731 174 | 0x06, 0xCF, 0x0C, 0x06, // 194:1743 175 | 0x06, 0xDB, 0x0C, 0x06, // 195:1755 176 | 0x06, 0xE7, 0x0C, 0x06, // 196:1767 177 | 0x06, 0xF3, 0x0C, 0x06, // 197:1779 178 | 0x06, 0xFF, 0x0C, 0x06, // 198:1791 179 | 0x07, 0x0B, 0x0C, 0x06, // 199:1803 180 | 0x07, 0x17, 0x0C, 0x06, // 200:1815 181 | 0x07, 0x23, 0x0C, 0x06, // 201:1827 182 | 0x07, 0x2F, 0x0C, 0x06, // 202:1839 183 | 0x07, 0x3B, 0x0C, 0x06, // 203:1851 184 | 0x07, 0x47, 0x0C, 0x06, // 204:1863 185 | 0x07, 0x53, 0x0C, 0x06, // 205:1875 186 | 0x07, 0x5F, 0x0C, 0x06, // 206:1887 187 | 0x07, 0x6B, 0x0C, 0x06, // 207:1899 188 | 0x07, 0x77, 0x0C, 0x06, // 208:1911 189 | 0x07, 0x83, 0x0C, 0x06, // 209:1923 190 | 0x07, 0x8F, 0x0C, 0x06, // 210:1935 191 | 0x07, 0x9B, 0x0C, 0x06, // 211:1947 192 | 0x07, 0xA7, 0x0C, 0x06, // 212:1959 193 | 0x07, 0xB3, 0x0C, 0x06, // 213:1971 194 | 0x07, 0xBF, 0x0C, 0x06, // 214:1983 195 | 0x07, 0xCB, 0x0C, 0x06, // 215:1995 196 | 0x07, 0xD7, 0x0C, 0x06, // 216:2007 197 | 0x07, 0xE3, 0x0C, 0x06, // 217:2019 198 | 0x07, 0xEF, 0x0C, 0x06, // 218:2031 199 | 0x07, 0xFB, 0x0C, 0x06, // 219:2043 200 | 0x08, 0x07, 0x0C, 0x06, // 220:2055 201 | 0x08, 0x13, 0x0B, 0x06, // 221:2067 202 | 0x08, 0x1E, 0x0B, 0x06, // 222:2078 203 | 0x08, 0x29, 0x0C, 0x06, // 223:2089 204 | 0x08, 0x35, 0x0C, 0x06, // 224:2101 205 | 0x08, 0x41, 0x0C, 0x06, // 225:2113 206 | 0x08, 0x4D, 0x0C, 0x06, // 226:2125 207 | 0x08, 0x59, 0x0C, 0x06, // 227:2137 208 | 0x08, 0x65, 0x0C, 0x06, // 228:2149 209 | 0x08, 0x71, 0x0C, 0x06, // 229:2161 210 | 0x08, 0x7D, 0x0C, 0x06, // 230:2173 211 | 0x08, 0x89, 0x0A, 0x06, // 231:2185 212 | 0x08, 0x93, 0x0C, 0x06, // 232:2195 213 | 0x08, 0x9F, 0x0C, 0x06, // 233:2207 214 | 0x08, 0xAB, 0x0C, 0x06, // 234:2219 215 | 0x08, 0xB7, 0x0C, 0x06, // 235:2231 216 | 0x08, 0xC3, 0x0C, 0x06, // 236:2243 217 | 0x08, 0xCF, 0x0C, 0x06, // 237:2255 218 | 0x08, 0xDB, 0x0C, 0x06, // 238:2267 219 | 0x08, 0xE7, 0x0C, 0x06, // 239:2279 220 | 0x08, 0xF3, 0x0C, 0x06, // 240:2291 221 | 0x08, 0xFF, 0x0C, 0x06, // 241:2303 222 | 0x09, 0x0B, 0x0C, 0x06, // 242:2315 223 | 0x09, 0x17, 0x0C, 0x06, // 243:2327 224 | 0x09, 0x23, 0x0C, 0x06, // 244:2339 225 | 0x09, 0x2F, 0x0C, 0x06, // 245:2351 226 | 0x09, 0x3B, 0x0C, 0x06, // 246:2363 227 | 0x09, 0x47, 0x09, 0x06, // 247:2375 228 | 0x09, 0x50, 0x0C, 0x06, // 248:2384 229 | 0x09, 0x5C, 0x0C, 0x06, // 249:2396 230 | 0x09, 0x68, 0x0C, 0x06, // 250:2408 231 | 0x09, 0x74, 0x0C, 0x06, // 251:2420 232 | 0x09, 0x80, 0x0C, 0x06, // 252:2432 233 | 0x09, 0x8C, 0x0B, 0x06, // 253:2444 234 | 0x09, 0x97, 0x0C, 0x06, // 254:2455 235 | 0x09, 0xA3, 0x0B, 0x06, // 255:2467 236 | 237 | // Font Data: 238 | 0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x02, // 33 239 | 0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x38, // 34 240 | 0x80,0x00,0xE0,0x03,0xB8,0x00,0xE0,0x03,0xB8,0x00,0x20, // 35 241 | 0x00,0x00,0x60,0x02,0x50,0x02,0xF8,0x07,0x90,0x02,0x90,0x01, // 36 242 | 0x38,0x00,0xA8,0x00,0x78,0x00,0xC0,0x03,0xA0,0x02,0x80,0x03, // 37 243 | 0x00,0x00,0xC0,0x01,0x38,0x02,0x68,0x02,0x88,0x01,0xC0,0x02, // 38 244 | 0x00,0x00,0x00,0x00,0x00,0x00,0x38, // 39 245 | 0x00,0x00,0x00,0x00,0xF8,0x03,0x04,0x04, // 40 246 | 0x00,0x00,0x00,0x00,0x0C,0x06,0xF0,0x01, // 41 247 | 0x00,0x00,0x48,0x00,0x30,0x00,0x78,0x00,0x30,0x00,0x48, // 42 248 | 0x00,0x00,0x40,0x00,0x40,0x00,0xF0,0x01,0x40,0x00,0x40, // 43 249 | 0x00,0x00,0x00,0x00,0x00,0x0E, // 44 250 | 0x00,0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x80, // 45 251 | 0x00,0x00,0x00,0x00,0x00,0x02, // 46 252 | 0x00,0x00,0x00,0x04,0x00,0x03,0xC0,0x00,0x30,0x00,0x08, // 47 253 | 0x00,0x00,0xF0,0x01,0x08,0x02,0x48,0x02,0x08,0x02,0xF0,0x01, // 48 254 | 0x00,0x00,0x08,0x02,0x08,0x02,0xF8,0x03,0x00,0x02,0x00,0x02, // 49 255 | 0x00,0x00,0x10,0x02,0x08,0x03,0x88,0x02,0xC8,0x02,0x70,0x02, // 50 256 | 0x00,0x00,0x10,0x01,0x48,0x02,0x48,0x02,0x48,0x02,0xB0,0x01, // 51 257 | 0x00,0x00,0xC0,0x00,0xE0,0x00,0x90,0x00,0xF8,0x03,0x80, // 52 258 | 0x00,0x00,0x38,0x02,0x28,0x02,0x28,0x02,0x28,0x02,0xC0,0x01, // 53 259 | 0x00,0x00,0xF0,0x01,0x58,0x02,0x48,0x02,0x48,0x02,0x88,0x01, // 54 260 | 0x00,0x00,0x08,0x00,0x08,0x02,0x88,0x01,0x78,0x00,0x18, // 55 261 | 0x00,0x00,0xB0,0x01,0x48,0x02,0x48,0x02,0x48,0x02,0xB0,0x01, // 56 262 | 0x00,0x00,0x30,0x02,0x48,0x02,0x48,0x02,0x48,0x03,0xF0,0x01, // 57 263 | 0x00,0x00,0x00,0x00,0x20,0x02, // 58 264 | 0x00,0x00,0x00,0x00,0x20,0x0E, // 59 265 | 0x00,0x00,0x40,0x00,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x10,0x01, // 60 266 | 0xA0,0x00,0xA0,0x00,0xA0,0x00,0xA0,0x00,0xA0, // 61 267 | 0x00,0x00,0x10,0x01,0xA0,0x00,0xA0,0x00,0xA0,0x00,0x40, // 62 268 | 0x00,0x00,0x08,0x00,0xC8,0x02,0x28,0x00,0x18, // 63 269 | 0x00,0x00,0xE0,0x03,0x18,0x04,0xE8,0x0B,0x28,0x0A,0xF0,0x03, // 64 270 | 0x00,0x00,0x00,0x03,0xE0,0x00,0x98,0x00,0xE0,0x00,0x00,0x03, // 65 271 | 0x00,0x00,0xF8,0x03,0x48,0x02,0x48,0x02,0x48,0x02,0xB0,0x01, // 66 272 | 0x00,0x00,0xF0,0x01,0x18,0x03,0x08,0x02,0x08,0x02,0x18,0x03, // 67 273 | 0x00,0x00,0xF8,0x03,0x08,0x02,0x08,0x02,0x18,0x03,0xF0,0x01, // 68 274 | 0x00,0x00,0xF8,0x03,0x48,0x02,0x48,0x02,0x48,0x02,0x48,0x02, // 69 275 | 0x00,0x00,0xF8,0x03,0x48,0x00,0x48,0x00,0x48,0x00,0x48, // 70 276 | 0x00,0x00,0xF0,0x01,0x18,0x03,0x08,0x02,0x48,0x02,0xD0,0x03, // 71 277 | 0x00,0x00,0xF8,0x03,0x40,0x00,0x40,0x00,0x40,0x00,0xF8,0x03, // 72 278 | 0x00,0x00,0x08,0x02,0x08,0x02,0xF8,0x03,0x08,0x02,0x08,0x02, // 73 279 | 0x00,0x00,0x00,0x01,0x08,0x02,0x08,0x02,0xF8,0x01, // 74 280 | 0x00,0x00,0xF8,0x03,0x40,0x00,0xA0,0x00,0x10,0x01,0x08,0x02, // 75 281 | 0x00,0x00,0xF8,0x03,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02, // 76 282 | 0x00,0x00,0xF8,0x03,0x30,0x00,0x40,0x00,0x30,0x00,0xF8,0x03, // 77 283 | 0x00,0x00,0xF8,0x03,0x30,0x00,0x40,0x00,0x80,0x01,0xF8,0x03, // 78 284 | 0x00,0x00,0xF0,0x01,0x08,0x02,0x08,0x02,0x08,0x02,0xF0,0x01, // 79 285 | 0x00,0x00,0xF8,0x03,0x48,0x00,0x48,0x00,0x48,0x00,0x30, // 80 286 | 0x00,0x00,0xF0,0x01,0x08,0x02,0x08,0x02,0x08,0x06,0xF0,0x05, // 81 287 | 0x00,0x00,0xF8,0x03,0x48,0x00,0x48,0x00,0xC8,0x00,0xB0,0x01, // 82 288 | 0x00,0x00,0x30,0x01,0x48,0x02,0x48,0x02,0x48,0x02,0x90,0x01, // 83 289 | 0x00,0x00,0x08,0x00,0x08,0x00,0xF8,0x03,0x08,0x00,0x08, // 84 290 | 0x00,0x00,0xF8,0x01,0x00,0x02,0x00,0x02,0x00,0x02,0xF8,0x01, // 85 291 | 0x00,0x00,0x18,0x00,0xE0,0x00,0x00,0x03,0xE0,0x00,0x18, // 86 292 | 0x38,0x00,0xC0,0x03,0x70,0x00,0x70,0x00,0xC0,0x03,0x38, // 87 293 | 0x00,0x00,0x08,0x02,0xB0,0x01,0x40,0x00,0xB0,0x01,0x08,0x02, // 88 294 | 0x00,0x00,0x08,0x00,0x30,0x00,0xC0,0x03,0x30,0x00,0x08, // 89 295 | 0x00,0x00,0x08,0x02,0x88,0x03,0x48,0x02,0x38,0x02,0x08,0x02, // 90 296 | 0x00,0x00,0x00,0x00,0xFC,0x07,0x04,0x04, // 91 297 | 0x00,0x00,0x08,0x00,0x30,0x00,0xC0,0x00,0x00,0x03,0x00,0x04, // 92 298 | 0x00,0x00,0x00,0x00,0x04,0x04,0xFC,0x07, // 93 299 | 0x20,0x00,0x10,0x00,0x08,0x00,0x10,0x00,0x20, // 94 300 | 0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08, // 95 301 | 0x00,0x00,0x04,0x00,0x08, // 96 302 | 0x00,0x00,0x20,0x03,0xA0,0x02,0xA0,0x02,0xA0,0x02,0xC0,0x03, // 97 303 | 0x00,0x00,0xFC,0x03,0x20,0x02,0x20,0x02,0x20,0x02,0xC0,0x01, // 98 304 | 0x00,0x00,0xC0,0x01,0x20,0x02,0x20,0x02,0x20,0x02, // 99 305 | 0x00,0x00,0xC0,0x01,0x20,0x02,0x20,0x02,0x20,0x02,0xFC,0x03, // 100 306 | 0x00,0x00,0xC0,0x01,0xA0,0x02,0xA0,0x02,0xA0,0x02,0xC0,0x02, // 101 307 | 0x00,0x00,0x20,0x00,0xF8,0x03,0x24,0x00,0x24, // 102 308 | 0x00,0x00,0xC0,0x01,0x20,0x0A,0x20,0x0A,0x20,0x0A,0xE0,0x07, // 103 309 | 0x00,0x00,0xFC,0x03,0x40,0x00,0x20,0x00,0x20,0x00,0xC0,0x03, // 104 310 | 0x00,0x00,0x00,0x02,0x20,0x02,0xE4,0x03,0x00,0x02,0x00,0x02, // 105 311 | 0x00,0x00,0x20,0x08,0x20,0x08,0xE4,0x07, // 106 312 | 0x00,0x00,0xFC,0x03,0x80,0x00,0xC0,0x00,0x20,0x01,0x00,0x02, // 107 313 | 0x04,0x00,0x04,0x00,0xFC,0x01,0x00,0x02,0x00,0x02, // 108 314 | 0x00,0x00,0xE0,0x03,0x20,0x00,0xE0,0x03,0x20,0x00,0xE0,0x03, // 109 315 | 0x00,0x00,0xE0,0x03,0x40,0x00,0x20,0x00,0x20,0x00,0xC0,0x03, // 110 316 | 0x00,0x00,0xC0,0x01,0x20,0x02,0x20,0x02,0x20,0x02,0xC0,0x01, // 111 317 | 0x00,0x00,0xE0,0x0F,0x20,0x02,0x20,0x02,0x20,0x02,0xC0,0x01, // 112 318 | 0x00,0x00,0xC0,0x01,0x20,0x02,0x20,0x02,0x20,0x02,0xE0,0x0F, // 113 319 | 0x00,0x00,0x00,0x00,0xE0,0x03,0x20,0x00,0x20,0x00,0x60, // 114 320 | 0x00,0x00,0x40,0x02,0xA0,0x02,0xA0,0x02,0xA0,0x02,0xA0,0x01, // 115 321 | 0x00,0x00,0x20,0x00,0xF8,0x03,0x20,0x02,0x20,0x02, // 116 322 | 0x00,0x00,0xE0,0x01,0x00,0x02,0x00,0x02,0x00,0x02,0xE0,0x03, // 117 323 | 0x00,0x00,0x20,0x00,0xC0,0x01,0x00,0x02,0xC0,0x01,0x20, // 118 324 | 0x00,0x00,0x60,0x00,0x80,0x03,0x40,0x00,0x80,0x03,0x60, // 119 325 | 0x00,0x00,0x20,0x02,0x60,0x03,0x80,0x00,0x60,0x03,0x20,0x02, // 120 326 | 0x00,0x00,0x20,0x08,0xC0,0x08,0x00,0x07,0xC0,0x00,0x20, // 121 327 | 0x00,0x00,0x20,0x02,0x20,0x03,0xA0,0x02,0x60,0x02,0x20,0x02, // 122 328 | 0x00,0x00,0x40,0x00,0x40,0x00,0xBC,0x07,0x04,0x04, // 123 329 | 0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x0F, // 124 330 | 0x00,0x00,0x00,0x00,0x04,0x04,0xBC,0x07,0x40,0x00,0x40, // 125 331 | 0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x80,0x00,0x80, // 126 332 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 127 333 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 128 334 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 129 335 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 130 336 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 131 337 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 132 338 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 133 339 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 134 340 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 135 341 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 136 342 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 137 343 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 138 344 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 139 345 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 140 346 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 141 347 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 142 348 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 143 349 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 144 350 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 145 351 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 146 352 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 147 353 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 148 354 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 149 355 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 150 356 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 151 357 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 152 358 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 153 359 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 154 360 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 155 361 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 156 362 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 157 363 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 158 364 | 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F, // 159 365 | 0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0x0F, // 161 366 | 0x00,0x00,0xC0,0x01,0x20,0x02,0xF0,0x0F,0x20,0x02, // 162 367 | 0x00,0x00,0x40,0x02,0xF0,0x03,0x48,0x02,0x48,0x02,0x08,0x02, // 163 368 | 0x00,0x00,0x10,0x01,0xE0,0x00,0xA0,0x00,0xE0,0x00,0x10,0x01, // 164 369 | 0x00,0x00,0xA8,0x00,0xB0,0x00,0xC0,0x03,0xB0,0x00,0xA8, // 165 370 | 0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x0F, // 166 371 | 0x00,0x00,0xD8,0x04,0xA8,0x04,0x68,0x05,0xC8,0x06, // 167 372 | 0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04, // 168 373 | 0xE0,0x00,0x18,0x03,0x68,0x02,0x98,0x02,0x98,0x03,0xE0, // 169 374 | 0x00,0x00,0x78,0x01,0x58,0x01,0x58,0x01,0x78,0x01, // 170 375 | 0x00,0x00,0xC0,0x00,0x20,0x01,0xC0,0x00,0x20,0x01, // 171 376 | 0x00,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0xC0, // 172 377 | 0x00,0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x80, // 173 378 | 0xE0,0x00,0x18,0x03,0xF8,0x02,0x78,0x02,0xB8,0x03,0xE0, // 174 379 | 0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08, // 175 380 | 0x00,0x00,0x38,0x00,0x28,0x00,0x38, // 176 381 | 0x00,0x00,0x40,0x02,0x40,0x02,0xF0,0x03,0x40,0x02,0x40,0x02, // 177 382 | 0x00,0x00,0x00,0x00,0x48,0x00,0x68,0x00,0x58, // 178 383 | 0x00,0x00,0x00,0x00,0x48,0x00,0x58,0x00,0x68, // 179 384 | 0x00,0x00,0x00,0x00,0x08,0x00,0x04, // 180 385 | 0x00,0x00,0xE0,0x0F,0x00,0x02,0x00,0x02,0x00,0x02,0xE0,0x03, // 181 386 | 0x00,0x00,0x30,0x00,0x78,0x00,0xF8,0x07,0x08,0x00,0xF8,0x07, // 182 387 | 0x00,0x00,0x00,0x00,0xC0, // 183 388 | 0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x0C, // 184 389 | 0x00,0x00,0x00,0x00,0x48,0x00,0x78,0x00,0x40, // 185 390 | 0x00,0x00,0x30,0x01,0x48,0x01,0x48,0x01,0x30,0x01, // 186 391 | 0x00,0x00,0x20,0x01,0xC0,0x00,0x20,0x01,0xC0, // 187 392 | 0x80,0x00,0xA4,0x00,0xFC,0x06,0x60,0x06,0x40,0x0F,0x00,0x04, // 188 393 | 0x80,0x00,0xA4,0x00,0xFC,0x00,0x60,0x09,0x40,0x0D,0x00,0x0B, // 189 394 | 0x80,0x00,0xA4,0x00,0xEC,0x06,0x74,0x06,0x40,0x0F,0x00,0x04, // 190 395 | 0x00,0x00,0x00,0x0C,0x00,0x0A,0xA0,0x09,0x00,0x08, // 191 396 | 0x00,0x00,0x00,0x03,0xE1,0x00,0x9A,0x00,0xE0,0x00,0x00,0x03, // 192 397 | 0x00,0x00,0x00,0x03,0xE0,0x00,0x9A,0x00,0xE1,0x00,0x00,0x03, // 193 398 | 0x00,0x00,0x00,0x03,0xE2,0x00,0x99,0x00,0xE2,0x00,0x00,0x03, // 194 399 | 0x00,0x00,0x00,0x03,0xE3,0x00,0x9A,0x00,0xE1,0x00,0x00,0x03, // 195 400 | 0x00,0x00,0x00,0x03,0xE2,0x00,0x98,0x00,0xE2,0x00,0x00,0x03, // 196 401 | 0x00,0x00,0x00,0x03,0xE6,0x00,0x9A,0x00,0xE6,0x00,0x00,0x03, // 197 402 | 0x00,0x03,0xE0,0x00,0x98,0x00,0xF8,0x03,0x48,0x02,0x48,0x02, // 198 403 | 0x00,0x00,0xF0,0x01,0x18,0x0B,0x08,0x0E,0x08,0x02,0x18,0x03, // 199 404 | 0x00,0x00,0xF8,0x03,0x49,0x02,0x4A,0x02,0x48,0x02,0x48,0x02, // 200 405 | 0x00,0x00,0xF8,0x03,0x48,0x02,0x4A,0x02,0x49,0x02,0x48,0x02, // 201 406 | 0x00,0x00,0xF8,0x03,0x4A,0x02,0x49,0x02,0x4A,0x02,0x48,0x02, // 202 407 | 0x00,0x00,0xF8,0x03,0x4A,0x02,0x48,0x02,0x4A,0x02,0x48,0x02, // 203 408 | 0x00,0x00,0x08,0x02,0x09,0x02,0xFA,0x03,0x08,0x02,0x08,0x02, // 204 409 | 0x00,0x00,0x08,0x02,0x08,0x02,0xFA,0x03,0x09,0x02,0x08,0x02, // 205 410 | 0x00,0x00,0x08,0x02,0x0A,0x02,0xF9,0x03,0x0A,0x02,0x08,0x02, // 206 411 | 0x00,0x00,0x08,0x02,0x0A,0x02,0xF8,0x03,0x0A,0x02,0x08,0x02, // 207 412 | 0x40,0x00,0xF8,0x03,0x48,0x02,0x08,0x02,0x18,0x03,0xF0,0x01, // 208 413 | 0x00,0x00,0xF8,0x03,0x33,0x00,0x42,0x00,0x81,0x01,0xF8,0x03, // 209 414 | 0x00,0x00,0xF0,0x01,0x09,0x02,0x0A,0x02,0x08,0x02,0xF0,0x01, // 210 415 | 0x00,0x00,0xF0,0x01,0x08,0x02,0x0A,0x02,0x09,0x02,0xF0,0x01, // 211 416 | 0x00,0x00,0xF0,0x01,0x0A,0x02,0x09,0x02,0x0A,0x02,0xF0,0x01, // 212 417 | 0x00,0x00,0xF0,0x01,0x0B,0x02,0x0A,0x02,0x09,0x02,0xF0,0x01, // 213 418 | 0x00,0x00,0xF0,0x01,0x0A,0x02,0x08,0x02,0x0A,0x02,0xF0,0x01, // 214 419 | 0x00,0x00,0x20,0x02,0x40,0x01,0x80,0x00,0x40,0x01,0x20,0x02, // 215 420 | 0x00,0x02,0xF0,0x01,0x88,0x02,0x48,0x02,0x28,0x02,0xF8,0x01, // 216 421 | 0x00,0x00,0xF8,0x01,0x01,0x02,0x02,0x02,0x00,0x02,0xF8,0x01, // 217 422 | 0x00,0x00,0xF8,0x01,0x00,0x02,0x02,0x02,0x01,0x02,0xF8,0x01, // 218 423 | 0x00,0x00,0xF8,0x01,0x02,0x02,0x01,0x02,0x02,0x02,0xF8,0x01, // 219 424 | 0x00,0x00,0xF8,0x01,0x02,0x02,0x00,0x02,0x02,0x02,0xF8,0x01, // 220 425 | 0x00,0x00,0x08,0x00,0x30,0x00,0xC2,0x03,0x31,0x00,0x08, // 221 426 | 0x00,0x00,0xF8,0x03,0x90,0x00,0x90,0x00,0x90,0x00,0x60, // 222 427 | 0x00,0x00,0xF8,0x03,0x04,0x00,0x74,0x02,0x98,0x02,0x80,0x03, // 223 428 | 0x00,0x00,0x24,0x03,0xA8,0x02,0xA0,0x02,0xA0,0x02,0xC0,0x03, // 224 429 | 0x00,0x00,0x20,0x03,0xA8,0x02,0xA4,0x02,0xA0,0x02,0xC0,0x03, // 225 430 | 0x00,0x00,0x28,0x03,0xA4,0x02,0xA8,0x02,0xA0,0x02,0xC0,0x03, // 226 431 | 0x00,0x00,0x28,0x03,0xA4,0x02,0xA8,0x02,0xA4,0x02,0xC0,0x03, // 227 432 | 0x00,0x00,0x20,0x03,0xA4,0x02,0xA0,0x02,0xA4,0x02,0xC0,0x03, // 228 433 | 0x00,0x00,0x20,0x03,0xAE,0x02,0xAA,0x02,0xAE,0x02,0xC0,0x03, // 229 434 | 0x00,0x00,0xA0,0x03,0xA0,0x02,0xC0,0x01,0xA0,0x02,0xE0,0x02, // 230 435 | 0x00,0x00,0xC0,0x01,0x20,0x02,0x20,0x0A,0x20,0x0E, // 231 436 | 0x00,0x00,0xC4,0x01,0xA8,0x02,0xA0,0x02,0xA0,0x02,0xC0,0x02, // 232 437 | 0x00,0x00,0xC0,0x01,0xA8,0x02,0xA4,0x02,0xA0,0x02,0xC0,0x02, // 233 438 | 0x00,0x00,0xC8,0x01,0xA4,0x02,0xA8,0x02,0xA0,0x02,0xC0,0x02, // 234 439 | 0x00,0x00,0xC0,0x01,0xA4,0x02,0xA0,0x02,0xA4,0x02,0xC0,0x02, // 235 440 | 0x00,0x00,0x04,0x02,0x28,0x02,0xE0,0x03,0x00,0x02,0x00,0x02, // 236 441 | 0x00,0x00,0x00,0x02,0x28,0x02,0xE4,0x03,0x00,0x02,0x00,0x02, // 237 442 | 0x00,0x00,0x08,0x02,0x24,0x02,0xE8,0x03,0x00,0x02,0x00,0x02, // 238 443 | 0x00,0x00,0x00,0x02,0x24,0x02,0xE0,0x03,0x04,0x02,0x00,0x02, // 239 444 | 0x00,0x00,0xC0,0x01,0x2C,0x02,0x28,0x02,0x38,0x02,0xE0,0x01, // 240 445 | 0x00,0x00,0xE8,0x03,0x44,0x00,0x28,0x00,0x24,0x00,0xC0,0x03, // 241 446 | 0x00,0x00,0xC4,0x01,0x28,0x02,0x20,0x02,0x20,0x02,0xC0,0x01, // 242 447 | 0x00,0x00,0xC0,0x01,0x28,0x02,0x24,0x02,0x20,0x02,0xC0,0x01, // 243 448 | 0x00,0x00,0xC0,0x01,0x28,0x02,0x24,0x02,0x28,0x02,0xC0,0x01, // 244 449 | 0x00,0x00,0xC8,0x01,0x24,0x02,0x2C,0x02,0x28,0x02,0xC4,0x01, // 245 450 | 0x00,0x00,0xC0,0x01,0x24,0x02,0x20,0x02,0x24,0x02,0xC0,0x01, // 246 451 | 0x40,0x00,0x40,0x00,0x50,0x01,0x40,0x00,0x40, // 247 452 | 0x00,0x00,0xC0,0x03,0x20,0x03,0xA0,0x02,0x60,0x02,0xE0,0x01, // 248 453 | 0x00,0x00,0xE4,0x01,0x08,0x02,0x00,0x02,0x00,0x02,0xE0,0x03, // 249 454 | 0x00,0x00,0xE0,0x01,0x08,0x02,0x04,0x02,0x00,0x02,0xE0,0x03, // 250 455 | 0x00,0x00,0xE0,0x01,0x08,0x02,0x04,0x02,0x08,0x02,0xE0,0x03, // 251 456 | 0x00,0x00,0xE0,0x01,0x04,0x02,0x00,0x02,0x04,0x02,0xE0,0x03, // 252 457 | 0x00,0x00,0x20,0x08,0xC8,0x08,0x04,0x07,0xC0,0x00,0x20, // 253 458 | 0x00,0x00,0xFC,0x0F,0x20,0x02,0x20,0x02,0x20,0x02,0xC0,0x01, // 254 459 | 0x00,0x00,0x20,0x08,0xC4,0x08,0x00,0x07,0xC4,0x00,0x20 // 255 460 | }; 461 | 462 | #endif -------------------------------------------------------------------------------- /src/ScriptKitty/src/interface/screens/dir.cpp: -------------------------------------------------------------------------------- 1 | #include "dir.h" 2 | #include "../graphics.h" 3 | #include "../../ScriptKitty.h" 4 | #include "../../utils.h" 5 | 6 | DirScreen::DirScreen(String path) { 7 | this->path = path; 8 | this->files = nullptr; 9 | this->numFiles = 0; 10 | this->selected = 0; 11 | this->top = 0; 12 | 13 | // TODO: files could be null; draw/update should handle this 14 | this->files = newFileList(path.c_str(), numFiles); 15 | } 16 | 17 | DirScreen::~DirScreen() { 18 | if (files){ 19 | delete this->files; 20 | } 21 | } 22 | 23 | int DirScreen::update(int btn) { 24 | switch(btn){ 25 | case BTN_UP: 26 | if (this->selected != 0) { 27 | this->selected--; 28 | } 29 | if (this->selected < this->top) { 30 | this->top--; 31 | } 32 | break; 33 | case BTN_DOWN: 34 | if (this->selected < this->numFiles-1) { 35 | this->selected++; 36 | } 37 | if (this->selected-this->top > DIR_SCREEN_MAX_SHOWN-1){ 38 | this->top++; 39 | } 40 | break; 41 | case BTN_LEFT: 42 | return SCREEN_BACK; 43 | case BTN_RIGHT: 44 | if(files[selected].fattrib & AM_DIR){ // directory; enter it 45 | String nextPath(path); 46 | if (nextPath.length()!=1){ 47 | nextPath += "/"; 48 | } 49 | nextPath += files[selected].fname; 50 | Serial.printf("Before dir screen alloc. Mem: %d\n", ESP.getFreeHeap()); 51 | DevKittyScreen* subdir = new DirScreen(nextPath); 52 | this->pushScreen(subdir); 53 | return SCREEN_PUSH; 54 | } else { // file; assume it's a payload and run it 55 | String payloadPath = path; 56 | if (payloadPath.length()!=1){ 57 | payloadPath += "/"; 58 | } 59 | payloadPath += files[selected].fname; 60 | Serial.printf("Before runner alloc. Mem: %d\n", ESP.getFreeHeap()); 61 | fileOp op = readFile(payloadPath); 62 | if (op.ok) { 63 | DevKittyScreen* runner = new ScriptRunnerScreen(op.result); 64 | this->pushScreen(runner); 65 | return SCREEN_PUSH; 66 | } else { 67 | // TODO: inform the user the payload could not be opened 68 | } 69 | } 70 | } 71 | return SCREEN_REDRAW; 72 | } 73 | 74 | 75 | // item0 <-- files; item0 extends "above" screen 76 | // ┌──────────────────┐ 77 | // │ item1 │ <-- top=1 78 | // │ item2 │ 79 | // │ > item3 │ <-- cursor=3; third item, not third from top 80 | // │ item4 │ <-- numFiles=5 81 | // ├──────────────────┤ 82 | // │/path/items │ <-- footer 83 | // └──────────────────┘ 84 | bool DirScreen::draw() { 85 | if (!files || this->selected >= this->numFiles || (this->top > 0 && this->numFiles < DIR_SCREEN_MAX_SHOWN)) { 86 | Serial.printf("[displayFiles] condition error: (files:%p)(numFiles:%d)(selected:%d)(top:%d)\n"); 87 | // TODO: display error screen 88 | return false; 89 | } 90 | 91 | // loop condition: display only DIR_SCREEN_MAX_SHOWN at a time, and not more 92 | // than files we actually have. 93 | for (int i = top; i < top+DIR_SCREEN_MAX_SHOWN && i < numFiles; i++) { 94 | String fileName(files[i].fname); 95 | if (fileName.length() > 12) { 96 | fileName = fileName.substring(0, 9) + "..."; 97 | } 98 | display->drawString(6, 10*(i-top), fileName); 99 | } 100 | // Cursor 101 | display->drawRect(2,10*(selected-top)+6,2,2); 102 | 103 | // Footer 104 | display->drawLine(0, 54, 127, 54); 105 | display->drawLine(0, 53, 127, 53); 106 | display->drawString(0,54,"Dir:"); 107 | if(path.length() > 17) { 108 | display->drawString(25, 54, path.substring(0,14)+"..."); 109 | } else { 110 | display->drawString(25, 54, path); 111 | } 112 | // Cat image 113 | display->drawXbm(0, 0, 128, 64, main_cat_image_bits); 114 | return true; 115 | } 116 | 117 | -------------------------------------------------------------------------------- /src/ScriptKitty/src/interface/screens/dir.h: -------------------------------------------------------------------------------- 1 | #ifndef DIR_SCREEN_H 2 | #define DIR_SCREEN_H 3 | 4 | #define DIR_SCREEN_MAX_SHOWN 4 5 | 6 | #include "cdcusb.h" 7 | #include "mscusb.h" 8 | #include "flashdisk.h" 9 | 10 | #include "../lib/DevKittyInterface.h" 11 | #include "runner.h" 12 | 13 | 14 | class DirScreen : public DevKittyScreen { 15 | public: 16 | DirScreen(String path); 17 | ~DirScreen(); 18 | bool draw(); 19 | int update(int); 20 | private: 21 | FILINFO* files; 22 | String path; 23 | int numFiles; 24 | int selected; 25 | int top; 26 | }; 27 | 28 | #endif 29 | -------------------------------------------------------------------------------- /src/ScriptKitty/src/interface/screens/runner.cpp: -------------------------------------------------------------------------------- 1 | #include "runner.h" 2 | 3 | #include "hidkeyboard.h" 4 | 5 | #include "../../ScriptKitty.h" 6 | #include "../../../keyboardlayout.h" 7 | #include "../graphics.h" 8 | 9 | extern HIDkeyboard keyboard; //TODO: remove this 10 | 11 | ScriptRunnerScreen::ScriptRunnerScreen(String payload) { 12 | this->has_run = false; 13 | this->payload = payload; 14 | Serial.println("[ScriptRunnerInit]"); 15 | Serial.println(payload); 16 | } 17 | 18 | int ScriptRunnerScreen::update(int btn) { 19 | if (!has_run) { 20 | runPayload(this->payload, this->display, this->strip); 21 | has_run = true; 22 | return SCREEN_REDRAW; 23 | } 24 | if (btn==BTN_LEFT){ 25 | return SCREEN_BACK; 26 | } 27 | return SCREEN_REDRAW; 28 | } 29 | 30 | bool ScriptRunnerScreen::draw() { 31 | if (!has_run) { 32 | display->clear(); 33 | return true; 34 | } 35 | display->drawXbm(0, 0, 128, 64, cat_with_exclamation_points_image_bits); 36 | display->drawString(3,9,"Press LEFT"); 37 | display->drawString(3,19,"to go back"); 38 | display->drawLine(0, 54, 127, 54); 39 | display->drawLine(0, 53, 127, 53); 40 | display->drawString(0, 54, "FINISHED PAYLOAD"); 41 | return true; 42 | } 43 | 44 | void runPayload(String payload, SH1106Wire* display, Adafruit_NeoPixel* strip) { 45 | strip->setPixelColor(0, strip->Color(255,0, 0)); 46 | strip->show(); strip->show(); strip->show(); 47 | 48 | String command; 49 | 50 | for (int i=0; i < payload.length(); i++) { 51 | if (payload.charAt(i) == '\n') { 52 | Serial.println(command); 53 | processDuckyScript(command, display, strip); 54 | command = ""; 55 | } 56 | command+=payload[i]; 57 | } 58 | processDuckyScript(command, display, strip); 59 | display->clear(); 60 | 61 | //manually update display 62 | display->drawXbm(0, 0, 128, 64, cat_with_exclamation_points_image_bits); 63 | display->display(); 64 | strip->setPixelColor(0, strip->Color(0,0, 0)); 65 | strip->show(); strip->show(); 66 | } 67 | 68 | bool keyKnown(String keyPress) { 69 | Serial.print("looking for: "); 70 | Serial.println(keyPress); 71 | for (int i=0; i< (sizeof(keyMapRN)/sizeof(keyMapRN[0])); i++) { 72 | if (keyPress.equals(keyMapRN[i].title)) { 73 | Serial.print(keyMapRN[i].title); 74 | Serial.println(" found!"); 75 | return true; 76 | } 77 | } 78 | return false; 79 | } 80 | 81 | void pressNamedKey(String keyPress, uint8_t modifiers) { 82 | for (int i=0; i< (sizeof(keyMapRN)/sizeof(keyMapRN[0])); i++) { 83 | if (keyPress.equals(keyMapRN[i].title)) { 84 | keyboard.sendPress(keyMapRN[i].key, modifiers); 85 | } 86 | } 87 | } 88 | 89 | void processDuckyScript(String ducky, SH1106Wire* display, Adafruit_NeoPixel* strip) { 90 | uint16_t defaultDelay = 10; 91 | String tCommand = ducky.substring(0, ducky.indexOf(' ')); // get command 92 | tCommand.toUpperCase(); tCommand.trim(); 93 | const KEYMAP* keymap = keyboard.getKeymap(); 94 | 95 | display->clear(); 96 | display->drawLine(0, 54, 127, 54); 97 | display->drawLine(0, 53, 127, 53); 98 | display->drawString(0, 54, "RUNNING PAYLOAD"); 99 | display->display(); 100 | 101 | if (tCommand.equals("REM")) { 102 | Serial.println("Comment"); 103 | } 104 | else if (tCommand.equals("LOCALE")) { 105 | String locale = ducky.substring(ducky.indexOf(' ')+1, ducky.length()); 106 | Serial.printf("Locale:[%s]\n", locale); 107 | if (locale == "EN") { 108 | keyboard.setKeymap(keymap_us); 109 | } 110 | else if (locale=="ES") { 111 | keyboard.setKeymap(keymap_es); 112 | } 113 | else if (locale=="DE") { 114 | keyboard.setKeymap(keymap_de); 115 | } 116 | else if (locale=="FR") { 117 | keyboard.setKeymap(keymap_fr); 118 | } 119 | else if (locale=="PT") { 120 | keyboard.setKeymap(keymap_pt); 121 | } 122 | else { 123 | Serial.printf("cannot find keyset for: %s\n", locale); 124 | } 125 | } 126 | else if (tCommand.equals("DELAY")) { 127 | display->drawString(3,12,"DELAY: "); 128 | display->drawString(3,22,(String) ducky.substring(ducky.indexOf(' ')+1, ducky.length())); 129 | display->drawXbm(0, 0, 128, 64, cat_with_reload_spinner_image_bits); 130 | display->display(); 131 | delay(ducky.substring(ducky.indexOf(' ')+1, ducky.length()).toInt()); // delay in MS 132 | Serial.println("Delayed!"); 133 | } 134 | else if (tCommand.equals("DEFAULT_DELAY") or tCommand.equals("DEFAULTDELAY")) { 135 | display->drawString(3,12,"DEFAULT"); 136 | display->drawString(3,22,"DELAY:"); 137 | display->drawString(3,32,(String) ducky.substring(ducky.indexOf(' ')+1, ducky.length())); 138 | display->drawXbm(0, 0, 128, 64, cat_with_reload_spinner_image_bits); 139 | display->display(); 140 | defaultDelay = ducky.substring(ducky.indexOf(' ')+1, ducky.length()).toInt(); 141 | } 142 | else if (tCommand.equals("LED")) { 143 | display->drawString(3,12,"COLOR:"); 144 | display->drawString(3,22,(String) ducky.substring(ducky.indexOf(' ')+1, ducky.length())); // accept single color parameter 145 | display->drawXbm(0, 0, 128, 64, cat_with_reload_spinner_image_bits); 146 | display->display(); 147 | String color = (String) ducky.substring(ducky.indexOf(' ')+1, ducky.length()); 148 | color.toUpperCase(); 149 | 150 | if (color.equals("R")) { strip->setPixelColor(0, strip->Color(255,0, 0)); } 151 | else if (color.equals("G")) { 152 | strip->setPixelColor(0, strip->Color(0,255, 0)); 153 | } 154 | else if (color.equals("B")) { 155 | strip->setPixelColor(0, strip->Color(0,0, 255)); 156 | } 157 | else if (color.equals("Y")) { 158 | strip->setPixelColor(0, strip->Color(255,255, 0)); 159 | } 160 | else if (color.equals("C")) { 161 | strip->setPixelColor(0, strip->Color(0,255, 255)); 162 | } 163 | else if (color.equals("M")) { 164 | strip->setPixelColor(0, strip->Color(255,0, 255)); 165 | } 166 | else if (color.equals("W")) { 167 | strip->setPixelColor(0, strip->Color(120,120, 120)); 168 | } 169 | strip->show(); strip->show(); 170 | } 171 | else if (tCommand.equals("STRING")) { 172 | display->drawString(3,12,"STRING: "); 173 | if (String(ducky.substring(ducky.indexOf(' ')+1, ducky.length())).length() > 11) { 174 | display->drawString(3,22,String(ducky.substring(ducky.indexOf(' ')+1, ducky.length())).substring(0,8)+"..."); 175 | } 176 | else { 177 | display->drawString(3,22,String(ducky.substring(ducky.indexOf(' ')+1, ducky.length()))); 178 | } 179 | display->drawXbm(0, 0, 128, 64, cat_with_one_exclamation_point_image_bits); 180 | display->display(); 181 | Serial.println("String"); 182 | String tmpString = String(ducky.substring(ducky.indexOf(' ')+1, ducky.length())); 183 | keyboard.sendString(tmpString); 184 | } 185 | 186 | else if (keyKnown(tCommand)) { 187 | display->drawString(3,12,"KEY PRESS"); 188 | ducky.trim(); // remove leading, trailing whitespace 189 | int currentTokenLeftIndex = 0; 190 | int currentTokenRightIndex = 0; 191 | String currentToken; 192 | uint8_t modifiers = 0; 193 | 194 | while (currentTokenLeftIndex < ducky.length()) { 195 | int nextSpace = ducky.indexOf(' ', currentTokenLeftIndex); 196 | if (nextSpace==-1){ 197 | currentTokenRightIndex = ducky.length(); 198 | } else { 199 | currentTokenRightIndex = nextSpace; 200 | } 201 | currentToken = ducky.substring(currentTokenLeftIndex, currentTokenRightIndex); 202 | if (currentToken == "CTRL" || currentToken == "CONTROL"){ 203 | modifiers += KEY_MOD_LCTRL; 204 | } else if (currentToken == "SHIFT"){ 205 | modifiers += KEY_MOD_LSHIFT; 206 | } else if (currentToken == "ALT") { 207 | modifiers += KEY_MOD_LALT; 208 | } else if (currentToken== "GUI" or currentToken =="WINDOWS"){ 209 | modifiers += KEY_MOD_LMETA; 210 | } 211 | 212 | else if (currentToken.length() != 1) { 213 | // Search for named key, e.g. DELETE or TAB 214 | if (keyKnown(currentToken)){ 215 | pressNamedKey(currentToken, modifiers); 216 | delay(2); 217 | } else { 218 | // unknown named key 219 | display->drawString(3,22,String("ERROR")); 220 | display->display(); 221 | delay(1000); 222 | } 223 | } else { 224 | // Single letter like the 's' in: CTRL s 225 | unsigned char keycode = keymap[currentToken[0]].usage; 226 | keyboard.sendPress(keycode, modifiers); 227 | delay(2); 228 | } 229 | currentTokenLeftIndex = currentTokenRightIndex + 1; 230 | } 231 | keyboard.sendRelease(); 232 | } 233 | else { 234 | Serial.println("Command not found"); 235 | } 236 | 237 | display->display(); 238 | } -------------------------------------------------------------------------------- /src/ScriptKitty/src/interface/screens/runner.h: -------------------------------------------------------------------------------- 1 | #ifndef SCRIPT_RUNNER_SCREEN_H 2 | #define SCRIPT_RUNNER_SCREEN_H 3 | 4 | #include "../lib/DevKittyInterface.h" 5 | 6 | 7 | class ScriptRunnerScreen : public DevKittyScreen { 8 | public: 9 | ScriptRunnerScreen(String payload); 10 | bool draw(); 11 | int update(int); 12 | private: 13 | String payload; 14 | bool has_run; 15 | }; 16 | 17 | void runPayload(String payload, SH1106Wire* display, Adafruit_NeoPixel* strip); 18 | void processDuckyScript(String ducky, SH1106Wire* display, Adafruit_NeoPixel* strip); 19 | void pressNamedKey(String keyPress, uint8_t modifiers); 20 | bool keyKnown(String keyPress); 21 | 22 | #endif 23 | -------------------------------------------------------------------------------- /src/ScriptKitty/src/interface/screens/splash.cpp: -------------------------------------------------------------------------------- 1 | #include "splash.h" 2 | #include "../graphics.h" 3 | 4 | SplashScreen::SplashScreen(unsigned long durationInMs) { 5 | this->endAt = millis()+durationInMs; 6 | } 7 | 8 | int SplashScreen::update(int button) { 9 | // update even when there's no keypress 10 | this->alwaysUpdates(true); 11 | unsigned int currentTime = millis(); 12 | if (currentTime > this->endAt) { 13 | return SCREEN_BACK; 14 | } 15 | if (button==EVENT_INIT){ 16 | return SCREEN_REDRAW; 17 | } 18 | return SCREEN_NONE; 19 | } 20 | 21 | bool SplashScreen::draw() { 22 | display->drawXbm(0, 0, 128, 64, ScriptKitty_Splash_bits); 23 | // display->drawString(104,0,"1.0"); 24 | // display->drawRect(102,0,24,12); 25 | return true; 26 | } 27 | -------------------------------------------------------------------------------- /src/ScriptKitty/src/interface/screens/splash.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "../lib/DevKittyInterface.h" 3 | 4 | class SplashScreen: public DevKittyScreen { 5 | public: 6 | SplashScreen(unsigned long durationInMs); 7 | ~SplashScreen(){}; 8 | bool draw(); 9 | int update(int); 10 | private: 11 | unsigned long endAt; 12 | }; -------------------------------------------------------------------------------- /src/ScriptKitty/src/utils.cpp: -------------------------------------------------------------------------------- 1 | #include "utils.h" 2 | 3 | fileOp saveFile(String path, String content) { 4 | fileOp ret; 5 | ret.ok = false; 6 | 7 | // create parent directories as needed 8 | FILINFO filinfo; 9 | int pathSoFarIdx = 1; 10 | while(true) { 11 | int nextDir = path.indexOf("/", pathSoFarIdx); 12 | if (nextDir == -1){ 13 | break; 14 | } 15 | String pathSoFar = path.substring(0, nextDir); 16 | if (FR_OK != f_stat(pathSoFar.c_str(), &filinfo)){ 17 | if (f_mkdir(pathSoFar.c_str()) != FR_OK) { 18 | ret.result = String("could not create directory"); 19 | return ret; 20 | } 21 | } 22 | pathSoFarIdx = nextDir+1; 23 | } 24 | 25 | // Create file 26 | FIL file; 27 | if (FR_OK != f_open(&file, path.c_str(), FA_WRITE | FA_CREATE_ALWAYS)){ 28 | ret.result = String("could not open file for writing"); 29 | return ret; 30 | } 31 | 32 | // Write to file 33 | UINT written = 0; 34 | if (FR_OK != f_write(&file, content.c_str(), content.length(), &written)){ 35 | f_close(&file); 36 | ret.result = String("could not write to file"); 37 | return ret; 38 | } 39 | f_close(&file); 40 | ret.ok = true; 41 | return ret; 42 | } 43 | 44 | fileOp readFile(String path){ 45 | fileOp ret; 46 | ret.ok = false; 47 | 48 | // open file 49 | FIL file; 50 | FRESULT fr = f_open(&file, path.c_str(), FA_READ); 51 | if (fr != FR_OK) { 52 | // TODO: add more specific reason for failure. For now, return most likely 53 | // reason for failure 54 | ret.result = String("file doesn't exist"); 55 | return ret; 56 | } 57 | 58 | // read file contents 59 | uint16_t size = f_size(&file); 60 | char* data = (char*) malloc(size+1); 61 | UINT bytesRead; 62 | fr = f_read(&file, data, (UINT)size, &bytesRead); 63 | 64 | if (fr == FR_OK && bytesRead==size) { 65 | ret.result = String(data); 66 | ret.result = ret.result.substring(0, bytesRead); 67 | ret.ok = true; 68 | Serial.println("[readFile]"); 69 | Serial.println(ret.result); 70 | } else { 71 | ret.result = String("error reading file"); 72 | } 73 | f_close(&file); 74 | return ret; 75 | } 76 | 77 | fileOp base64Decode(String encoded) { 78 | fileOp ret; 79 | ret.ok = true; 80 | encoded.replace(" ", "/"); // why 81 | const char* encodedCStr = encoded.c_str(); 82 | uint8_t decoded[BASE64::decodeLength(encodedCStr)+1]={0}; 83 | BASE64::decode(encodedCStr, decoded); 84 | ret.result = String((char*)decoded); 85 | return ret; 86 | } -------------------------------------------------------------------------------- /src/ScriptKitty/src/utils.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "Arduino.h" 3 | #include 4 | #include "base64.hpp" 5 | #include "cdcusb.h" 6 | #include "mscusb.h" 7 | #include "flashdisk.h" 8 | 9 | struct fileOp { 10 | bool ok; 11 | String result; 12 | }; 13 | 14 | // saveFile attempts to write the file, creating parent directories as 15 | // needed. the path should start with '/' and not end with '/'. 16 | fileOp saveFile(String path, String contents); 17 | fileOp readFile(String path); 18 | fileOp base64Decode(String encoded); -------------------------------------------------------------------------------- /src/ScriptKitty/webUI/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 157 | 158 | 159 |
160 |

>_ ScriptKitty

161 | 162 | SCRIPTS 163 | CREATE 164 | 165 |
166 |
167 |
168 |

SELECT PAYLOAD

169 |
170 |
171 |
172 |
173 |

CREATE PAYLOAD

174 |
175 | 176 | 177 | 178 |
179 |
180 |

DELETE PAYLOAD?

181 |

Are you sure you want to delete the payload?

182 | 183 | 184 |
185 |
186 |

EDIT PAYLOAD

187 |

188 | 189 |
190 |
191 | 192 | 193 |
194 | 195 |
196 |
197 | 202 | 203 | 204 | 435 | 436 | 437 | -------------------------------------------------------------------------------- /src/arduino-cli-mac.yaml: -------------------------------------------------------------------------------- 1 | board_manager: 2 | additional_urls: ["https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json"] 3 | daemon: 4 | port: "50051" 5 | directories: 6 | data: .arduino15 7 | downloads: .arduino15/staging 8 | user: /root/Arduino 9 | library: 10 | enable_unsafe_install: true 11 | logging: 12 | file: "" 13 | format: text 14 | level: info 15 | metrics: 16 | addr: :9090 17 | enabled: true 18 | output: 19 | no_color: false 20 | sketch: 21 | always_export_binaries: false 22 | updater: 23 | enable_notification: true 24 | 25 | -------------------------------------------------------------------------------- /src/arduino-cli.yaml: -------------------------------------------------------------------------------- 1 | board_manager: 2 | # additional_urls: ["https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json"] 3 | additional_urls: ["https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json"] 4 | daemon: 5 | port: "50051" 6 | directories: 7 | data: /root/.arduino15 8 | downloads: /root/.arduino15/staging 9 | user: /root/Arduino 10 | library: 11 | enable_unsafe_install: true 12 | logging: 13 | file: "" 14 | format: text 15 | level: info 16 | metrics: 17 | addr: :9090 18 | enabled: true 19 | output: 20 | no_color: false 21 | sketch: 22 | always_export_binaries: false 23 | updater: 24 | enable_notification: true 25 | 26 | -------------------------------------------------------------------------------- /src/fatfs/alt.img: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevKitty-io/ScriptKitty-Firmware/5084fc5c357f9826fed0f1cd534839a1741faec3/src/fatfs/alt.img -------------------------------------------------------------------------------- /src/fatfs/default.img: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevKitty-io/ScriptKitty-Firmware/5084fc5c357f9826fed0f1cd534839a1741faec3/src/fatfs/default.img -------------------------------------------------------------------------------- /src/makefile: -------------------------------------------------------------------------------- 1 | PORT ?= /dev/ttyACM0 2 | RESET_SCRIPTS_DURING_FLASH ?= false 3 | IMAGE_NAME = scriptkitty-fw 4 | CONTAINER_NAME := $(IMAGE_NAME)-$(shell date +%s) 5 | ARDUINO_CLI_VERSION = 0.22.0 6 | 7 | submodules: 8 | git submodule init 9 | # git submodule update 10 | 11 | build: submodules 12 | docker build . --file Dockerfile --build-arg ARDUINO_CLI_VERSION=$(ARDUINO_CLI_VERSION) --tag scriptkitty-fw 13 | 14 | flash: check-port build 15 | docker create --name $(CONTAINER_NAME) --device=$(PORT) -t scriptkitty-fw:latest 16 | docker start $(CONTAINER_NAME) 17 | docker exec $(CONTAINER_NAME) bash -c \ 18 | './arduino-cli upload -b esp32:esp32:esp32s2 --port $(PORT) ScriptKitty/ && sleep 2' 19 | ifeq ($(RESET_SCRIPTS_DURING_FLASH), true) 20 | docker exec $(CONTAINER_NAME) bash -c \ 21 | 'python3 -m esptool --after no_reset write_flash 0x110000 default.img' 22 | endif 23 | docker rm --force $(CONTAINER_NAME) 24 | 25 | generate_bin: build 26 | docker create --name $(CONTAINER_NAME) -t scriptkitty-fw:latest 27 | docker start $(CONTAINER_NAME) 28 | docker cp $(CONTAINER_NAME):/app/build . 29 | docker rm --force $(CONTAINER_NAME) 30 | cp scriptkitty_fw_bin_template scriptkitty_fw.bin 31 | dd of=scriptkitty_fw.bin if=build/ScriptKitty-Firmware.ino.bin seek=65536 bs=1 conv=notrunc 32 | dd of=scriptkitty_fw.bin if=fatfs/default.img seek=1114112 bs=1 conv=notrunc count=3080192 33 | 34 | check-port: 35 | @ls $(PORT) || { echo "Device not found at $(PORT)" && exit 1; } 36 | 37 | #------------------------------------------------------------------------------- 38 | # macOS development 39 | 40 | MAC_PORT = /dev/cu.usbmodem01 41 | MAC_ARDUINO_CLI_TAR = arduino-cli_$(ARDUINO_CLI_VERSION)_macOS_64bit.tar.gz 42 | 43 | arduino-cli: scripts/arduino-cli arduino-cli-esp32-install 44 | 45 | arduino-cli-esp32-install: 46 | sudo ./scripts/arduino-cli core install esp32:esp32 --config-file arduino-cli-mac.yaml 47 | 48 | scripts/arduino-cli: 49 | curl -L --output scripts/$(MAC_ARDUINO_CLI_TAR) https://github.com/arduino/arduino-cli/releases/download/$(ARDUINO_CLI_VERSION)/$(MAC_ARDUINO_CLI_TAR) 50 | tar -xf scripts/$(MAC_ARDUINO_CLI_TAR) --directory=scripts 51 | rm scripts/$(MAC_ARDUINO_CLI_TAR) 52 | rm scripts/LICENSE.txt 53 | 54 | check-mac-deps: 55 | docker info 56 | which python3 57 | python3 -E -m esptool version 58 | 59 | check-mac-port: 60 | @ls $(MAC_PORT) || { echo "Device not found at $(MAC_PORT)" && exit 1; } 61 | 62 | mac-build: submodules 63 | sudo docker build . --file Dockerfile --build-arg ARDUINO_CLI_VERSION=$(ARDUINO_CLI_VERSION) --tag scriptkitty-fw 64 | 65 | flash-on-mac: check-mac-port check-mac-deps arduino-cli mac-build 66 | sudo docker create --name $(CONTAINER_NAME) -t scriptkitty-fw:latest 67 | sudo docker cp $(CONTAINER_NAME):/app/build . 68 | sudo docker rm --force $(CONTAINER_NAME) 69 | ifeq ($(RESET_SCRIPTS_DURING_FLASH), true) 70 | python3 -m esptool --after no_reset write_flash 0x110000 fatfs/default.img 71 | endif 72 | { sudo ./scripts/arduino-cli upload -b esp32:esp32:esp32s2 --port $(MAC_PORT) --config-file arduino-cli-mac.yaml --input-dir build; } || echo \ 73 | 'If you get the error: "esptool.py can not exit the download mode over USB..." this is a bug in arduino-cli and can be ignored' 74 | -------------------------------------------------------------------------------- /src/scriptkitty_fw_bin_template: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevKitty-io/ScriptKitty-Firmware/5084fc5c357f9826fed0f1cd534839a1741faec3/src/scriptkitty_fw_bin_template -------------------------------------------------------------------------------- /src/scripts/build_web_ui.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # cd to dir where this script is held so relative paths work 4 | cd "$(dirname "$(readlink -f "$0")")" 5 | 6 | fileToProgmem() { 7 | local file=$1 8 | local varname=$2 9 | 10 | # use xxd to convert file to C header format 11 | # need to manually replace types, add PROGMEM, etc:w 12 | echo "#pragma once" 13 | xxd -i "$file" \ 14 | | sed "s/.*\[\].*/const char $varname\[\] PROGMEM = {/g" \ 15 | | sed -E "s/unsigned int.*( = .*)/const int ${varname}_len\1/g" \ 16 | | sed -E 's/(.*0x..$.*)/\1, 0x00/g' # add null terminator 17 | } 18 | 19 | for file in $(find ../ScriptKitty/webUI -type f); do 20 | [ -e "$file" ] || { echo "invalid file $file" && exit 1; } 21 | fileName=$(basename $file) 22 | fileName="${fileName%%.*}" 23 | outFile="$(dirname ${file})/${fileName}.h" 24 | varname=${fileName^^} 25 | 26 | # TODO: gzip the file first. The below will work but the server needs to add 27 | # the "Content-Encoding: gzip" header 28 | #gzipFile="$file.gz" 29 | #gzip --keep "$file" 30 | #./file_to_progmem.sh "$gzipFile" > "$outFile" 31 | 32 | echo "converting $file. Importable as '$fileName.h', variable '$varname'" 33 | fileToProgmem "$file" "$varname" > "$outFile" 34 | done 35 | -------------------------------------------------------------------------------- /src/third_party/arduino_cli_install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # This script zips and installs third party dependencies. It is untested 4 | # outside of the docker container, use at your own risk. 5 | 6 | 7 | # Make sure to run from the third_party directory 8 | cd "$(dirname "${BASH_SOURCE[0]}")" 9 | 10 | # provide the full path to the arduino-cli executable 11 | arduino_cli=$1 12 | 13 | dirs=$(find . -maxdepth 1 -mindepth 1 -type d) 14 | while read dirToZip; do 15 | zipfile="$dirToZip".zip 16 | zip -r "$zipfile" "$dirToZip" 17 | "$arduino_cli" lib install --zip-path "$zipfile" 18 | done <<< "$dirs" 19 | -------------------------------------------------------------------------------- /v1.0-ScriptKitty-231225.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevKitty-io/ScriptKitty-Firmware/5084fc5c357f9826fed0f1cd534839a1741faec3/v1.0-ScriptKitty-231225.bin --------------------------------------------------------------------------------