├── .github └── workflows │ ├── deploy.yml │ └── test-deploy.yml ├── .gitignore ├── .nojekyll ├── LICENSE ├── README.md ├── babel.config.js ├── docs ├── 3d.md ├── battery-life.md ├── create-watchface.md ├── examples.md ├── faqs.md ├── getting-started.md ├── hardware.md ├── legacy.md ├── libraries.md └── license.md ├── docusaurus.config.js ├── package-lock.json ├── package.json ├── sidebars.js ├── src ├── css │ └── custom.css └── pages │ ├── contest │ ├── contest.module.css │ └── index.js │ ├── gallery │ ├── Post.js │ ├── PostsList.js │ ├── gallery.module.css │ ├── index.js │ └── instagramPosts.json │ ├── index.js │ ├── styles.module.css │ ├── watchcases │ ├── WatchCase.js │ ├── WatchCaseSTL.js │ ├── index.js │ └── watchcase.module.css │ └── watchfaces │ ├── WatchFace.js │ ├── WatchFaceList.js │ ├── index.js │ ├── watchface.module.css │ └── watchfaces.json ├── static ├── .nojekyll ├── CNAME ├── img │ ├── OSHWA-Certification.svg │ ├── Watchy_STEP_Render.png │ ├── case_assem │ │ ├── watchy_case_assem_1.jpg │ │ ├── watchy_case_assem_2.jpg │ │ ├── watchy_case_assem_3.jpg │ │ ├── watchy_case_assem_4.jpg │ │ ├── watchy_case_assem_5.jpg │ │ └── watchy_case_assem_6.jpg │ ├── epaper.gif │ ├── esp32.jpg │ ├── favicon.ico │ ├── logo.svg │ ├── opensource-label.svg │ ├── oshw-logo.svg │ ├── sqfmi_logo_32x32.svg │ ├── undraw_docusaurus_mountain.svg │ ├── undraw_docusaurus_react.svg │ ├── undraw_docusaurus_tree.svg │ ├── watchfaces │ │ ├── 10_Calculateur.png │ │ ├── 11_Jarvis.gif │ │ ├── 12_BadForEye.png │ │ ├── 13_Maze.png │ │ ├── 14_BTTF.png │ │ ├── 15_Binary.png │ │ ├── 16_Stationary_Text.png │ │ ├── 17_Steps.png │ │ ├── 18_TypoStyle.png │ │ ├── 19_Analog.png │ │ ├── 1_Basic.png │ │ ├── 20_Analog.png │ │ ├── 21_Hobbit_Time.png │ │ ├── 22_BCD.png │ │ ├── 23_Line.gif │ │ ├── 24_Mickey.png │ │ ├── 25_LCARS.png │ │ ├── 26_BigTime.png │ │ ├── 27_Poe.png │ │ ├── 28_Kitty.png │ │ ├── 2_7_SEG.png │ │ ├── 2_7_SEG_Light.png │ │ ├── 30_dkTime.gif │ │ ├── 3_DOS.png │ │ ├── 4_Pokemon.png │ │ ├── 5_StarryHorizon.png │ │ ├── 6_Tetris.png │ │ ├── 7_MacPaint.png │ │ ├── 8_Bahn.png │ │ └── 9_Redub.png │ ├── watchy-watchface.png │ ├── watchy_assembly_steps.png │ ├── watchy_buttons_map.png │ ├── watchy_case_contest_collage_IG.png │ ├── watchy_case_gameboy_01.jpg │ ├── watchy_contest_first_flippedchamfer.png │ ├── watchy_contest_second_slim.png │ ├── watchy_contest_third_peechy.png │ ├── watchy_frame.png │ ├── watchy_kit_instructions.png │ ├── watchy_peechy_case_collage.png │ ├── watchy_render.png │ ├── watchy_schematic_light.svg │ ├── watchy_screen_align.png │ ├── watchy_social_card.png │ └── watchy_watchface_weather.gif ├── interactive_bom │ └── watchy_interactive_bom.html └── pdf │ ├── BST-BMA423-DS000-1509600.pdf │ └── watchy_schematic.pdf └── yarn.lock /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Deploy to GitHub Pages 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | # Review gh actions docs if you want to further define triggers, paths, etc 8 | # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#on 9 | 10 | jobs: 11 | build: 12 | name: Build Docusaurus 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v4 16 | with: 17 | fetch-depth: 0 18 | - uses: actions/setup-node@v4 19 | with: 20 | node-version: 18 21 | cache: yarn 22 | 23 | - name: Install dependencies 24 | run: yarn install --frozen-lockfile 25 | - name: Build website 26 | run: yarn build 27 | 28 | - name: Upload Build Artifact 29 | uses: actions/upload-pages-artifact@v3 30 | with: 31 | path: build 32 | 33 | deploy: 34 | name: Deploy to GitHub Pages 35 | needs: build 36 | 37 | # Grant GITHUB_TOKEN the permissions required to make a Pages deployment 38 | permissions: 39 | pages: write # to deploy to Pages 40 | id-token: write # to verify the deployment originates from an appropriate source 41 | 42 | # Deploy to the github-pages environment 43 | environment: 44 | name: github-pages 45 | url: ${{ steps.deployment.outputs.page_url }} 46 | 47 | runs-on: ubuntu-latest 48 | steps: 49 | - name: Deploy to GitHub Pages 50 | id: deployment 51 | uses: actions/deploy-pages@v4 52 | -------------------------------------------------------------------------------- /.github/workflows/test-deploy.yml: -------------------------------------------------------------------------------- 1 | name: Test deployment 2 | 3 | on: 4 | pull_request: 5 | branches: 6 | - main 7 | # Review gh actions docs if you want to further define triggers, paths, etc 8 | # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#on 9 | 10 | jobs: 11 | test-deploy: 12 | name: Test deployment 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v3 16 | - uses: actions/setup-node@v3 17 | with: 18 | node-version: 18 19 | cache: yarn 20 | 21 | - name: Install dependencies 22 | run: yarn install --frozen-lockfile 23 | - name: Test build website 24 | run: yarn build -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Dependencies 2 | /node_modules 3 | 4 | # Production 5 | /build 6 | 7 | # Generated files 8 | .docusaurus 9 | .cache-loader 10 | 11 | # Misc 12 | .DS_Store 13 | .env.local 14 | .env.development.local 15 | .env.test.local 16 | .env.production.local 17 | 18 | npm-debug.log* 19 | yarn-debug.log* 20 | yarn-error.log* 21 | -------------------------------------------------------------------------------- /.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/.nojekyll -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 SQFMI 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 | # Website 2 | 3 | This website is built using [Docusaurus 2](https://v2.docusaurus.io/), a modern static website generator. 4 | 5 | ## Installation 6 | 7 | ```console 8 | yarn install 9 | ``` 10 | 11 | ## Local Development 12 | 13 | ```console 14 | yarn start 15 | ``` 16 | 17 | This command starts a local development server and open up a browser window. Most changes are reflected live without having to restart the server. 18 | 19 | ## Build 20 | 21 | ```console 22 | yarn build 23 | ``` 24 | 25 | This command generates static content into the `build` directory and can be served using any static contents hosting service. 26 | 27 | ## Deployment 28 | 29 | ```console 30 | GIT_USER= USE_SSH=true yarn deploy 31 | ``` 32 | 33 | If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. 34 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [require.resolve('@docusaurus/core/lib/babel/preset')], 3 | }; 4 | -------------------------------------------------------------------------------- /docs/3d.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: 3DModels 3 | title: 3D Models 4 | sidebar_label: 3D Models 5 | slug: /3D 6 | --- 7 | 8 | ![Watchy STEP Render](../static/img/Watchy_STEP_Render.png) 9 | 10 | [Download Watchy STEP Model](https://github.com/sqfmi/watchy-hardware/raw/main/3D/Watchy.step) 11 | 12 | [Download Watchy STL Model](https://github.com/sqfmi/watchy-hardware/raw/main/3D/Watchy.stl) 13 | 14 | [Download Watchy with Battery STEP Model](https://github.com/sqfmi/watchy-hardware/raw/main/3D/Watchy_Battery.step) 15 | 16 | [Download Watchy with Battery STL Model](https://github.com/sqfmi/watchy-hardware/raw/main/3D/Watchy_Battery.stl) 17 | 18 | -------------------------------------------------------------------------------- /docs/battery-life.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: battery-life 3 | title: Battery Life 4 | sidebar_label: Battery Life 5 | slug: /battery-life 6 | --- 7 | 8 | Watchy wakes up every 60 seconds to check the accelerometer, real-time clock, and updates the E-Paper display with the latest information. Certain watch faces also turn on WiFi to fetch weather data. 9 | 10 | With only time keeping, Watchy should have a battery life of 5-7 days, while with fetching data over WiFi, it should last between 2-3 days. These numbers can be extended through further optimizations (e.g. sleep during off hours, waking up only on motion/tilt, etc.). 11 | 12 | ## Tips 13 | 14 | - Put Watchy to deep sleep if it's not doing anything, the ESP32 is powerful and power hungry, leaving it idling will drain the battery and create unwanted heat. This is already done for you in the ```init()``` method, so there is no need to explicitly call it again unless you are doing something outside of the Watchy class. 15 | ```cpp 16 | void Watchy::deepSleep(){ 17 | esp_sleep_enable_ext0_wakeup(RTC_PIN, 0); //enable deep sleep wake on RTC interrupt 18 | esp_sleep_enable_ext1_wakeup(BTN_PIN_MASK, ESP_EXT1_WAKEUP_ANY_HIGH); //enable deep sleep wake on button press 19 | esp_deep_sleep_start(); 20 | } 21 | ``` 22 | - Turn off the radio after using WiFi/Bluetooth for communications. This will maximize Watchy's battery life. 23 | ```cpp 24 | //turn off radios 25 | WiFi.mode(WIFI_OFF); 26 | btStop(); 27 | ``` 28 | - Put the display to sleep after updating: ```display.hibernate()```. This is already done for you, so there is no need to explicitly call it again unless you are doing something outside of the Watchy class. 29 | - If your watch face does not require a step counter, you can skip initializing and reading from the BMA423 accelerometer. 30 | - If your watch face does not require 60 second updates (e.g. word clock), you can change the RTC alarm trigger to a longer period -------------------------------------------------------------------------------- /docs/create-watchface.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: create-watchface 3 | title: Create Your Own Watch Face 4 | sidebar_label: Create Your Own Watch Face 5 | slug: /create-watchface 6 | --- 7 | 8 | The Watchy library makes it easy to create your own custom watch face, we've provided a few examples that all use the same template. 9 | 10 | ## Basics 11 | 12 | To create a basic watch face, you need to simply override the ```drawWatchFace()``` method with your custom code, for example: 13 | 14 | ```cpp title="myFirstWatchFace.ino" 15 | #include //include the Watchy library 16 | #include //include any fonts you want to use 17 | #include "settings.h" //same file as the one from 7_SEG example 18 | 19 | class MyFirstWatchFace : public Watchy{ //inherit and extend Watchy class 20 | public: 21 | MyFirstWatchFace(const watchySettings& s) : Watchy(s) {} 22 | void drawWatchFace(){ //override this method to customize how the watch face looks 23 | display.setFont(&FreeMonoOblique24pt7b); 24 | display.setCursor(25, 110); 25 | if(currentTime.Hour < 10){ //use the currentTime struct to print latest time 26 | display.print("0"); 27 | } 28 | display.print(currentTime.Hour); 29 | display.print(":"); 30 | if(currentTime.Minute < 10){ 31 | display.print("0"); 32 | } 33 | display.println(currentTime.Minute); 34 | } 35 | }; 36 | 37 | MyFirstWatchFace m(settings); //instantiate your watchface 38 | 39 | void setup() { 40 | m.init(); //call init in setup 41 | } 42 | 43 | void loop() { 44 | // this should never run, Watchy deep sleeps after init(); 45 | } 46 | ``` 47 | 48 | ### Displaying Images/Icons 49 | 50 | Since the E-Paper display is black and white only, you will need to convert any images/icons you wish to display into black and white first. 51 | The image then needs to be converted into a byte array, and stored in Watchy's flash. 52 | 53 | #### Convert image to byte array (image2cpp) 54 | 55 | You can convert your images to byte arrays using the web tool [**image2cpp**](http://javl.github.io/image2cpp/) 56 | 57 | 1. Upload your image and play around with the settings. If your image is already in black and white then you can just leave the brightness threshold to default, otherwise if it's in color, you can play with that setting to get the image to look right under preview. 58 | 59 | 2. In the **Code Output format** option, select *Arduino code*, give it a name under *identifier* and click **Generate code**. Copy the contents in the textarea and paste it in a ```*.h``` file in the same directory as your Arduino sketch. 60 | 61 | 3. In your watch face file e.g. ```myFirstWatchFace.ino```, include that header file e.g. ```#include "myImage.h"``` 62 | 63 | 4. Use ```display.drawBitmap(x_origin, y_origin, imageByteArrayName, width, height, color)``` in the ```drawWatchFace()``` method to display your image. The order of these draw/print statements matter, so if you call ```display.drawBitmap()``` first, followed by ```display.println("Hello World!")```, the text will be on top of the image. 64 | 65 | ### Using Fonts 66 | 67 | You can use custom fonts by converting them first with the tool [**truetype2gfx**](https://rop.nl/truetype2gfx/) 68 | 69 | 1. Upload your font of choice and set the font size. Click **Get GFX font file** to download the font file e.g. ```Seven_Segment10pt7b.h```. 70 | 71 | 2. In your watch face file e.g. ```myFirstWatchFace.ino```, include that header file e.g. ```#include "Seven_Segment10pt7b.h"``` 72 | 73 | 3. Use ```display.setFont(&Seven_Segment10pt7b)``` to set the current font face (don't forget the ampersand before the font name). You will have to call the ```display.setFont()``` method each time you wish to use another font. Use ```display.setCursor(x, y)``` to set where to start printing text, the coordinates refer to the *lower left corner* of the text to be printed. 74 | 75 | ### Quickly Testing Changes 76 | 77 | As you develop more complicated watch faces, the repeated process of making a change, compiling it, and uploading it to your Watchy can be cumbersome. It is also challenging to double-check that your watch face can handle all possible conditions (such as weather conditions and step counts) when all your physical Watchy has is real life to report on! 78 | 79 | 80 | 81 | For these reasons, the community has developed _WatchySim_ - a simulator for Watchy. WatchySim gives you a Watchy-like SDK to develop your watch faces, but lets you test them in a standard Windows GDI-based application. 82 | 83 | If you are interested in exploring that approach, check out [WatchySim on GitHub](https://github.com/LeeHolmes/watchysim). 84 | 85 | 86 | ### Share Your Watch Face! 87 | 88 | We'd love to see what you've created! Share your watch face with us and we'll post it on our gallery: 89 | 90 | 1. Take a screenshot of your watch face! Follow the instructions [here](https://github.com/sqfmi/Watchy/wiki/Screenshots-of-Watchfaces) 91 | 2. Make sure you have a GitHub repo with the source code, and a 200x200 screenshot of the watch face (must be a black and white \*.bmp or \*.gif) 92 | 3. Add your watch face to the bottom of this [`json file`](https://github.com/sqfmi/watchy-docs/blob/main/src/pages/watchfaces/watchfaces.json) like so: 93 | ```json 94 | { 95 | "id" : "ID_NUMBER", 96 | "name" : "WATCH_FACE_NAME", 97 | "author" : "AUTHOR", 98 | "screenshot" : "SCREENSHOT_URL", 99 | "source" : "GITHUB_URL", 100 | "ota_bin" : false, 101 | "version" : "VERSION_NUMBER" 102 | } 103 | ``` 104 | 4. You may want to check for other PRs so your ID number is the latest 105 | 5. Submit the PR for review and merge 106 | -------------------------------------------------------------------------------- /docs/examples.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: examples 3 | title: Examples 4 | --- 5 | 6 | ### Display Random Artwork on Watchy 7 | 8 | Check out this example by @wolfdtx https://github.com/wolfdtx/RandPics 9 | -------------------------------------------------------------------------------- /docs/faqs.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: faqs 3 | title: Frequently Asked Questions 4 | --- 5 | 6 | ### Is the screen E-Ink/E-Paper/LCD/CRT? 7 | 8 | E-Ink/E-Paper is the same technology used in devices like the Kindle. E-Ink is a **brand** of electronic paper (E-Paper) displays. Devices like the Pebble use a low power LCD, which **is not** E-Ink or E-Paper. 9 | 10 | **Watchy is E-Paper** 11 | 12 | ![How E-Paper Works](../static/img/epaper.gif) 13 | 14 | ### Which side is the front/back of the E-Ink display? 15 | 16 | The front is the side that's whitish gray, with a white bezel at the bottom. The back is metallic and mirror-like. 17 | 18 | ### I need to realign/remove the screen, help! 19 | - **Do Not Pry Off the Screen!** It is made of glass and prying it off the strong adhesive will crack it 20 | - **Do Not Use A Heatgun To Melt The Adhesive!** Temperatures over 60C will damage the screen 21 | - Check out this video on how to remove the screen using floss https://youtu.be/OjCd0NY1Yx0 22 | 23 | ### The case doesn't fit/close, how do I assemble it? 24 | 25 | 1. Make sure the battery cable is neatly tucked into the slot 26 | ![Step 1. Make sure the battery cable is neatly tucked into the slot](../static/img/case_assem/watchy_case_assem_1.jpg) 27 | 28 | 2. Insert PCB and buttons into the bottom case. Make sure everything sits flush and nothing is popping out. 29 | ![Insert PCB and buttons into the bottom case. Make sure everything sits flush and nothing is popping out. Left](../static/img/case_assem/watchy_case_assem_2.jpg) 30 | ![Insert PCB and buttons into the bottom case. Make sure everything sits flush and nothing is popping out. Right](../static/img/case_assem/watchy_case_assem_3.jpg) 31 | ![Insert PCB and buttons into the bottom case. Make sure everything sits flush and nothing is popping out. Top](../static/img/case_assem/watchy_case_assem_4.jpg) 32 | 33 | 3. Put on the top case by first hooking the upper snap 34 | ![Put on the top case by first hooking the upper snap](../static/img/case_assem/watchy_case_assem_5.jpg) 35 | 36 | 4. Close down the case with minimal force, there should be a satisfying "click" 37 | ![Close down the case with minimal force, there should be a satisfying "click"](../static/img/case_assem/watchy_case_assem_6.jpg) 38 | 39 | 5. If the case is a bit loose and doesn't stay closed, put a small piece of tape inside the top snap. 40 | 41 | ### The Watchy PCB doesn't fit in my plastic/aluminum case 42 | 43 | 1. Check for burrs on the sides of the PCB, there may be two on each side, where the boards are cut apart during manufacturing. You can file down these protruding areas. 44 | 2. Check that the vibration motor is not sticking out, it should be sitting entirely on the PCB. You can lift it up lightly and stick it back on. 45 | 46 | ### How do I add a new watch face? What's the difference between watch face and firmware? 47 | 48 | Currently, the watch face is the entire firmware. To change the watch face, you need to upload the watch face's firmware to your Watchy using either the Arduino IDE, or esptool.py 49 | 50 | To build one of the example faces, start here: [Arduino Setup](/docs/getting-started#arduino-setup) 51 | 52 | For information on making your own face, go here: [Create Your Own Watch Face](/docs/create-watchface) 53 | 54 | ### How do I change the weather to show Fahrenheit instead of Celsius? 55 | 56 | Check out https://github.com/tapecanvas/WatchyDefaultFahrenheit 57 | 58 | ### I'm getting a ```Failed to execute script esptool``` error 59 | 60 | This is a known issue for macOS 11 "Big Sur", see https://github.com/espressif/arduino-esp32/issues/4408 for solutions 61 | 62 | ### When compiling a watch face, I get a warning: 63 | - **WARNING: library DS3232RTC claims to run on avr architecture(s) and may be incompatible with your current board which runs on esp32 architecture(s)** 64 | - You can safely ignore this warning. 65 | 66 | ### Why does my display appear "static-y" or ghosting? 67 | 68 | - **Make sure you are using the latest version of the GxEDP2 library (i.e. > 1.2.16)** , there is a fix for the GDEH0154D67 display driver 69 | - Ensure the FPC cable is fully inserted, and the lock is in place 70 | 71 | ### How do I apply the screen protector? 72 | 73 | 1. Make sure the screen is clean and free of dust and oils after peeling off the green tab film 74 | 2. Peel off the back film on the screen protector before attaching it to the screen. It may be easier to align it with the case assembled 75 | 3. The screen protector can be removed and re-applied if necessary. Simply peel it off and clean it with dish soap and let to dry 76 | 4. A drop of rubbing alcohol on the screen before applying the protector may also help squeeze out the bubbles 77 | 78 | ### I made a watch face and I want to share it on the gallery! 79 | 80 | Check out these instructions [here](/docs/create-watchface#share-your-watch-face) 81 | 82 | ### I have another issue, could you help me out? 83 | 84 | - Open an issue on our [Github](https://github.com/sqfmi/Watchy/issues), provide additional details on your setup (e.g. OS, Arduino Version, etc.) and photos of your Watchy 85 | - Ping us on [Discord](https://discord.gg/ZXDegGV8E7)! 86 | 87 | ### I need a replacement screen/strap/case, where can I get one? 88 | 89 | You may purchase replacement parts and accessories at https://shop.sqfmi.com 90 | 91 | For screens, you may also get them on https://www.aliexpress.com/item/3256803841306234.html 92 | 93 | ### Which board revision is my Watchy? 94 | 95 | - Select **About Watchy** in the menu to see the revision number 96 | -------------------------------------------------------------------------------- /docs/getting-started.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: getting-started 3 | title: Getting Started 4 | sidebar_label: Getting Started 5 | slug: /getting-started 6 | --- 7 | 8 | ## Watchy Kit w/ Case Assembly 9 | ![Watchy Kit with Case](../static/img/watchy_kit_instructions.png) 10 | 11 | **Before You Begin** make sure you review the instructions and inspect for any missing or damaged components. 12 | 13 | **Remove The Components Carefully** as they are tightly packed for maximum protection. The display is made of glass and will crack if you bend it! 14 | 15 | **Insert & Remove The Battery Carefully** to avoid damaging PCB components 16 | 17 | **Test Your PCB** to make sure the board is functional! 18 | 19 | **Do Not Apply The Included Tape!!** Watchy can be assembled and secured with the included enclosure, without needing any tape. Only apply the tape if you intend to use Watchy without the enclosure, and have triple checked the screen is properly aligned. 20 | 21 | 1. Connect the screen to the FPC connector: the ribbon cable goes through the PCB slot, as in the image above; the shiny gold pins on the ribbon cable must face up; pull the black tabs out slightly before inserting the cable, then push the tabs back in after to secure cable. 22 | 2. Connect the battery 23 | 3. Connect the USB to start charging the battery 24 | 4. Press [SW1](/docs/hardware#bill-of-materials) to bring up the **menu**/**confirm** 25 | 5. Press [SW3](/docs/hardware#bill-of-materials) & [SW4](/docs/hardware#bill-of-materials) to navigate **up**/**down** 26 | 6. Press [SW2](/docs/hardware#bill-of-materials) to **exit/cancel** 27 | 28 | ![Watchy Buttons](../static/img/watchy_buttons_map.png) 29 | 30 | 7. Wait 1 minute to check and see if the clock is updating the time correctly 31 | 32 | **Assembly Video:** [https://www.youtube.com/watch?v=ftLTrr_HTpI](https://www.youtube.com/watch?v=ftLTrr_HTpI) 33 | 34 | **Assembly Video (CNC Aluminum Case):** [https://www.youtube.com/watch?v=rbVr9eVb72M](https://www.youtube.com/watch?v=rbVr9eVb72M) 35 | 36 | **Tips** 37 | 38 | - **Make sure the screen is perfectly aligned before taping it down!** It should not extend above or below the strap holes on the PCB. 39 | 40 | ![Watchy Screen Alignment](../static/img/watchy_screen_align.png) 41 | 42 | - **Make sure the battery cable is tucked in** when assemblign the case. Everything should fit snug and be aligned to the bottom case, before securing the top case. 43 | - **Do NOT force the case to close. It could break the screen & buttons!** The case should close easily with the top and bottom snaps latching. 44 | - **Do NOT overtighten the screws in the aluminum case** Overtightening will crack the screen! Make sure everything fits nicely and slowly adjust the screws to secure the case. 45 | - **Still having trouble?** Check out this step-by-step guide on assembling the case in our [FAQ](/docs/faqs#the-case-doesnt-fitclose-how-do-i-assemble-it) 46 | 47 | ## Arduino Setup 48 | 49 | Watchy comes pre-loaded with firmware that demonstrates all the basic features. You can also try different watch faces and examples in Arduino. 50 | 51 | 1. Download and install the latest [Arduino IDE](https://www.arduino.cc/en/software) 52 | 2. Start Arduino and open File > Preferences. 53 | 3. Under *Additional Board Manager URLs* add: 54 | 55 | ``` 56 | https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json 57 | ``` 58 | 4. Open Tools > Board > **Boards Manager** and install **v2.0.18** of **esp32** platform. *Note: there are compatibility issues with v3.x.x of esp32. 'Arduino ESP32 Boards' is something different - look for 'esp32'* 59 | 5. Under Sketch > Include Library > Manage Libraries, search for **Watchy** and install the latest version 60 | 6. Make sure all the dependencies are installed i.e. **GxEPD2** , **WiFiManager**, **rtc_pcf8563**,**etc.** 61 | 62 | ### Enter Bootloader Mode 63 | 1. To upload new firmware/watchfaces to Watchy, you will need to enter **bootloader** mode 64 | 2. Plug in the USB on Watchy 65 | 3. Press and hold the top 2 buttons (Back & Up) for more than 4 seconds, then release the **Back button first**, before releasing the Up button 66 | 4. You should now see an ESP32S3 device enumerate a serial port i.e. COM, cu.* 67 | 68 | ### Uploading New Watchfaces/Firmware 69 | 70 | 1. Select the serial port for your Watchy 71 | 2. If you can't find the serial port, repeat steps above for entering bootloader mode. Also make sure you're using a USB data cable and not a charge-only cable. Try different USB ports as well. 72 | 3. Select Tools > Board > ESP32 Arduino > **ESP32S3 Dev Module** 73 | 4. Select Tools > Flash Size > **8MB (64Mb)** 74 | 5. Select Tools > Partition Scheme > **8M with spiffs...** 75 | 6. Leave everything else as default 76 | 7. Choose an example and click upload 77 | 8. After upload is complete, reset Watchy to run the new uploaded firmware 78 | 79 | ### How to reset Watchy 80 | 1. Press and hold the top 2 buttons (Back & Up) for more than 4 seconds, then release the **Up button first**, before releasing the Back button 81 | 2. Watchy should now reset, wait a few seconds for it to boot up and refresh the screen 82 | 83 | ### Wifi Setup 84 | 85 | 1. Click 'Setup Wifi' from main menu on the watch. 86 | 2. Connect to 'Watchy Ap' wifi from another device such as phone or computer / laptop. 87 | 3. Open 192.168.4.1 in the browser. (Note: on iphone this page will open automatically.) 88 | 4. Click 'Configure WiFi' 89 | 5. Enter SSID and password. (Note: SSID can be prefilled from the list of networks at the top of this screen) 90 | 6. Hit 'Save' button and wait for Watchy. 91 | 7. If connection fails, the watchy will display 'Setup failed & timed out!', otherwise it will display the local ip address and SSID of the connected network with confirmation. 92 | 93 | #### Troubleshoot Wifi Setup: 94 | 1. Click 'Info' from 192.168.4.1 page. 95 | 2. Check your router setting to make sure the listed mac address is allowed. 96 | 3. If there is still a problem, try clicking 'Erase Wifi Config' from the 'Info' page and wait for Watchy to restart itself. Then try the wifi setup again and it should hopefully work. 97 | 98 | --- 99 | -------------------------------------------------------------------------------- /docs/hardware.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: hardware 3 | title: Hardware 4 | sidebar_label: Hardware 5 | slug: /hardware 6 | --- 7 | 8 | ## Schematic 9 | 10 | ![Watchy Schematic](../static/img/watchy_schematic_light.svg) 11 | [v3.0](https://github.com/sqfmi/watchy-hardware/blob/v3.0/WatchySchematic.pdf) 12 | [v2.0](https://github.com/sqfmi/watchy-hardware/blob/v2.0/WatchySchematic.pdf) 13 | [v1.5](https://github.com/sqfmi/watchy-hardware/blob/v1.5/WatchySchematic.pdf) 14 | [v1.0](https://github.com/sqfmi/watchy-hardware/blob/v1.0/WatchySchematic.pdf) 15 | 16 | --- 17 | 18 | ## Revisions 19 | 20 | | Revision | 3.0 | 2.0 | 1.5 | 1.0 | 21 | |------------------|---------------------|---------------|---------------|---------------| 22 | | Release Date | June 2024 | Dec 2021 | Jun 2021 | Nov 2019 | 23 | | SoC | ESP32-S3FN8 | ESP32-PICO-D4 | ESP32-PICO-D4 | ESP32-PICO-D4 | 24 | | RTC | EXT 32KHz Crystal | PCF8536 | PCF8536 | DS3231 | 25 | | USB-Serial | Built-in CDC/JTAG | CP2102 | CP2104 | CP2104 | 26 | | USB Device | CDC, HID, MIDI, MSC | Not Supported | Not Supported | Not Supported | 27 | | Charge Indicator | GPIO10 | LED | LED | LED | 28 | | Bootload/Reset | Buttons | DTR/RTS | DTR/RTS | DTR/RTS | 29 | 30 | --- 31 | 32 | ## Pin Map 33 | 34 | [Pin Mapping in Watchy Library](https://github.com/sqfmi/Watchy/blob/master/src/config.h) 35 | 36 | --- 37 | 38 | ## Datasheets 39 | 40 | * Microcontroller (v3) [ESP32-S3](https://www.espressif.com/sites/default/files/documentation/esp32-s3_datasheet_en.pdf) 41 | * Microcontroller [ESP32-PICO-D4](https://www.espressif.com/sites/default/files/documentation/esp32-pico-d4_datasheet_en.pdf) 42 | * USB-Serial [CP2104](https://www.silabs.com/documents/public/data-sheets/cp2104.pdf) 43 | * E-Paper Display (v3) [GDEY0154D67](https://www.good-display.com/companyfile/620.html) 44 | * E-Paper Display [GDEH0154D67](https://www.e-paper-display.com/products_detail/productId=455.html) 45 | * Display Connector [AFC07-S24ECC-00](https://datasheet.lcsc.com/szlcsc/1811021340_JUSHUO-AFC07-S24ECC-00_C11092.pdf) 46 | * 3-Axis Accelerometer [BMA423](../static/pdf/BST-BMA423-DS000-1509600.pdf) 47 | * Real Time Clock v1.0 [DS3231](https://datasheets.maximintegrated.com/en/ds/DS3231.pdf) 48 | * Real Time Clock v1.5/2.0 [PCF8563](https://www.mouser.com/datasheet/2/302/PCF8563-1127619.pdf) 49 | * Battery [LiPo Battery 3.7V 200mAh 402030](https://www.powerstream.com/lip/GMB042030.pdf) 50 | * LDO Voltage Regulator [ME6211C33M5G-N](https://datasheet.lcsc.com/szlcsc/Nanjing-Micro-One-Elec-ME6211C33M5G-N_C82942.pdf) 51 | * Battery Connector [BOOMELE 1.25T-2PWT](https://datasheet.lcsc.com/szlcsc/1811092210_BOOMELE-Boom-Precision-Elec-1-25T-2PWT_C22074.pdf) 52 | * Micro USB Connector [U-F-M5DD-Y-L](https://datasheet.lcsc.com/szlcsc/1811131825_Korean-Hroparts-Elec-U-F-M5DD-Y-L_C91146.pdf) 53 | * Tactile Buttons [K2-1114SA-A4SW-06](https://datasheet.lcsc.com/szlcsc/1810061013_Korean-Hroparts-Elec-K2-1114SA-A4SW-06_C136662.pdf) 54 | * Vibration Motor [1020](https://github.com/SeeedDocument/Bazaar_doc/raw/master/316040001/1020_datasheet.doc) 55 | * PCB Antenna [SWRA117D](https://www.ti.com/lit/an/swra117d/swra117d.pdf) 56 | 57 | --- 58 | 59 | ## Interactive BOM (v1) 60 | 61 | 62 | 63 | 64 | [Open Interactive BOM in new tab](https://watchy.sqfmi.com/interactive_bom/watchy_interactive_bom.html) 65 | 66 | [Download BOM CSV](https://github.com/sqfmi/watchy-hardware/blob/main/WatchyBOM.csv) 67 | > Created Using **[InteractiveHtmlBom](https://github.com/openscopeproject/InteractiveHtmlBom)** 68 | 69 | --- 70 | 71 | ## KiCAD Design Files & GERBER 72 | 73 | * [GitHub](https://github.com/sqfmi/watchy-hardware) 74 | 75 | --- 76 | 77 | ## Dimensions 78 | 79 | * Length: 46.0MM 80 | * Width: 35.5MM 81 | * Height: 9.5MM 82 | * Weight: 13g 83 | 84 | -------------------------------------------------------------------------------- /docs/legacy.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: legacy 3 | title: Getting Started (for v1, v1.5, v2) 4 | sidebar_label: Legacy 5 | slug: /legacy 6 | --- 7 | 8 | ## Watchy Kit w/ Case Assembly 9 | ![Watchy Kit with Case](../static/img/watchy_kit_instructions.png) 10 | 11 | **Before You Begin** make sure you review the instructions and inspect for any missing or damaged components. 12 | 13 | **Remove The Components Carefully** as they are tightly packed for maximum protection. The display is made of glass and will crack if you bend it! 14 | 15 | **Test Your PCB** to make sure the board is functional! 16 | 17 | **Do Not Apply The Included Tape!!** Watchy can be assembled and secured with the included enclosure, without needing any tape. Only apply the tape if you intend to use Watchy without the enclosure, and have triple checked the screen is properly aligned. 18 | 19 | 1. Connect the screen to the FPC connector, the shiny gold pins on the ribbon cable should be facing up. The ribbon cable goes through the PCB slot like in the image above. 20 | 2. Connect the battery 21 | 3. Connect the USB to start charging the battery 22 | 4. Press [SW1](/docs/hardware#bill-of-materials) to bring up the **menu**/**confirm** 23 | 5. Press [SW3](/docs/hardware#bill-of-materials) & [SW4](/docs/hardware#bill-of-materials) to navigate **up**/**down** 24 | 6. Press [SW2](/docs/hardware#bill-of-materials) to **exit/cancel** 25 | 26 | ![Watchy Buttons](../static/img/watchy_buttons_map.png) 27 | 28 | 7. Wait 1 minute to check and see if the clock is updating the time correctly 29 | 30 | **Tips** 31 | 32 | - **Make sure the screen is perfectly aligned before taping it down!** It should not extend above or below the strap holes on the PCB. 33 | 34 | ![Watchy Screen Alignment](../static/img/watchy_screen_align.png) 35 | 36 | - **Make sure the battery cable is tucked in** Everything should fit snug and be aligned to the bottom case, before securing the top case. 37 | - **Do NOT force the case to close. It could break the screen & buttons!** The case should close easily with the top and bottom snaps latching. 38 | - **Do NOT overtighten the screws in the aluminum case** Overtightening will crack the screen! Make sure everything fits nicely and slowly adjust the screws to secure the case. 39 | - **Still having trouble?** Check out this step-by-step guide on assembling the case in our [FAQ](/docs/faqs#the-case-doesnt-fitclose-how-do-i-assemble-it) 40 | 41 | Assembly Video: [https://www.youtube.com/watch?v=ftLTrr_HTpI](https://www.youtube.com/watch?v=ftLTrr_HTpI) 42 | 43 | Assembly Video (CNC Aluminum Case): [https://www.youtube.com/watch?v=rbVr9eVb72M](https://www.youtube.com/watch?v=rbVr9eVb72M) 44 | 45 | ## Watchy Original Assembly 46 | ![Watchy OG Assembly](../static/img/watchy_assembly_steps.png) 47 | 48 | 1. Apply tape to the **back** of the E-Paper display and battery. The **front of the display is white** and the **back of the display is metallic/silver** 49 | 2. Pull lightly to unlock the FFC connector, insert the display cable through the strap hole. Make sure the cable is inserted all the way, then push the lock back in to secure the cable. 50 | 3. Fold back and align the display to the top of the PCB, peel off the tape and firmly secure the display 51 | 4. Insert the battery plug, ensure correct polarity (red is closer to the USB connector) 52 | 5. Peel off the tape and firmly secure the battery to the PCB 53 | 6. Insert the watch strap through the PCB strap holes, then tighten the strap from both ends 54 | 7. Wrap the strap around your arm and adjust for comfort 55 | 56 | Assembly video: https://www.youtube.com/watch?v=PCPxTS1aF3w 57 | 58 | ## Arduino Setup 59 | 60 | Watchy comes pre-loaded with firmware that demonstrates all the basic features. You can also try different watch faces and examples in Arduino. 61 | 62 | 1. Download and install the latest [Arduino IDE](https://www.arduino.cc/en/software) 63 | 2. Start Arduino and open File > Preferences. 64 | 3. Under *Additional Board Manager URLs* add: 65 | 66 | ``` 67 | https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json 68 | ``` 69 | 4. Open Tools > Board > **Boards Manager** and install the latest version of *esp32* platform 70 | 5. Under Sketch > Include Library > Manage Libraries, search for **Watchy** and install the latest version 71 | 6. Make sure all the dependencies are updated to the latest version i.e. **GxEPD2** , **WiFiManager**, **rtc_pcf8563**,**etc.** 72 | 73 | ### Upload 74 | 75 | 1. Plug in the USB on Watchy and select the serial port that shows up 76 | 2. If nothing shows up, or if you're having trouble uploading, make sure you have the [USB-Serial drivers](https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers) installed. Also make sure you're using a USB data cable, and not a charge-only cable. Try different USB ports as well. 77 | 3. Select Tools > Board > ESP32 Arduino > **Watchy** 78 | 4. Select Tools > Board Revision > **Watchy v2.0** 79 | 5. Select Tools > Partition Scheme > **Huge App** 80 | 6. Leave everything else as default 81 | 7. Choose an example and click upload 82 | 8. Try modifying the examples or create your own app! 83 | 84 | ### Wifi Setup 85 | 86 | 1. Click 'Setup Wifi' from main menu on the watch. 87 | 2. Connect to 'Watchy Ap' wifi from another device such as phone or computer / laptop. 88 | 3. Open 192.168.4.1 in the browser. On iphone this page open itself when connecting to wifi. 89 | 4. Click 'Configure WiFi' 90 | 5. Enter SSID and password. (Note: SSID can be prefilled by listed networks on the top of this screen) 91 | 6. Hit 'Save' button and wait for Watchy. 92 | 7. If connection failed, the watchy will display 'Setup failed & timed out!', otherwise it will display the local ip address and SSID of the connected network with confirmation. 93 | 94 | #### Troubleshoot Wifi Setup: 95 | 1. Click 'Info' from 192.168.4.1 page. 96 | 2. Check your router setting to make sure the listed mac address is allowed. 97 | 3. If above didn't fix, then try clicking 'Erase Wifi Config' from 'Info' page and wait for Watchy to restart itself. Once it happen, try the wifi setup again and it should hopefully work. 98 | 99 | --- 100 | 101 | ## PlatformIO Setup 102 | 103 | [PlatformIO](https://platformio.org/) is a compatible alternative to arduino. It's more oriented for the command line user, but it is also more flexible and predictable in build configurations and dependency management (like libraries). 104 | 105 | It has two parts: a "core" that has the command line tools that build and upload/flash, and an "ide" which is a bunch of plugins and extensions for editors you can [find here](https://platformio.org/install/integration). 106 | 107 | Use whichever extensions you wish but this documentation is related to the core, so: 108 | 109 | - [Install with instructions here](https://docs.platformio.org/en/latest//core/installation.html). 110 | 111 | ### Simple watchface example 112 | 113 | This example is to create a new watch face project, it starts by copying one of the examples to the `src/` folder where you can make your own. However, it will not make it easy to edit the watchy library, or its `config.h` file, which many want to, for that see the section below. 114 | 115 | - Create a new folder and setup the PlatformIO project layout 116 | ```bash 117 | mkdir my_new_watchy_face_project 118 | cd my_new_watchy_face_project 119 | pio project init --board esp32dev 120 | ``` 121 | 122 | - Add the following to the `platformio.ini` file. Note that if you want to use another version of the Watchy library, you can put any file or git path here. 123 | 124 | :::caution 125 | 126 | Some users have reported problems with one of the supported RTC modules: The module `PCF8563` seems to be supported during first boots, but their library is overridden by PlatformIO using a broken version - so you need to add an other repository (`https://github.com/orbitalair/Rtc_Pcf8563.git`) to prevent that. 127 | 128 | ::: 129 | 130 | ```ini 131 | lib_deps = 132 | sqfmi/Watchy ; 133 | https://github.com/tzapu/WiFiManager.git#v2.0.11-beta ; Pinned for the same reason 134 | lib_ldf_mode = deep+ 135 | board_build.partitions = min_spiffs.csv 136 | ``` 137 | 138 | - Also pin the version of platform `espressif32` to ensure compatibility. 139 | ```diff 140 | [env:esp32dev] 141 | - platform = espressif32 142 | + platform = espressif32 @ ~6.6.0 143 | ``` 144 | 145 | - Run PlatformIO, it will download dependencies such as the Watchy library, but then fail to compile because there aren't any source files in `src/` yet. So when the dependencies are downloaded, copy the `7_SEG` example files to `src/`. 146 | ```bash 147 | pio run # will fail compilation but will download dependencies 148 | cp .pio/libdeps/esp32dev/Watchy/examples/WatchFaces/7_SEG/*.{ino,cpp,h} src/ 149 | ``` 150 | 151 | - Plug in your watchy, compile and then upload the watch face: 152 | ```bash 153 | pio run -t upload 154 | ``` 155 | 156 | - Watch the serial port output 157 | ```bash 158 | pio device monitor 159 | ``` 160 | 161 | - Celebrate by watching ascii star wars 162 | ```bash 163 | telnet towel.blinkenlights.nl 164 | ``` 165 | 166 | - Additional keys you'll probably want to add to your `platformio.ini` file: 167 | ```ini 168 | upload_speed = 3000000 169 | upload_port = /dev/cu.usbserial-MQK8G8 170 | monitor_port = /dev/cu.usbserial-MQK8G8 171 | monitor_speed = 115200 172 | monitor_filters = esp32_exception_decoder 173 | ``` -------------------------------------------------------------------------------- /docs/libraries.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: libs 3 | title: Libraries Used 4 | sidebar_label: Libraries Used 5 | slug: /libs 6 | --- 7 | 8 | The Watchy library depends on other open source libraries to drive all of its hardware, some of which have been wrapped in [```Watchy.h```](https://github.com/sqfmi/Watchy/blob/master/src/Watchy.h) to provide a framework for building watch faces and apps. 9 | 10 | ## Display Graphics 11 | 12 | ### GxEPD2 13 | 14 | [GxEPD2](https://github.com/ZinggJM/GxEPD2) is an Arduino Display Library for SPI E-Paper Displays. It abstracts the SPI communication required to drive Watchy's E-Paper display, the GDEH0154D67. This library depends on the Adafruit GFX library, which provides the graphic primitives methods for drawing images, shapes, text, etc. 15 | 16 | ### Adafruit GFX 17 | 18 | [Adafruit GFX](https://github.com/adafruit/Adafruit-GFX-Library) provides methods such as ```display.drawRect()``` for drawing shapes, ```display.drawBitmap()``` for drawing images, and ```display.println("Hello World!")``` for printing text. 19 | 20 | Visit [https://learn.adafruit.com/adafruit-gfx-graphics-library/overview](https://learn.adafruit.com/adafruit-gfx-graphics-library/overview) for more details. 21 | 22 | See [**Create Your Own Watch Face**](/docs/create-watchface) to learn how to use custom fonts and converting graphics to byte arrays. 23 | 24 | ## Time Keeping 25 | 26 | ### DS3232RTC 27 | 28 | [DS3232RTC](https://github.com/JChristensen/DS3232RTC) is an Arduino library for the DS3231 Real-Time Clock. You can set and read the current time/date and configure alarm interrupts. The DS3231 RTC on Watchy is connected over I2C, so it requires the Wire Arduino library. The Watchy library configures *Alarm2* to trigger an interrupt every minute, waking the ESP32 from deep sleep to update the watch face. 29 | 30 | ## Motion Sensing 31 | 32 | ### BMA423 33 | [BMA423 Sensor API](https://github.com/BoschSensortec/BMA423-Sensor-API) is a C library for the BMA423, an ultra-small, triaxial, low-g acceleration sensor. The Watchy library provides a simple C++ Arduino API on top to simplify sensor readings such as direction sensing and step counting. The current Watchy library will be updated shortly to utilize the latest implementation from Bosch. 34 | 35 | ## Connectivity & Data 36 | 37 | ### WiFiManager 38 | 39 | [WiFiManager](https://github.com/tzapu/WiFiManager) sets up an access point captive portal, allowing you to connect and enter your WiFi credentials. These credentials are then saved in ESP32's flash, thus only requiring you to enter them once. Alternatively, you can also hard code your credentials in the ```config.h```. 40 | 41 | ### Arduino_JSON 42 | 43 | [Arduino_JSON](https://github.com/arduino-libraries/Arduino_JSON) is used for parsing JSON string responses from API calls. Check out Watchy's [```getWeather()```](https://github.com/sqfmi/Watchy/blob/1.2.5/src/Watchy.cpp#L591) method example on how its used for parsing data from OpenWeather's REST API. 44 | -------------------------------------------------------------------------------- /docs/license.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: license 3 | title: Open Source Hardware & Software 4 | sidebar_label: Open Source License 5 | slug: /license 6 | --- 7 | 8 | Watchy's software, hardware, and documentation are fully open source under MIT license and OSHWA certified. 9 | 10 | [![OSHWA US000936](../static/img/OSHWA-Certification.svg)](https://certification.oshwa.org/us000936.html) 11 | 12 | ![licenses](../static/img/opensource-label.svg) 13 | 14 | MIT License 15 | 16 | Copyright (c) 2020 SQFMI 17 | 18 | Permission is hereby granted, free of charge, to any person obtaining a copy 19 | of this software and associated documentation files (the "Software"), to deal 20 | in the Software without restriction, including without limitation the rights 21 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 22 | copies of the Software, and to permit persons to whom the Software is 23 | furnished to do so, subject to the following conditions: 24 | 25 | The above copyright notice and this permission notice shall be included in all 26 | copies or substantial portions of the Software. 27 | 28 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 29 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 30 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 31 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 32 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 33 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 34 | SOFTWARE. -------------------------------------------------------------------------------- /docusaurus.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | title: 'Watchy', 3 | tagline: 'Open Source E-Paper Watch', 4 | url: 'https://watchy.sqfmi.com', 5 | baseUrl: '/', 6 | onBrokenLinks: 'throw', 7 | onBrokenMarkdownLinks: 'warn', 8 | favicon: 'img/favicon.ico', 9 | organizationName: 'sqfmi', // Usually your GitHub org/user name. 10 | projectName: 'watchy-docs', // Usually your repo name. 11 | scripts: [ 12 | 'https://www.instagram.com/embed.js' 13 | ], 14 | themeConfig: { 15 | image: 'img/watchy_social_card.png', 16 | navbar: { 17 | title: 'Watchy', 18 | logo: { 19 | alt: 'Watchy by SQFMI', 20 | src: 'img/sqfmi_logo_32x32.svg', 21 | }, 22 | items: [ 23 | { 24 | to: 'docs/getting-started', 25 | activeBasePath: 'docs', 26 | label: 'Docs', 27 | position: 'left', 28 | }, 29 | { 30 | to: 'watchfaces', 31 | activeBasePath: 'watchfaces', 32 | label: 'Watch Faces', 33 | position: 'left', 34 | }, 35 | { 36 | to: 'watchcases', 37 | activeBasePath: 'watchcases', 38 | label: 'Watch Cases', 39 | position: 'left', 40 | }, 41 | { 42 | to: 'gallery', 43 | activeBasePath: 'gallery', 44 | label: 'Gallery', 45 | position: 'left', 46 | }, 47 | // { 48 | // to: 'contest', 49 | // activeBasePath: 'contest', 50 | // label: 'Case Design Contest', 51 | // position: 'left', 52 | // }, 53 | // {to: 'blog', label: 'Blog', position: 'left'}, 54 | { 55 | to: 'https://mou.sr/3WQWSXT', 56 | label: 'Buy Watchy!', 57 | position: 'right', 58 | }, 59 | ], 60 | }, 61 | footer: { 62 | style: 'dark', 63 | links: [ 64 | { 65 | title: 'Docs', 66 | items: [ 67 | { 68 | label: 'Getting Started', 69 | to: 'docs/getting-started', 70 | }, 71 | // { 72 | // label: 'Hardware', 73 | // to: 'docs/hardware', 74 | // }, 75 | { 76 | label: 'GitHub', 77 | to: 'https://github.com/sqfmi/', 78 | }, 79 | ], 80 | }, 81 | { 82 | title: 'Community', 83 | items: [ 84 | { 85 | label: 'Discord', 86 | to: 'https://discord.gg/ZXDegGV8E7', 87 | }, 88 | ], 89 | }, 90 | { 91 | title: 'Social', 92 | items: [ 93 | { 94 | label: 'Twitter', 95 | to: 'https://twitter.com/sqfmi', 96 | }, 97 | { 98 | label: 'Instagram', 99 | to: 'https://www.instagram.com/sqfmi', 100 | }, 101 | { 102 | label: 'YouTube', 103 | to: 'https://www.youtube.com/channel/UC9SAc8ikvU7KuYw3OfogFFA', 104 | }, 105 | ], 106 | }, 107 | { 108 | title: 'Shop', 109 | items: [ 110 | { 111 | label: 'SQFMI Shop', 112 | to: 'https://shop.sqfmi.com', 113 | }, 114 | { 115 | label: 'The Pi Hut', 116 | to: 'https://thepihut.com/collections/sqfmi', 117 | }, 118 | { 119 | label: 'Mouser', 120 | to: 'https://www.mouser.com/manufacturer/sqfmi/', 121 | }, 122 | { 123 | label: 'Crowd Supply', 124 | to: 'https://www.crowdsupply.com/sqfmi/watchy', 125 | }, 126 | ], 127 | }, 128 | ], 129 | copyright: `Copyright © ${new Date().getFullYear()} Squarofumi. Built with Docusaurus.`, 130 | }, 131 | }, 132 | presets: [ 133 | [ 134 | '@docusaurus/preset-classic', 135 | { 136 | docs: { 137 | sidebarPath: require.resolve('./sidebars.js'), 138 | // Please change this to your repo. 139 | editUrl: 140 | 'https://github.com/sqfmi/watchy-docs/edit/main/', 141 | }, 142 | // blog: { 143 | // showReadingTime: true, 144 | // // Please change this to your repo. 145 | // editUrl: 146 | // 'https://github.com/facebook/docusaurus/edit/master/website/blog/', 147 | // }, 148 | theme: { 149 | customCss: require.resolve('./src/css/custom.css'), 150 | }, 151 | gtag: { 152 | trackingID: 'G-MN55F60K14', 153 | } 154 | }, 155 | ], 156 | ], 157 | }; 158 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "watchy", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "docusaurus": "docusaurus", 7 | "start": "docusaurus start", 8 | "build": "docusaurus build", 9 | "swizzle": "docusaurus swizzle", 10 | "deploy": "docusaurus deploy", 11 | "clear": "docusaurus clear", 12 | "serve": "docusaurus serve", 13 | "write-translations": "docusaurus write-translations", 14 | "write-heading-ids": "docusaurus write-heading-ids" 15 | }, 16 | "dependencies": { 17 | "@docusaurus/core": "2.4.0", 18 | "@docusaurus/preset-classic": "2.4.0", 19 | "@mdx-js/react": "^1.6.22", 20 | "clsx": "^1.2.1", 21 | "prism-react-renderer": "^1.3.5", 22 | "react": "^17.0.2", 23 | "react-dom": "^17.0.2" 24 | }, 25 | "devDependencies": { 26 | "@docusaurus/module-type-aliases": "2.4.0" 27 | }, 28 | "browserslist": { 29 | "production": [ 30 | ">0.5%", 31 | "not dead", 32 | "not op_mini all" 33 | ], 34 | "development": [ 35 | "last 1 chrome version", 36 | "last 1 firefox version", 37 | "last 1 safari version" 38 | ] 39 | }, 40 | "engines": { 41 | "node": ">=16.14" 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /sidebars.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | docs: [ 3 | { 4 | type: 'category', 5 | label: 'Software', 6 | items: ['getting-started', 'libs', 'examples','create-watchface','battery-life', 'legacy'], 7 | collapsed: false 8 | }, 9 | { 10 | type: 'doc', 11 | id: 'hardware' 12 | }, 13 | { 14 | type: 'doc', 15 | id: '3DModels' 16 | }, 17 | { 18 | type: 'doc', 19 | id: 'faqs' 20 | }, 21 | { 22 | type: 'doc', 23 | id: 'license' 24 | } 25 | ], 26 | }; 27 | -------------------------------------------------------------------------------- /src/css/custom.css: -------------------------------------------------------------------------------- 1 | /* stylelint-disable docusaurus/copyright-header */ 2 | /** 3 | * Any CSS included here will be global. The classic template 4 | * bundles Infima by default. Infima is a CSS framework designed to 5 | * work well for content-centric websites. 6 | */ 7 | 8 | /* You can override the default Infima variables here. */ 9 | :root { 10 | --ifm-color-primary: #202e28; 11 | --ifm-color-primary-dark: #1d2924; 12 | --ifm-color-primary-darker: #1b2722; 13 | --ifm-color-primary-darkest: #16201c; 14 | --ifm-color-primary-light: #23332c; 15 | --ifm-color-primary-lighter: #25352e; 16 | --ifm-color-primary-lightest: #2a3c34; 17 | --ifm-code-font-size: 95%; 18 | } 19 | 20 | .docusaurus-highlight-code-line { 21 | background-color: rgb(72, 77, 91); 22 | display: block; 23 | margin: 0 calc(-1 * var(--ifm-pre-padding)); 24 | padding: 0 var(--ifm-pre-padding); 25 | } 26 | -------------------------------------------------------------------------------- /src/pages/contest/contest.module.css: -------------------------------------------------------------------------------- 1 | /* .contest{ 2 | text-align:center; 3 | } 4 | 5 | .contest h1{ 6 | margin-top:10px; 7 | } 8 | 9 | .contest h2{ 10 | margin-top:10px; 11 | } 12 | 13 | .contest figcaption{ 14 | text-align:left; 15 | margin-left:12.5%; 16 | font-style: italic; 17 | } 18 | 19 | .contest ul{ 20 | display:block; 21 | text-align: left; 22 | margin:0 auto; 23 | } 24 | 25 | .contest ul li{ 26 | padding:10px; 27 | } 28 | 29 | .contest .prize{ 30 | width:18em; 31 | } 32 | 33 | .contest .rules{ 34 | width:100%; 35 | text-align: left; 36 | } 37 | 38 | .contest .rules li{ 39 | list-style-type: square; 40 | list-style-position: inside; 41 | padding-left: 5em; 42 | } 43 | 44 | .contest .prize span{ 45 | float:right; 46 | } 47 | 48 | .contest .resources li{ 49 | list-style-type: square; 50 | list-style-position: inside; 51 | padding-left: 5em; 52 | } 53 | 54 | .contest a{ 55 | margin:30px 0; 56 | } 57 | 58 | img{ 59 | max-width:50%; 60 | display:block; 61 | margin: 0 auto; 62 | } 63 | 64 | .submit{ 65 | text-align: center; 66 | } 67 | 68 | .submit a{ 69 | margin-top:10px; 70 | } 71 | 72 | .vote{ 73 | text-align: center; 74 | } 75 | 76 | 77 | @media screen and (max-width: 966px) { 78 | .contest .rules li{ 79 | padding-left: 0em; 80 | } 81 | 82 | } 83 | */ -------------------------------------------------------------------------------- /src/pages/contest/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Layout from '@theme/Layout'; 3 | import contest from './contest.module.css'; 4 | 5 | function Hello() { 6 | return ( 7 | 8 |
9 |
10 |
11 |
12 |

Congratulations to the case design contest winners!!

13 |

First Place - Flipped Chamfer by demseyk

14 | 15 | https://github.com/sqfmi/watchy-cases/tree/main/Flipped%20Chamfer 16 |

Second Place - Slim by BraininaBowl

17 | 18 | https://github.com/sqfmi/watchy-cases/tree/main/Slim 19 |

Third Place - Peechy by Optogram

20 | 21 | https://github.com/sqfmi/watchy-cases/tree/main/Peechy 22 |

Thank you everyone for your submissions! Please continue to share your awesome designs :)

23 |
24 |
25 | 26 |
27 |
28 |
29 | ); 30 | } 31 | 32 | export default Hello; -------------------------------------------------------------------------------- /src/pages/gallery/Post.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | 3 | class Post extends Component { 4 | render(){ 5 | return( 6 |
7 |
8 |
9 |
10 |
11 | ) 12 | } 13 | } 14 | 15 | export default Post; // Don’t forget to use export default! -------------------------------------------------------------------------------- /src/pages/gallery/PostsList.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import Post from './Post'; 3 | import urls from './instagramPosts'; 4 | 5 | class PostsList extends Component { 6 | 7 | renderRows(){ 8 | let rows = []; 9 | let postsList = []; 10 | urls.forEach((url, index) => { 11 | rows.push(); 12 | 13 | if((index+1) % 4 == 0){ 14 | postsList.push(
{rows}
); 15 | rows = []; 16 | } 17 | }); 18 | return postsList; 19 | } 20 | 21 | render(){ 22 | return( 23 |
24 | {this.renderRows()} 25 |
26 | ) 27 | } 28 | } 29 | 30 | export default PostsList 31 | 32 | -------------------------------------------------------------------------------- /src/pages/gallery/gallery.module.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/src/pages/gallery/gallery.module.css -------------------------------------------------------------------------------- /src/pages/gallery/index.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect } from 'react'; 2 | import Layout from '@theme/Layout'; 3 | import PostsList from './PostsList'; 4 | import styles from './gallery.module.css'; 5 | 6 | function Hello() { 7 | useEffect(() => { 8 | if (window.instgrm) 9 | window.instgrm.Embeds.process(); 10 | }, []); 11 | 12 | return ( 13 | 14 |
15 | 16 |
17 |
18 | ); 19 | } 20 | 21 | export default Hello; -------------------------------------------------------------------------------- /src/pages/gallery/instagramPosts.json: -------------------------------------------------------------------------------- 1 | [ 2 | "https://www.instagram.com/p/CQCy6g3jJbr", 3 | "https://www.instagram.com/p/COd-r0hhtlb", 4 | "https://www.instagram.com/p/CLxQZuph6uq", 5 | "https://www.instagram.com/p/CKzmpX6rWKZ", 6 | "https://www.instagram.com/p/CKT4z9Wr8nT", 7 | "https://www.instagram.com/p/CKuq53KJuHm", 8 | "https://www.instagram.com/p/CKwHO1tLMJU", 9 | "https://www.instagram.com/p/CKwcRHHrE9I", 10 | "https://www.instagram.com/p/CKPfrP6gBV9", 11 | "https://www.instagram.com/p/CKF-ecGr6dL", 12 | "https://www.instagram.com/p/CJ4z8EZAYFB", 13 | "https://www.instagram.com/p/CJphnILgNoJ", 14 | "https://www.instagram.com/p/CJXgPr9Atd-", 15 | "https://www.instagram.com/p/CKy6Mo9jvXn", 16 | "https://www.instagram.com/p/CI87IyMrMWd", 17 | "https://www.instagram.com/p/CKLrQijD3St", 18 | "https://www.instagram.com/p/CI4BHLorhc9", 19 | "https://www.instagram.com/p/CIErV5UgfRK", 20 | "https://www.instagram.com/p/CIAC3GtLeKm", 21 | "https://www.instagram.com/p/CGvi4OfrF3o", 22 | "https://www.instagram.com/p/CGVkuFCDrXV", 23 | "https://www.instagram.com/p/B9f5WivHEZv", 24 | "https://www.instagram.com/p/B8sIr6WH3b0", 25 | "https://www.instagram.com/p/B4itbQLnWUb", 26 | "https://www.instagram.com/p/BoF58KLnaGo", 27 | "https://www.instagram.com/p/Bn5DOclAnT3" 28 | ] -------------------------------------------------------------------------------- /src/pages/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import clsx from 'clsx'; 3 | import Layout from '@theme/Layout'; 4 | import Link from '@docusaurus/Link'; 5 | import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; 6 | import useBaseUrl from '@docusaurus/useBaseUrl'; 7 | import styles from './styles.module.css'; 8 | 9 | const features = [ 10 | { 11 | title: 'E-Paper Display', 12 | imageUrl: 'img/watchy_watchface_weather.gif', 13 | description: ( 14 | <> 15 | Beautiful E-Paper display with 200x200 pixel resolution. Glare free visibility under bright sunlight, near 180 degree view angle, and ultra low power consumption. 16 | 17 | ), 18 | }, 19 | { 20 | title: 'Powered by ESP32', 21 | imageUrl: 'img/esp32.jpg', 22 | description: ( 23 | <> 24 | ESP32-PICO-D4 at its core, with built-in WiFi/Bluetooth LE and compatibility with Arduino, MicroPython, and ESP-IDF 25 | 26 | ), 27 | }, 28 | { 29 | title: 'Open Source HW & SW', 30 | imageUrl: 'img/oshw-logo.svg', 31 | description: ( 32 | <> 33 | Certified open source hardware (OSHWA) and open source software. Tons of fun examples and cool watchfaces by us and the community. 34 | 35 | ), 36 | }, 37 | ]; 38 | 39 | function Feature({imageUrl, title, description}) { 40 | const imgUrl = useBaseUrl(imageUrl); 41 | return ( 42 |
43 | {imgUrl && ( 44 |
45 | {title} 46 |
47 | )} 48 |

{title}

49 |

{description}

50 |
51 | ); 52 | } 53 | 54 | function Home() { 55 | const context = useDocusaurusContext(); 56 | const {siteConfig = {}} = context; 57 | return ( 58 | 61 |
62 |
63 |

{siteConfig.title}

64 |

{siteConfig.tagline}

65 |
66 | 72 | Get Started 73 | 74 |
75 |
76 |
77 |
78 | {features && features.length > 0 && ( 79 |
80 |
81 |
82 | {features.map((props, idx) => ( 83 | 84 | ))} 85 |
86 |
87 |
88 | )} 89 |
90 |
91 | ); 92 | } 93 | 94 | export default Home; 95 | -------------------------------------------------------------------------------- /src/pages/styles.module.css: -------------------------------------------------------------------------------- 1 | /* stylelint-disable docusaurus/copyright-header */ 2 | 3 | /** 4 | * CSS files with the .module.css suffix will be treated as CSS modules 5 | * and scoped locally. 6 | */ 7 | 8 | .heroBanner { 9 | padding: 4rem 0; 10 | text-align: center; 11 | position: relative; 12 | overflow: hidden; 13 | background-image: url("/img/watchy_render.png"); 14 | background-size: 700px; 15 | background-position: 50% 0px; 16 | background-repeat: no-repeat; 17 | background-color: #2b2b2b; 18 | height:500px; 19 | } 20 | 21 | .heroBanner h1, .heroBanner p, .heroBanner a{ 22 | margin-left:25%; 23 | margin-bottom:0%; 24 | color: #d7e2d3 !important; 25 | } 26 | 27 | .heroBanner h1{ 28 | margin-top:25%; 29 | } 30 | 31 | @media screen and (max-width: 966px) { 32 | .heroBanner { 33 | padding: 2rem; 34 | padding-top: 70%; 35 | background-size: 400px; 36 | background-position: 15% 5%; 37 | } 38 | 39 | .heroBanner h1, .heroBanner p, .heroBanner a{ 40 | margin-top:0%; 41 | margin-left:0%; 42 | color: #d7e2d3 !important; 43 | } 44 | 45 | } 46 | 47 | .buttons { 48 | display: flex; 49 | align-items: center; 50 | justify-content: center; 51 | } 52 | 53 | .features { 54 | display: flex; 55 | align-items: center; 56 | padding: 2rem 0; 57 | width: 100%; 58 | text-align: center; 59 | } 60 | 61 | .featureImage { 62 | height: 180px; 63 | width: 180px; 64 | } 65 | -------------------------------------------------------------------------------- /src/pages/watchcases/WatchCase.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import watchcase from './watchcase.module.css'; 3 | 4 | class WatchCase extends Component { 5 | 6 | render(){ 7 | return( 8 |
9 |

{this.props.title}

10 | 11 | GitHub 12 |
13 | ) 14 | } 15 | } 16 | 17 | export default WatchCase; -------------------------------------------------------------------------------- /src/pages/watchcases/WatchCaseSTL.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import watchcase from './watchcase.module.css'; 3 | 4 | class WatchCaseSTL extends Component { 5 | 6 | render(){ 7 | return( 8 |
9 |

{this.props.title}

10 | 11 | GitHub 12 |
13 | ) 14 | } 15 | } 16 | 17 | export default WatchCaseSTL; // Don’t forget to use export default! 18 | -------------------------------------------------------------------------------- /src/pages/watchcases/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Layout from '@theme/Layout'; 3 | import WatchCase from './WatchCase'; 4 | import WatchCaseSTL from './WatchCaseSTL'; 5 | 6 | function Hello() { 7 | return ( 8 | 9 |
10 |
11 |
12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 |
21 |
22 |
23 |
24 | ); 25 | } 26 | 27 | export default Hello; -------------------------------------------------------------------------------- /src/pages/watchcases/watchcase.module.css: -------------------------------------------------------------------------------- 1 | .case{ 2 | text-align: center; 3 | } 4 | 5 | .case iframe{ 6 | display:block; 7 | margin:10px auto; 8 | } -------------------------------------------------------------------------------- /src/pages/watchfaces/WatchFace.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import watchface from './watchface.module.css'; 3 | 4 | class WatchFace extends Component { 5 | render() { 6 | return( 7 |
8 | 9 | {this.props.name} 10 |
11 | ) 12 | } 13 | } 14 | 15 | function TryButton(props){ 16 | if(props.ota_bin){ 17 | return ; 18 | }else{ 19 | return null; 20 | } 21 | } 22 | 23 | var watchyUUID = "cd77498e-1ac8-48b6-aba8-4161c7342fce"; 24 | var BLEOTAServiceUUID = "86b12865-4b70-4893-8ce6-9864fc00374d"; 25 | var versionCharacteristicUUID = '86b12867-4b70-4893-8ce6-9864fc00374d'; 26 | var fileCharacteristicUUID = "86b12866-4b70-4893-8ce6-9864fc00374d"; 27 | 28 | 29 | let watchyService = null; 30 | let readyFlagCharacteristic = null; 31 | let dataToSend = null; 32 | let updateData = null; 33 | 34 | var totalSize; 35 | var remaining; 36 | var amountToWrite; 37 | var currentPosition; 38 | 39 | var currentHardwareVersion = "N/A"; 40 | var firmwareVersion = "N/A"; 41 | 42 | const characteristicSize = 512; 43 | 44 | function BTConnect(e){ 45 | 46 | e.preventDefault(); 47 | let watchfaceName = e.target.id; 48 | 49 | navigator.bluetooth.requestDevice({ 50 | filters: [{ 51 | services: [watchyUUID] 52 | }], 53 | optionalServices: [BLEOTAServiceUUID] 54 | }) 55 | .then(device => { 56 | return device.gatt.connect() 57 | }) 58 | .then(server => server.getPrimaryService(BLEOTAServiceUUID)) 59 | .then(service => { 60 | watchyService = service; 61 | }) 62 | .then(service => { 63 | return service; 64 | }) 65 | .then(_ => { 66 | return CheckVersion(watchfaceName); 67 | }) 68 | .catch(error => { console.log(error); }); 69 | } 70 | 71 | function CheckVersion(watchfaceName){ 72 | if(!watchyService) 73 | { 74 | return; 75 | } 76 | return watchyService.getCharacteristic(versionCharacteristicUUID) 77 | .then(characteristic => characteristic.readValue()) 78 | .then(value => { 79 | currentHardwareVersion = 'v' + value.getUint8(0) + '.' + value.getUint8(1); 80 | firmwareVersion = 'v' + value.getUint8(2) + '.' + value.getUint8(3) + '.' + value.getUint8(4); 81 | }) 82 | .then(function (data) { 83 | Update(watchfaceName); 84 | }) 85 | .catch(error => { console.log(error); }); 86 | } 87 | 88 | function Update(watchfaceName){ 89 | let dir; 90 | watchfaceName == '7_SEG_LIGHT' ? dir = '7_SEG' : dir = watchfaceName; 91 | let url = 'https://raw.githubusercontent.com/sqfmi/Watchy/master/examples/WatchFaces/'+dir+'/'+watchfaceName+'.bin'; 92 | fetch(url) 93 | .then(function (response) { 94 | return response.arrayBuffer(); 95 | }) 96 | .then(function (data) { 97 | updateData = data; 98 | return SendFileOverBluetooth(); 99 | }) 100 | .catch(function (err) { console.warn('Something went wrong.', err); }); 101 | } 102 | 103 | 104 | function SendFileOverBluetooth() { 105 | if(!watchyService) 106 | { 107 | console.log("No Watchy Service"); 108 | return; 109 | } 110 | 111 | totalSize = updateData.byteLength; 112 | remaining = totalSize; 113 | amountToWrite = 0; 114 | currentPosition = 0; 115 | watchyService.getCharacteristic(fileCharacteristicUUID) 116 | .then(characteristic => { 117 | readyFlagCharacteristic = characteristic; 118 | return characteristic.startNotifications() 119 | .then(_ => { 120 | readyFlagCharacteristic.addEventListener('characteristicvaluechanged', SendBufferedData) 121 | }); 122 | }) 123 | .catch(error => { 124 | console.log(error); 125 | }); 126 | SendBufferedData(); 127 | } 128 | 129 | function SendBufferedData() { 130 | if (remaining > 0) { 131 | if (remaining >= characteristicSize) { 132 | amountToWrite = characteristicSize 133 | } 134 | else { 135 | amountToWrite = remaining; 136 | } 137 | dataToSend = updateData.slice(currentPosition, currentPosition + amountToWrite); 138 | currentPosition += amountToWrite; 139 | remaining -= amountToWrite; 140 | console.log("remaining: " + remaining); 141 | watchyService.getCharacteristic(fileCharacteristicUUID) 142 | .then(characteristic => RecursiveSend(characteristic, dataToSend)) 143 | .then(_ => { 144 | return console.log((100 * (currentPosition/totalSize)).toPrecision(3) + '%'); 145 | }) 146 | .catch(error => { 147 | console.log(error); 148 | }); 149 | } 150 | } 151 | 152 | function RecursiveSend(characteristic, data) { 153 | return characteristic.writeValue(data) 154 | .catch(error => { 155 | return RecursiveSend(characteristic, data); 156 | }); 157 | } 158 | 159 | export default WatchFace; // Don’t forget to use export default! -------------------------------------------------------------------------------- /src/pages/watchfaces/WatchFaceList.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import WatchFace from './WatchFace'; 3 | import watchfaces from './watchfaces'; 4 | 5 | class WatchFaceList extends Component { 6 | 7 | renderRows(){ 8 | 9 | let rows = []; 10 | let list = []; 11 | watchfaces.forEach((watchfaceObj, index) => { 12 | rows.push(); 13 | if((index+1) % 3 == 0){ 14 | list.push(
{rows}
); 15 | rows = []; 16 | } 17 | }); 18 | list.push(
{rows}
); 19 | return list; 20 | } 21 | 22 | render(){ 23 | return( 24 |
25 | {this.renderRows()} 26 |
27 | ) 28 | } 29 | } 30 | 31 | export default WatchFaceList 32 | 33 | -------------------------------------------------------------------------------- /src/pages/watchfaces/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Layout from '@theme/Layout'; 3 | import WatchFaceList from './WatchFaceList'; 4 | 5 | function Hello() { 6 | return ( 7 | 8 |
9 |
10 | 11 |
12 |

Can't find the right watch face?

13 | Create Your Own! 14 |
15 |
16 |
17 | ); 18 | } 19 | 20 | export default Hello; -------------------------------------------------------------------------------- /src/pages/watchfaces/watchface.module.css: -------------------------------------------------------------------------------- 1 | .frame{ 2 | background-image: url("/img/watchy_frame.png"); 3 | background-repeat: no-repeat; 4 | background-position: center; 5 | background-size: 270px 460px; 6 | height:460px; 7 | margin-bottom:100px; 8 | text-align: center; 9 | } 10 | 11 | .frame img{ 12 | position: relative; 13 | top:130px; 14 | } 15 | 16 | .frame button{ 17 | display:block; 18 | margin:5px auto; 19 | position: relative; 20 | top:260px; 21 | } 22 | 23 | .frame a{ 24 | display:block; 25 | margin:5px auto; 26 | position: relative; 27 | top:260px; 28 | width:80%; 29 | } -------------------------------------------------------------------------------- /src/pages/watchfaces/watchfaces.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id" : "1", 4 | "name" : "Basic", 5 | "author" : "SQFMI", 6 | "screenshot" : "/img/watchfaces/1_Basic.png", 7 | "source" : "https://github.com/sqfmi/Watchy/tree/master/examples/WatchFaces/Basic", 8 | "ota_bin" : true, 9 | "version" : "1.0.0" 10 | }, 11 | { 12 | "id" : "2", 13 | "name" : "7_SEG", 14 | "author" : "SQFMI", 15 | "screenshot" : "/img/watchfaces/2_7_SEG.png", 16 | "source" : "https://github.com/sqfmi/Watchy/tree/master/examples/WatchFaces/7_SEG", 17 | "ota_bin" : true, 18 | "version" : "1.0.0" 19 | }, 20 | { 21 | "id" : "2A", 22 | "name" : "7_SEG_LIGHT", 23 | "author" : "SQFMI", 24 | "screenshot" : "/img/watchfaces/2_7_SEG_Light.png", 25 | "source" : "https://github.com/sqfmi/Watchy/tree/master/examples/WatchFaces/7_SEG", 26 | "ota_bin" : true, 27 | "version" : "1.0.0" 28 | }, 29 | { 30 | "id" : "3", 31 | "name" : "DOS", 32 | "author" : "SQFMI", 33 | "screenshot" : "/img/watchfaces/3_DOS.png", 34 | "source" : "https://github.com/sqfmi/Watchy/tree/master/examples/WatchFaces/DOS", 35 | "ota_bin" : true, 36 | "version" : "1.0.0" 37 | }, 38 | { 39 | "id" : "4", 40 | "name" : "Pokemon", 41 | "author" : "SQFMI", 42 | "screenshot" : "/img/watchfaces/4_Pokemon.png", 43 | "source" : "https://github.com/sqfmi/Watchy/tree/master/examples/WatchFaces/Pokemon", 44 | "ota_bin" : true, 45 | "version" : "1.0.0" 46 | }, 47 | { 48 | "id" : "5", 49 | "name" : "StarryHorizon", 50 | "author" : "dandelany", 51 | "screenshot" : "/img/watchfaces/5_StarryHorizon.png", 52 | "source" : "https://github.com/sqfmi/Watchy/tree/master/examples/WatchFaces/StarryHorizon", 53 | "ota_bin" : true, 54 | "version" : "1.0.0" 55 | }, 56 | { 57 | "id" : "6", 58 | "name" : "Tetris", 59 | "author" : "SQFMI", 60 | "screenshot" : "/img/watchfaces/6_Tetris.png", 61 | "source" : "https://github.com/sqfmi/Watchy/tree/master/examples/WatchFaces/Tetris", 62 | "ota_bin" : true, 63 | "version" : "1.0.0" 64 | }, 65 | { 66 | "id" : "7", 67 | "name" : "MacPaint", 68 | "author" : "SQFMI", 69 | "screenshot" : "/img/watchfaces/7_MacPaint.png", 70 | "source" : "https://github.com/sqfmi/Watchy/tree/master/examples/WatchFaces/MacPaint", 71 | "ota_bin" : true, 72 | "version" : "1.0.0" 73 | }, 74 | { 75 | "id" : "8", 76 | "name" : "Bahn", 77 | "author" : "BraininaBowl", 78 | "screenshot" : "/img/watchfaces/8_Bahn.png", 79 | "source" : "https://github.com/BraininaBowl/Bahn-for-Watchy", 80 | "ota_bin" : false, 81 | "version" : "1.0.0" 82 | }, 83 | { 84 | "id" : "9", 85 | "name" : "Re-Dub", 86 | "author" : "BraininaBowl", 87 | "screenshot" : "/img/watchfaces/9_Redub.png", 88 | "source" : "https://github.com/BraininaBowl/Re-Dub-for-Watchy", 89 | "ota_bin" : false, 90 | "version" : "1.0.0" 91 | }, 92 | { 93 | "id" : "10", 94 | "name" : "Calculateur", 95 | "author" : "Jochen", 96 | "screenshot" : "/img/watchfaces/10_Calculateur.png", 97 | "source" : "https://git.sr.ht/~jochen/Calculateur", 98 | "ota_bin" : false, 99 | "version" : "1.0.0" 100 | }, 101 | { 102 | "id" : "11", 103 | "name" : "Jarvis", 104 | "author" : "peerdavid", 105 | "screenshot" : "/img/watchfaces/11_Jarvis.gif", 106 | "source" : "https://github.com/peerdavid/wos", 107 | "ota_bin" : false, 108 | "version" : "1.0.0" 109 | }, 110 | { 111 | "id" : "12", 112 | "name" : "Bad For Eye", 113 | "author" : "mammothroar", 114 | "screenshot" : "/img/watchfaces/12_BadForEye.png", 115 | "source" : "https://github.com/mammothroar/watchy/tree/main/watchface/BadForEye", 116 | "ota_bin" : false, 117 | "version" : "1.0.0" 118 | }, 119 | { 120 | "id" : "13", 121 | "name" : "Maze", 122 | "author" : "BraininaBowl", 123 | "screenshot" : "/img/watchfaces/13_Maze.png", 124 | "source" : "https://github.com/BraininaBowl/Maze-for-Watchy", 125 | "ota_bin" : false, 126 | "version" : "1.0.0" 127 | }, 128 | { 129 | "id" : "14", 130 | "name" : "BTTF", 131 | "author" : "peerdavid", 132 | "screenshot" : "/img/watchfaces/14_BTTF.png", 133 | "source" : "https://github.com/peerdavid/wos", 134 | "ota_bin" : false, 135 | "version" : "1.0.0" 136 | }, 137 | { 138 | "id" : "15", 139 | "name" : "Binary", 140 | "author" : "BenjaminGabel", 141 | "screenshot" : "/img/watchfaces/15_Binary.png", 142 | "source" : "https://github.com/BenjaminGabel/BinaryWatchFace", 143 | "ota_bin" : false, 144 | "version" : "1.0.0" 145 | }, 146 | { 147 | "id" : "16", 148 | "name" : "Stationary Text", 149 | "author" : "BraininaBowl", 150 | "screenshot" : "/img/watchfaces/16_Stationary_Text.png", 151 | "source" : "https://github.com/BraininaBowl/Stationary-Text-for-Watchy", 152 | "ota_bin" : false, 153 | "version" : "1.0.0" 154 | }, 155 | { 156 | "id" : "17", 157 | "name" : "Steps", 158 | "author" : "peerdavid", 159 | "screenshot" : "/img/watchfaces/17_Steps.png", 160 | "source" : "https://github.com/peerdavid/wos", 161 | "ota_bin" : false, 162 | "version" : "1.0.0" 163 | }, 164 | { 165 | "id" : "18", 166 | "name" : "TypoStyle", 167 | "author" : "spinalcode", 168 | "screenshot" : "/img/watchfaces/18_TypoStyle.png", 169 | "source" : "https://github.com/spinalcode/TypoStyle", 170 | "ota_bin" : false, 171 | "version" : "1.0.0" 172 | }, 173 | { 174 | "id" : "19", 175 | "name" : "Analog", 176 | "author" : "BenjaminGabel", 177 | "screenshot" : "/img/watchfaces/19_Analog.png", 178 | "source" : "https://github.com/BenjaminGabel/AnalogWatchFace", 179 | "ota_bin" : false, 180 | "version" : "1.0.0" 181 | }, 182 | { 183 | "id" : "20", 184 | "name" : "Analog", 185 | "author" : "peerdavid", 186 | "screenshot" : "/img/watchfaces/20_Analog.png", 187 | "source" : "https://github.com/peerdavid/wos", 188 | "ota_bin" : false, 189 | "version" : "1.0.0" 190 | }, 191 | { 192 | "id" : "21", 193 | "name" : "Hobbit Time", 194 | "author" : "BraininaBowl", 195 | "screenshot" : "/img/watchfaces/21_Hobbit_Time.png", 196 | "source" : "https://github.com/BraininaBowl/Hobbit-Time-for-Watchy", 197 | "ota_bin" : false, 198 | "version" : "1.0.0" 199 | }, 200 | { 201 | "id" : "22", 202 | "name" : "BCD", 203 | "author" : "peerdavid", 204 | "screenshot" : "/img/watchfaces/22_BCD.png", 205 | "source" : "https://github.com/peerdavid/wos", 206 | "ota_bin" : false, 207 | "version" : "1.0.0" 208 | }, 209 | { 210 | "id" : "23", 211 | "name" : "Line", 212 | "author" : "mistablinky", 213 | "screenshot" : "/img/watchfaces/23_Line.gif", 214 | "source" : "https://github.com/mistablinky/Line-for-Watchy", 215 | "ota_bin" : false, 216 | "version" : "1.0.0" 217 | }, 218 | { 219 | "id" : "24", 220 | "name" : "Mickey", 221 | "author" : "spinal", 222 | "screenshot" : "/img/watchfaces/24_Mickey.png", 223 | "source" : "https://github.com/spinalcode/Mickey", 224 | "ota_bin" : false, 225 | "version" : "1.0.0" 226 | }, 227 | { 228 | "id" : "25", 229 | "name" : "LCARS", 230 | "author" : "peerdavid", 231 | "screenshot" : "/img/watchfaces/25_LCARS.png", 232 | "source" : "https://github.com/peerdavid/wos", 233 | "ota_bin" : false, 234 | "version" : "1.0.0" 235 | }, 236 | { 237 | "id" : "26", 238 | "name" : "Big Time", 239 | "author" : "BraininaBowl", 240 | "screenshot" : "/img/watchfaces/26_BigTime.png", 241 | "source" : "https://github.com/BraininaBowl/Big-Time-for-Watchy", 242 | "ota_bin" : false, 243 | "version" : "1.0.0" 244 | }, 245 | { 246 | "id" : "27", 247 | "name" : "Poe", 248 | "author" : "BraininaBowl", 249 | "screenshot" : "/img/watchfaces/27_Poe.png", 250 | "source" : "https://github.com/BraininaBowl/Poe-for-Watchy", 251 | "ota_bin" : false, 252 | "version" : "1.0.0" 253 | }, 254 | { 255 | "id" : "28", 256 | "name" : "Kitty", 257 | "author" : "MSGoodman", 258 | "screenshot" : "https://github.com/MSGoodman/Kitty-for-Watchy/raw/main/GhostKittyWatchFace.jpg", 259 | "source" : "https://github.com/MSGoodman/Kitty-for-Watchy", 260 | "ota_bin" : false, 261 | "version" : "1.0.0" 262 | }, 263 | { 264 | "id" : "29", 265 | "name" : "BotWatchy", 266 | "author" : "mehtmehtsen", 267 | "screenshot" : "https://github.com/mehtmehtsen/BotWatchy/raw/master/watchface.gif", 268 | "source" : "https://github.com/mehtmehtsen/BotWatchy", 269 | "ota_bin" : false, 270 | "version" : "1.0.0" 271 | }, 272 | { 273 | "id" : "30", 274 | "name" : "dkTime", 275 | "author" : "dezign999", 276 | "screenshot" : "/img/watchfaces/30_dkTime.gif", 277 | "source" : "https://github.com/dezign999/dkTime", 278 | "ota_bin" : false, 279 | "version" : "1.0.0" 280 | }, 281 | { 282 | "id" : "31", 283 | "name" : "Revolution", 284 | "author" : "jeandeaual", 285 | "screenshot" : "https://github.com/jeandeaual/Watchy-Revolution/raw/master/screenshots/watchfaces.gif", 286 | "source" : "https://github.com/jeandeaual/Watchy-Revolution", 287 | "ota_bin" : false, 288 | "version" : "1.0.0" 289 | }, 290 | { 291 | "id" : "32", 292 | "name" : "pxl999", 293 | "author" : "dezign999", 294 | "screenshot" : "https://github.com/dezign999/pxl999/blob/main/pxl999.gif?raw=true", 295 | "source" : "https://github.com/dezign999/pxl999", 296 | "ota_bin" : false, 297 | "version" : "1.0.0" 298 | }, 299 | { 300 | "id" : "33", 301 | "name" : "SmartWatchy", 302 | "author" : "c2c2", 303 | "screenshot" : "https://github.com/cbrookins/SmartWatch/blob/main/SmartWatch.gif?raw=true", 304 | "source" : "https://github.com/cbrookins/SmartWatch", 305 | "ota_bin" : false, 306 | "version" : "1.0.0" 307 | }, 308 | { 309 | "id" : "34", 310 | "name" : "X marks the spot", 311 | "author" : "cbrookins", 312 | "screenshot" : "https://raw.githubusercontent.com/cbrookins/x-marks-the-spot/main/x.gif", 313 | "source" : "https://github.com/cbrookins/x-marks-the-spot", 314 | "ota_bin" : false, 315 | "version" : "1.0.0" 316 | }, 317 | { 318 | "id" : "35", 319 | "name" : "QArtCode", 320 | "author" : "Tristan Roddis", 321 | "screenshot" : "https://github.com/CogappLabs/qartcode/blob/main/WatchFaces/QArtCode/broken.png?raw=true", 322 | "source" : "https://github.com/CogappLabs/qartcode/tree/main/WatchFaces/QArtCode", 323 | "ota_bin" : false, 324 | "version" : "1.0.0" 325 | }, 326 | { 327 | "id" : "36", 328 | "name" : "S2Analog", 329 | "author" : "Stuart Angel Clement", 330 | "screenshot" : "https://github.com/StuAngel/s2Analog/blob/main/s2a.gif?raw=true", 331 | "source" : "https://github.com/StuAngel/s2Analog", 332 | "ota_bin" : false, 333 | "version" : "1.0.1" 334 | }, 335 | { 336 | "id" : "37", 337 | "name" : "Exactly-Words", 338 | "author" : "Brendan M. Sleight", 339 | "screenshot" : "https://raw.githubusercontent.com/bmsleight/Exactly-Words/main/screenshots/watchfaces.gif", 340 | "source" : "https://github.com/bmsleight/Exactly-Words", 341 | "ota_bin" : false, 342 | "version" : "eecb880" 343 | }, 344 | { 345 | "id" : "38", 346 | "name" : "beastie", 347 | "author" : "charlesrocket", 348 | "screenshot" : "https://raw.githubusercontent.com/charlesrocket/beastie/master/doc/screenshot.gif", 349 | "source" : "https://github.com/charlesrocket/beastie", 350 | "ota_bin" : false, 351 | "version" : "1.0.0" 352 | }, 353 | { 354 | "id" : "39", 355 | "name" : "Skully", 356 | "author" : "charlesrocket", 357 | "screenshot" : "https://raw.githubusercontent.com/charlesrocket/skully/master/doc/screenshot.gif", 358 | "source" : "https://github.com/charlesrocket/skully", 359 | "ota_bin" : false, 360 | "version" : "1.0.0" 361 | }, 362 | { 363 | "id" : "40", 364 | "name" : "SW_Watchy", 365 | "author" : "anycam", 366 | "screenshot" : "https://github.com/anycam/SW_WatchyFace/raw/main/Images/Animated.gif", 367 | "source" : "https://github.com/anycam/SW_WatchyFace", 368 | "ota_bin" : false, 369 | "version" : "1.0.0" 370 | }, 371 | { 372 | "id" : "41", 373 | "name" : "Chronometer", 374 | "author" : "t26y", 375 | "screenshot" : "https://raw.githubusercontent.com/t26y/Watchy-Screen-Chronometer/master/design/preview.bmp", 376 | "source" : "https://github.com/t26y/Watchy-Screen-Chronometer", 377 | "ota_bin" : false, 378 | "version" : "1.0.0" 379 | }, 380 | { 381 | "id" : "42", 382 | "name" : "Watchy PowerShell", 383 | "author" : "Lee Holmes", 384 | "screenshot" : "https://github.com/LeeHolmes/watchy_powershell/blob/main/example.gif?raw=true", 385 | "source" : "https://github.com/LeeHolmes/watchy_powershell", 386 | "ota_bin" : false, 387 | "version" : "1.0.0" 388 | }, 389 | { 390 | "id" : "43", 391 | "name" : "Tetris 2.0", 392 | "author" : "Klemek", 393 | "screenshot" : "https://raw.githubusercontent.com/Klemek/watchy/master/watchfaces/tetris-2.0/preview.bmp?raw=true", 394 | "source" : "https://github.com/Klemek/watchy/tree/master/watchfaces/tetris-2.0", 395 | "ota_bin" : false, 396 | "version" : "1.0.0" 397 | }, 398 | { 399 | "id" : "44", 400 | "name" : "Pokemon 2.0", 401 | "author" : "Klemek", 402 | "screenshot" : "https://raw.githubusercontent.com/Klemek/watchy/master/watchfaces/pokemon-2.0/preview.bmp?raw=true", 403 | "source" : "https://github.com/Klemek/watchy/tree/master/watchfaces/pokemon-2.0", 404 | "ota_bin" : false, 405 | "version" : "1.0.0" 406 | }, 407 | { 408 | "id" : "45", 409 | "name" : "QLock", 410 | "author" : "vtu-dog", 411 | "screenshot" : "https://raw.githubusercontent.com/vtu-dog/qlock/master/images/face.bmp", 412 | "source" : "https://github.com/vtu-dog/qlock", 413 | "ota_bin" : false, 414 | "version" : "1.0.0" 415 | }, 416 | { 417 | "id" : "46", 418 | "name" : "Triangle", 419 | "author" : "Nosorożec Kaszle", 420 | "screenshot" : "https://raw.githubusercontent.com/My-Key/Triangle_Watchy/main/watchface.gif", 421 | "source" : "https://github.com/My-Key/Triangle_Watchy", 422 | "ota_bin" : false, 423 | "version" : "1.0.0" 424 | }, 425 | { 426 | "id" : "47", 427 | "name" : "Castle of Watchy", 428 | "author" : "Nosorożec Kaszle", 429 | "screenshot" : "https://raw.githubusercontent.com/My-Key/Castle_of_Watchy/main/Watchface.gif", 430 | "source" : "https://github.com/My-Key/Castle_of_Watchy", 431 | "ota_bin" : false, 432 | "version" : "1.0.0" 433 | }, 434 | { 435 | "id" : "48", 436 | "name" : "Kave Watchy", 437 | "author" : "Nosorożec Kaszle", 438 | "screenshot" : "https://raw.githubusercontent.com/My-Key/Kave_Watchy/main/Watchface.gif", 439 | "source" : "https://github.com/My-Key/Kave_Watchy", 440 | "ota_bin" : false, 441 | "version" : "1.0.0" 442 | }, 443 | { 444 | "id" : "49", 445 | "name" : "Slacker", 446 | "author" : "uCBill", 447 | "screenshot" : "https://raw.githubusercontent.com/uCBill/Slacker/main/Slacker.gif", 448 | "source" : "https://github.com/uCBill/Slacker", 449 | "ota_bin" : false, 450 | "version" : "1.0.0" 451 | }, 452 | { 453 | "id" : "50", 454 | "name" : "Sundial", 455 | "author" : "Nosorożec Kaszle", 456 | "screenshot" : "https://raw.githubusercontent.com/My-Key/WatchySundial/main/watchface.gif", 457 | "source" : "https://github.com/My-Key/WatchySundial", 458 | "ota_bin" : false, 459 | "version" : "1.0.0" 460 | }, 461 | { 462 | "id" : "51", 463 | "name" : "The Blob", 464 | "author" : "Nosorożec Kaszle", 465 | "screenshot" : "https://raw.githubusercontent.com/My-Key/TheBlob/main/watchface.gif", 466 | "source" : "https://github.com/My-Key/TheBlob", 467 | "ota_bin" : false, 468 | "version" : "1.0.0" 469 | }, 470 | { 471 | "id" : "52", 472 | "name" : "Watchy GSR", 473 | "author" : "GuruSR", 474 | "screenshot" : "https://github.com/GuruSR/Watchy_GSR/blob/main/Images/Watchy_GSR.gif?raw=true", 475 | "source" : "https://github.com/GuruSR/Watchy_GSR", 476 | "ota_bin" : false, 477 | "version" : "1.4.3" 478 | }, 479 | { 480 | "id" : "53", 481 | "name" : "Keen", 482 | "author" : "Synthead", 483 | "screenshot" : "https://raw.githubusercontent.com/synthead/watchy-keen/master/graphics/screenshots/all.gif", 484 | "source" : "https://github.com/synthead/watchy-keen", 485 | "ota_bin" : false, 486 | "version" : "1.0.0" 487 | }, 488 | { 489 | "id" : "54", 490 | "name" : "erika Type", 491 | "author" : "mrmcwethy", 492 | "screenshot" : "https://raw.githubusercontent.com/mrmcwethy/watchy_Erika_Type/main/images/erikaType.bmp", 493 | "source" : "https://github.com/mrmcwethy/watchy_Erika_Type", 494 | "ota_bin" : false, 495 | "version" : "1.4.3" 496 | }, 497 | { 498 | "id" : "55", 499 | "name" : "Shadow Clock", 500 | "author" : "Nosorożec Kaszle", 501 | "screenshot" : "https://raw.githubusercontent.com/My-Key/ShadowClock/main/watchface.gif", 502 | "source" : "https://github.com/My-Key/ShadowClock", 503 | "ota_bin" : false, 504 | "version" : "1.0.0" 505 | }, 506 | { 507 | "id" : "56", 508 | "name" : "Dali", 509 | "author" : "Nosorożec Kaszle", 510 | "screenshot" : "https://raw.githubusercontent.com/My-Key/Dali/main/watchface.gif", 511 | "source" : "https://github.com/My-Key/Dali", 512 | "ota_bin" : false, 513 | "version" : "1.0.0" 514 | }, 515 | { 516 | "id" : "57", 517 | "name" : "Brainwork", 518 | "author" : "Brain in a Bowl", 519 | "screenshot" : "https://github.com/BraininaBowl/Brainwork-for-Watchy/raw/main/Brainwork.gif", 520 | "source" : "https://github.com/BraininaBowl/Brainwork-for-Watchy", 521 | "ota_bin" : false, 522 | "version" : "1.0.0" 523 | }, 524 | { 525 | "id" : "58", 526 | "name" : "MetaBall", 527 | "author" : "Nosorożec Kaszle", 528 | "screenshot" : "https://raw.githubusercontent.com/My-Key/MetaBallWatchy/main/watchface.gif", 529 | "source" : "https://github.com/My-Key/MetaBallWatchy", 530 | "ota_bin" : false, 531 | "version" : "1.0.0" 532 | }, 533 | { 534 | "id" : "59", 535 | "name" : "Star Wars Aurebesh", 536 | "author" : "aminch", 537 | "screenshot" : "https://github.com/aminch/Star_Wars_Aurebesh/raw/main/star_wars_aurebesh.gif", 538 | "source" : "https://github.com/aminch/Star_Wars_Aurebesh", 539 | "ota_bin" : false, 540 | "version" : "1.0.0" 541 | }, 542 | { 543 | "id" : "60", 544 | "name" : "Shijian", 545 | "author" : "Remunerator", 546 | "screenshot" : "https://raw.githubusercontent.com/Remunerator/Watchy-Shijian/main/screenshot/Shijian.gif", 547 | "source" : "https://github.com/Remunerator/Watchy-Shijian", 548 | "ota_bin" : false, 549 | "version" : "1.0.0" 550 | }, 551 | { 552 | "id" : "61", 553 | "name" : "Spiral Watchy", 554 | "author" : "Nosorożec Kaszle", 555 | "screenshot" : "https://raw.githubusercontent.com/My-Key/SpiralWatchy/main/watchface.gif", 556 | "source" : "https://github.com/My-Key/SpiralWatchy", 557 | "ota_bin" : false, 558 | "version" : "1.0.0" 559 | }, 560 | { 561 | 562 | "id" : "62", 563 | "name" : "Last Laugh", 564 | "author" : "Vojtech Bizek", 565 | "screenshot" : "https://github.com/Vojtech-Bizek/Last-Laugh-Watchy-main/blob/main/Last-Laugh/Screenshot.gif?raw=true", 566 | "source" : "https://github.com/Vojtech-Bizek/Last-Laugh-Watchy-main.git", 567 | "ota_bin" : false, 568 | "version" : "1.0.0" 569 | }, 570 | { 571 | 572 | "id" : "63", 573 | "name" : "Captn Wednesday", 574 | "author" : "Bayport", 575 | "screenshot" : "https://raw.githubusercontent.com/b-bayport/watchy_captnwednesday/main/img/CaptnWednesday.png", 576 | "source" : "https://github.com/b-bayport/watchy_captnwednesday", 577 | "ota_bin" : false, 578 | "version" : "1.4.6" 579 | }, 580 | { 581 | 582 | "id" : "64", 583 | "name" : "Calculator Watchy", 584 | "author" : "Lazlow3", 585 | "screenshot" : "https://github.com/lazlow3/CalculatorWatchy/blob/main/img/CalculatorWatchy.gif?raw=true", 586 | "source" : "https://github.com/lazlow3/CalculatorWatchy", 587 | "ota_bin" : false, 588 | "version" : "1.4.6" 589 | }, 590 | { 591 | "id" : "65", 592 | "name" : "Watchy Akira", 593 | "author" : "Tito Botelho", 594 | "screenshot" : "https://github.com/TitoBotelho/WatchyAkira/blob/main/screenshot/WatchyAkira.gif?raw=true", 595 | "source" : "https://github.com/TitoBotelho/WatchyAkira", 596 | "ota_bin" : false, 597 | "version" : "1.0.0" 598 | }, 599 | { 600 | "id" : "66", 601 | "name" : "Pip-Boy", 602 | "author" : "SQFMI", 603 | "screenshot" : "https://github.com/sqfmi/watchy-pipboy/blob/main/screenshot.png?raw=true", 604 | "source" : "https://github.com/sqfmi/watchy-pipboy", 605 | "ota_bin" : false, 606 | "version" : "1.0.0" 607 | }, 608 | { 609 | "id" : "67", 610 | "name" : "Multi_face_Watchy", 611 | "author" : "uCBill", 612 | "screenshot" : "https://github.com/uCBill/Multi_face_Watchy/blob/main/Multi_face_Watchy.gif?raw=true", 613 | "source" : "https://github.com/uCBill/Multi_face_Watchy", 614 | "ota_bin" : false, 615 | "version" : "1.6.0" 616 | }, 617 | { 618 | "id" : "68", 619 | "name" : "Calendar WatchFace", 620 | "author" : "uCBill", 621 | "screenshot" : "https://github.com/uCBill/Calendar_watchy/blob/main/calendar.gif?raw=true", 622 | "source" : "https://github.com/uCBill/Calendar_watchy", 623 | "ota_bin" : false, 624 | "version" : "1.0.0" 625 | }, 626 | { 627 | "id" : "69", 628 | "name" : "QR Watchface", 629 | "author" : "Cqoicebordel", 630 | "screenshot" : "https://raw.githubusercontent.com/Cqoicebordel/Watchfaces/main/QR_Watchface/qr_watchface_screen.png", 631 | "source" : "https://github.com/Cqoicebordel/Watchfaces/tree/main/QR_Watchface", 632 | "ota_bin" : false, 633 | "version" : "1.0.0" 634 | }, 635 | { 636 | "id" : "70", 637 | "name" : "Orbital", 638 | "author" : "Cqoicebordel & Sudrien", 639 | "screenshot" : "https://raw.githubusercontent.com/Cqoicebordel/Watchfaces/main/Orbital/anim.gif", 640 | "source" : "https://github.com/Cqoicebordel/Watchfaces/tree/main/Orbital", 641 | "ota_bin" : false, 642 | "version" : "1.0.0" 643 | }, 644 | { 645 | "id" : "71", 646 | "name" : "Squaro", 647 | "author" : "Cqoicebordel", 648 | "screenshot" : "https://raw.githubusercontent.com/Cqoicebordel/Watchfaces/main/Squaro/screenshot.png", 649 | "source" : "https://github.com/Cqoicebordel/Watchfaces/tree/main/Squaro", 650 | "ota_bin" : false, 651 | "version" : "1.0.0" 652 | }, 653 | { 654 | "id" : "72", 655 | "name" : "BinaryBlocks", 656 | "author" : "Cqoicebordel", 657 | "screenshot" : "https://raw.githubusercontent.com/Cqoicebordel/Watchfaces/main/BinaryBlocks/screen.gif", 658 | "source" : "https://github.com/Cqoicebordel/Watchfaces/tree/main/BinaryBlocks", 659 | "ota_bin" : false, 660 | "version" : "1.0.0" 661 | }, 662 | { 663 | "id" : "73", 664 | "name" : "Squarbital", 665 | "author" : "Cqoicebordel", 666 | "screenshot" : "https://raw.githubusercontent.com/Cqoicebordel/Watchfaces/main/Squarbital/screen.gif", 667 | "source" : "https://github.com/Cqoicebordel/Watchfaces/tree/main/Squarbital", 668 | "ota_bin" : false, 669 | "version" : "1.0.0" 670 | }, 671 | { 672 | "id" : "74", 673 | "name" : "WatchySevenSegment", 674 | "author" : "qcope", 675 | "screenshot" : "https://raw.githubusercontent.com/qcope/WatchySevenSegment/main/watchysevensegment_screen.png", 676 | "source" : "https://github.com/qcope/WatchySevenSegment/tree/main", 677 | "ota_bin" : false, 678 | "version" : "1.0.0" 679 | }, 680 | { 681 | "id" : "75", 682 | "name" : "Marquee", 683 | "author" : "SomethingWithComputers (Ron Talman)", 684 | "screenshot" : "https://raw.githubusercontent.com/SomethingWithComputers/marquee/main/marquee.gif", 685 | "source" : "https://github.com/SomethingWithComputers/marquee", 686 | "ota_bin" : false, 687 | "version" : "1.0.0" 688 | }, 689 | { 690 | "id" : "76", 691 | "name" : "Digdug Watch", 692 | "author" : "gooth9232", 693 | "screenshot" : "https://raw.githubusercontent.com/gooth9232/DigdugWatch/master/forPR.gif", 694 | "source" : "https://github.com/gooth9232/DigdugWatch/tree/master", 695 | "ota_bin" : false, 696 | "version" : "1.0.0" 697 | }, 698 | { 699 | "id" : "77", 700 | "name" : "Skykid Watch", 701 | "author" : "gooth9232", 702 | "screenshot" : "https://raw.githubusercontent.com/gooth9232/SkykidWatch/master/img/ForPR.gif", 703 | "source" : "https://github.com/gooth9232/SkykidWatch", 704 | "ota_bin" : false, 705 | "version" : "1.0.0" 706 | } 707 | ] 708 | -------------------------------------------------------------------------------- /static/.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/.nojekyll -------------------------------------------------------------------------------- /static/CNAME: -------------------------------------------------------------------------------- 1 | watchy.sqfmi.com -------------------------------------------------------------------------------- /static/img/OSHWA-Certification.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | US000936 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /static/img/Watchy_STEP_Render.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/Watchy_STEP_Render.png -------------------------------------------------------------------------------- /static/img/case_assem/watchy_case_assem_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/case_assem/watchy_case_assem_1.jpg -------------------------------------------------------------------------------- /static/img/case_assem/watchy_case_assem_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/case_assem/watchy_case_assem_2.jpg -------------------------------------------------------------------------------- /static/img/case_assem/watchy_case_assem_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/case_assem/watchy_case_assem_3.jpg -------------------------------------------------------------------------------- /static/img/case_assem/watchy_case_assem_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/case_assem/watchy_case_assem_4.jpg -------------------------------------------------------------------------------- /static/img/case_assem/watchy_case_assem_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/case_assem/watchy_case_assem_5.jpg -------------------------------------------------------------------------------- /static/img/case_assem/watchy_case_assem_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/case_assem/watchy_case_assem_6.jpg -------------------------------------------------------------------------------- /static/img/epaper.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/epaper.gif -------------------------------------------------------------------------------- /static/img/esp32.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/esp32.jpg -------------------------------------------------------------------------------- /static/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/favicon.ico -------------------------------------------------------------------------------- /static/img/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/img/opensource-label.svg: -------------------------------------------------------------------------------- 1 | 2 | image/svg+xmlOpen Source Licenses HardwareSoftwareDocumentationMITMITMIT 3 | -------------------------------------------------------------------------------- /static/img/oshw-logo.svg: -------------------------------------------------------------------------------- 1 | 2 | image/svg+xml 42 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /static/img/sqfmi_logo_32x32.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | sqfmi_logo_32x32 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /static/img/undraw_docusaurus_mountain.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | -------------------------------------------------------------------------------- /static/img/undraw_docusaurus_react.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | -------------------------------------------------------------------------------- /static/img/undraw_docusaurus_tree.svg: -------------------------------------------------------------------------------- 1 | docu_tree -------------------------------------------------------------------------------- /static/img/watchfaces/10_Calculateur.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchfaces/10_Calculateur.png -------------------------------------------------------------------------------- /static/img/watchfaces/11_Jarvis.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchfaces/11_Jarvis.gif -------------------------------------------------------------------------------- /static/img/watchfaces/12_BadForEye.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchfaces/12_BadForEye.png -------------------------------------------------------------------------------- /static/img/watchfaces/13_Maze.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchfaces/13_Maze.png -------------------------------------------------------------------------------- /static/img/watchfaces/14_BTTF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchfaces/14_BTTF.png -------------------------------------------------------------------------------- /static/img/watchfaces/15_Binary.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchfaces/15_Binary.png -------------------------------------------------------------------------------- /static/img/watchfaces/16_Stationary_Text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchfaces/16_Stationary_Text.png -------------------------------------------------------------------------------- /static/img/watchfaces/17_Steps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchfaces/17_Steps.png -------------------------------------------------------------------------------- /static/img/watchfaces/18_TypoStyle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchfaces/18_TypoStyle.png -------------------------------------------------------------------------------- /static/img/watchfaces/19_Analog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchfaces/19_Analog.png -------------------------------------------------------------------------------- /static/img/watchfaces/1_Basic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchfaces/1_Basic.png -------------------------------------------------------------------------------- /static/img/watchfaces/20_Analog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchfaces/20_Analog.png -------------------------------------------------------------------------------- /static/img/watchfaces/21_Hobbit_Time.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchfaces/21_Hobbit_Time.png -------------------------------------------------------------------------------- /static/img/watchfaces/22_BCD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchfaces/22_BCD.png -------------------------------------------------------------------------------- /static/img/watchfaces/23_Line.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchfaces/23_Line.gif -------------------------------------------------------------------------------- /static/img/watchfaces/24_Mickey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchfaces/24_Mickey.png -------------------------------------------------------------------------------- /static/img/watchfaces/25_LCARS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchfaces/25_LCARS.png -------------------------------------------------------------------------------- /static/img/watchfaces/26_BigTime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchfaces/26_BigTime.png -------------------------------------------------------------------------------- /static/img/watchfaces/27_Poe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchfaces/27_Poe.png -------------------------------------------------------------------------------- /static/img/watchfaces/28_Kitty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchfaces/28_Kitty.png -------------------------------------------------------------------------------- /static/img/watchfaces/2_7_SEG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchfaces/2_7_SEG.png -------------------------------------------------------------------------------- /static/img/watchfaces/2_7_SEG_Light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchfaces/2_7_SEG_Light.png -------------------------------------------------------------------------------- /static/img/watchfaces/30_dkTime.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchfaces/30_dkTime.gif -------------------------------------------------------------------------------- /static/img/watchfaces/3_DOS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchfaces/3_DOS.png -------------------------------------------------------------------------------- /static/img/watchfaces/4_Pokemon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchfaces/4_Pokemon.png -------------------------------------------------------------------------------- /static/img/watchfaces/5_StarryHorizon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchfaces/5_StarryHorizon.png -------------------------------------------------------------------------------- /static/img/watchfaces/6_Tetris.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchfaces/6_Tetris.png -------------------------------------------------------------------------------- /static/img/watchfaces/7_MacPaint.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchfaces/7_MacPaint.png -------------------------------------------------------------------------------- /static/img/watchfaces/8_Bahn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchfaces/8_Bahn.png -------------------------------------------------------------------------------- /static/img/watchfaces/9_Redub.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchfaces/9_Redub.png -------------------------------------------------------------------------------- /static/img/watchy-watchface.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchy-watchface.png -------------------------------------------------------------------------------- /static/img/watchy_assembly_steps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchy_assembly_steps.png -------------------------------------------------------------------------------- /static/img/watchy_buttons_map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchy_buttons_map.png -------------------------------------------------------------------------------- /static/img/watchy_case_contest_collage_IG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchy_case_contest_collage_IG.png -------------------------------------------------------------------------------- /static/img/watchy_case_gameboy_01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchy_case_gameboy_01.jpg -------------------------------------------------------------------------------- /static/img/watchy_contest_first_flippedchamfer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchy_contest_first_flippedchamfer.png -------------------------------------------------------------------------------- /static/img/watchy_contest_second_slim.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchy_contest_second_slim.png -------------------------------------------------------------------------------- /static/img/watchy_contest_third_peechy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchy_contest_third_peechy.png -------------------------------------------------------------------------------- /static/img/watchy_frame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchy_frame.png -------------------------------------------------------------------------------- /static/img/watchy_kit_instructions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchy_kit_instructions.png -------------------------------------------------------------------------------- /static/img/watchy_peechy_case_collage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchy_peechy_case_collage.png -------------------------------------------------------------------------------- /static/img/watchy_render.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchy_render.png -------------------------------------------------------------------------------- /static/img/watchy_screen_align.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchy_screen_align.png -------------------------------------------------------------------------------- /static/img/watchy_social_card.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchy_social_card.png -------------------------------------------------------------------------------- /static/img/watchy_watchface_weather.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/img/watchy_watchface_weather.gif -------------------------------------------------------------------------------- /static/pdf/BST-BMA423-DS000-1509600.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/pdf/BST-BMA423-DS000-1509600.pdf -------------------------------------------------------------------------------- /static/pdf/watchy_schematic.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sqfmi/watchy-docs/6623bd72be4ac6d8a50437a7d9dd055051fc98f4/static/pdf/watchy_schematic.pdf --------------------------------------------------------------------------------