diff --git a/Blinker/LICENSE.md b/Blinker/LICENSE.md new file mode 100644 index 0000000..de9c6c7 --- /dev/null +++ b/Blinker/LICENSE.md @@ -0,0 +1,30 @@ + +Copyright (c) 2015, Majenko Technologies +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + +* Neither the name of Majenko Technologies nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + diff --git a/Blinker/README.md b/Blinker/README.md new file mode 100644 index 0000000..e071f3b --- /dev/null +++ b/Blinker/README.md @@ -0,0 +1,9 @@ +Blinker Library +=============== + +This very simple little library will cause an output +to "blink" - that is repeatedly go HIGH then LOW with a +requested delay. + +The operation is completely non-blocking, so you can +blink an output while doing other things. diff --git a/Blinker/examples/BlinkTest/BlinkTest.ino b/Blinker/examples/BlinkTest/BlinkTest.ino new file mode 100644 index 0000000..f81a5a1 --- /dev/null +++ b/Blinker/examples/BlinkTest/BlinkTest.ino @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2015, Majenko Technologies + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * * Neither the name of Majenko Technologies nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include + +// Most boards have an LED on pin 13. Let's blink it. +Blinker blinker(13); + +void setup() { + // The blinker defaults to 500ms delay, which is a 1 second period blinking. + // Let's make it faster - say 250ms delay. + blinker.setDelay(250); + + // There is also an asymetric blink delay version which takes two delay values, + // one for the ON time and one for the OFF time: + // blinker.setDelay(50, 950); + + // Start the blinker blinking. There's also a blinker.stop() function. + blinker.start(); +} + +void loop() { + // As long as you keep calling this method the output will toggle + // with the requested delay. It's non-blocking so you can do othe + // things while blinking. + blinker.blink(); +} diff --git a/Blinker/library.json b/Blinker/library.json new file mode 100644 index 0000000..aec0a0f --- /dev/null +++ b/Blinker/library.json @@ -0,0 +1,13 @@ +{ + "name": "Blinker", + "keywords": "led, blink", + "description": "Non-blocking LED blinking class", + "repository": + { + "type": "git", + "url": "https://github.com/MajenkoLibraries/Blinker" + }, + "version": "1.0.3", + "frameworks": "arduino", + "platforms": "*" +} diff --git a/Blinker/library.properties b/Blinker/library.properties new file mode 100644 index 0000000..4a789bc --- /dev/null +++ b/Blinker/library.properties @@ -0,0 +1,10 @@ +name=Blinker +version=1.0.4 +author=Matt Jenkins +maintainer=Matt Jenkins +sentence=Blink an output in different patterns +paragraph=Blinker Library\n===============\n\nThis very simple little library will cause an output\nto "blink" - that is repeatedly go HIGH then LOW with a \nrequested delay.\n\nThe operation is completely non-blocking, so you can\nblink an output while doing other things.\n +url=https://github.com/MajenkoLibraries/Blinker +category=Signal Input/Output +architectures=* +includes=Blinker.h diff --git a/Blinker/src/Blinker.cpp b/Blinker/src/Blinker.cpp new file mode 100644 index 0000000..5f1da87 --- /dev/null +++ b/Blinker/src/Blinker.cpp @@ -0,0 +1,44 @@ +#include + +Blinker::Blinker(int pin) { + _blinkPin = pin; + _highDelay = 500; + _lowDelay = 500; + _lastBlink = 0; + _blinkState = false; + _running = false; +} + +void Blinker::setDelay(uint32_t d) { + _highDelay = d; + _lowDelay = d; +} + +void Blinker::setDelay(uint32_t h, uint32_t l) { + _highDelay = h; + _lowDelay = l; +} + +void Blinker::blink() { + uint32_t diff = millis() - _lastBlink; + uint32_t blinkDelay = _blinkState ? _highDelay : _lowDelay; + if (diff >= blinkDelay) { + _lastBlink = millis() - (diff - blinkDelay); // Account for any delay in calling blink + _blinkState = !_blinkState; + if (_running) { + digitalWrite(_blinkPin, _blinkState ? HIGH : LOW); + } + } +} + +void Blinker::start() { + pinMode(_blinkPin, OUTPUT); + _running = true; + _lastBlink = millis(); +} + +void Blinker::stop(bool idleState) { + _running = false; + _blinkState = idleState; + digitalWrite(_blinkPin, _blinkState); +} diff --git a/Blinker/src/Blinker.h b/Blinker/src/Blinker.h new file mode 100644 index 0000000..556b196 --- /dev/null +++ b/Blinker/src/Blinker.h @@ -0,0 +1,28 @@ +#ifndef _BLINKER_H +#define _BLINKER_H + +#if (ARDUINO >= 100) +# include +#else +# include +#endif + +class Blinker { + private: + int _blinkPin; + uint32_t _highDelay; + uint32_t _lowDelay; + uint32_t _lastBlink; + boolean _blinkState; + boolean _running; + + public: + Blinker(int pin); + void setDelay(uint32_t d); + void setDelay(uint32_t h, uint32_t l); + void blink(); + void start(); + void stop(bool idleState = LOW); +}; + +#endif diff --git a/Blinker/uecide.json b/Blinker/uecide.json new file mode 100644 index 0000000..bb2818d --- /dev/null +++ b/Blinker/uecide.json @@ -0,0 +1 @@ +{"name":"Blinker","provides":"Blinker.h","license":"LICENSE.md","readme":"README.md","description":"Blink an output in different patterns","category":"IO","subcategory":"Digital","maintainer":"Matt Jenkins ","version":"1.0.4","family":"all","core":"all","install":{"examples":"\/","library.properties":"\/","src":"\/"}} \ No newline at end of file diff --git a/Digispark_Passkey.ino b/Digispark_Passkey.ino new file mode 100644 index 0000000..19fb490 --- /dev/null +++ b/Digispark_Passkey.ino @@ -0,0 +1,109 @@ +// Passkey for Arduino using the Digispark Rev.3 board. +// Copyright 2022 by Johannes Findeisen +// Licensed under the terms of the MIT license. + +// For using the Blinker library you have to install it from: +// https://github.com/MajenkoLibraries/Blinker +// Since the code is included in Passkey you easily can just copy +// Blinker/src/Blinker.cpp and Blinker/src/Blinker.h to the root of +// Passkey. +#include "Blinker.h" +#include "DigiKeyboard.h" + +// The button pin +#define BUTTON_PIN 0 +// The LED pin +#define LED_PIN 1 +// The pause after last button press before executing a command +#define PAUSE 2000 + +// Local variables +unsigned long last; +unsigned int count; + +// Create blinker object +Blinker blinker(LED_PIN); + +// The list of available passwords +// The number and overall lenght of passwords depends +// because the memory of the digispark is very limited... +// I recommend to use a prefix you easily can remember +// for the password/passwords to make the passwords +// on the passkey unusable for others in case you've lost +// your passkey. E.g.: WhatAWonderfulWorld -> then press the button. +const char *passwords[] = { + // passwords[0] + "n0Emb871NAQPSIqBoldh8R7UDaNhncF7Pt60Amdo6GWdTdAPwVBi2A3KU8x8DTCRo6GWdTdXNn2wLh3SUbxVWQvFDVPtatDg", + // passwords[1] + "oaxt6e3lSgflOuJ3C6Q6sUb5gvmvI5IEPFku5fqcbxJljBOUblHIT121wCu", + // passwords[2] + "jUgKGBtiJ0iNN1Ok9vejrXNn2wLh3SUbxVWQvFDVPtat0OxJlKU8x8DTCRo6GWdTdAPwVBi2A3KUrTKQwjUgK", + // passwords[3] + "G57dFnXsPUnRq1eC1CjrGxpCjuiJFlDti54W6wBS9Ro6GWdTdAPwVBi2A3KU8x8KGBtiJ0iNN1Ok9vejrXNn2wLhH" +}; + +void setup() { + // Set button pin to high. + pinMode(BUTTON_PIN, INPUT); + // Set BUTTON_PIN pin to high because the button is connected + // to GND when pressed and will go LOW + digitalWrite(BUTTON_PIN, HIGH); + + // Set blink effect (ON, OFF) in milliseconds + blinker.setDelay(25, 9075); + blinker.start(); + + // Initialize HID + DigiKeyboard.delay(0); + DigiKeyboard.sendKeyStroke(0); + + // Light up the LED for a second to show that passkey is ready + pinMode(LED_PIN, OUTPUT); + digitalWrite(LED_PIN, HIGH); + delay(1000); + digitalWrite(LED_PIN, LOW); +} + +void loop() { + // Start LED blink effect + blinker.blink(); + + // Read button state + if (digitalRead(BUTTON_PIN) == LOW) { + // Button is pressed + count++; + digitalWrite(LED_PIN, HIGH); + // Wait until button is released + while (digitalRead(BUTTON_PIN) == LOW) { + delay(1); + } + // Set the last press timestamp + last = millis(); + digitalWrite(LED_PIN, LOW); + } + + // Wait PAUSE time before executing a command + if (count > 0 && (millis() - last) >= PAUSE) { + // The switch case is the number of button presses + switch (count) { + case 1: + DigiKeyboard.println(passwords[0]); + break; + case 2: + DigiKeyboard.println(passwords[1]); + break; + case 3: + DigiKeyboard.println(passwords[2]); + break; + case 5: + // You can use print instead of println if you don't want + // to hit enter automatically after inserting the password + DigiKeyboard.print(passwords[3]); + break; + default: + break; + } + // Reset the counter + count = 0; + } +} diff --git a/Digispark_Passkey3.ino b/Digispark_Passkey3.ino new file mode 100644 index 0000000..0b2cd2e --- /dev/null +++ b/Digispark_Passkey3.ino @@ -0,0 +1,109 @@ +// Passkey for Arduino using the Digispark Rev.3 board. +// Copyright 2022 by Johannes Findeisen +// Licensed under the terms of the MIT license. + +// For using the Blinker library you have to install it from: +// https://github.com/MajenkoLibraries/Blinker +// Since the code is included in Passkey you easily can just copy +// Blinker/src/Blinker.cpp and Blinker/src/Blinker.h to the root of +// Passkey. +#include "Blinker.h" +#include "DigiKeyboard.h" + +// The button pin +#define BUTTON_PIN 0 +// The LED pin +#define LED_PIN 1 +// The pause after last button press before executing a command +#define PAUSE 2000 + +// Local variables +unsigned long last; +unsigned int count; + +// Create blinker object +Blinker blinker(LED_PIN); + +// The list of available passwords +// The number and overall lenght of passwords depends +// because the memory of the digispark is very limited... +// I recommend to use a prefix you easily can remember +// for the password/passwords to make the passwords +// on the passkey unusable for others in case you've lost +// your passkey. E.g.: WhatAWonderfulWorld -> then press the button. +const char *passwords[] = { + // passwords[0] + "n0Emb871NAQPSIqBoldh8R7UDaNhncF7Pt60Amdo6GWdTdAPwVBi2A3KU8x8DTCRo6GWdTdXNn2wLh3SUbxVWQvFDVPtatDg", + // passwords[1] + "oaxt6e3lSgflOuJ3C6Q6sUb5gvmvI5IEPFku5fqcbxJljBOUblHIT121wCu", + // passwords[2] + "jUgKGBtiJ0iNN1Ok9vejrXNn2wLh3SUbxVWQvFDVPtat0OxJlKU8x8DTCRo6GWdTdAPwVBi2A3KUrTKQwjUgK", + // passwords[3] + "G57dFnXsPUnRq1eC1CjrGxpCjuiJFlDti54W6wBS9Ro6GWdTdAPwVBi2A3KU8x8KGBtiJ0iNN1Ok9vejrXNn2wLhH" +}; + +void setup() { + // Set button pin to be INPUT. + pinMode(BUTTON_PIN, INPUT); + // Set BUTTON_PIN pin to HIGH because the button is connected + // to GND when pressed and will go LOW + digitalWrite(BUTTON_PIN, HIGH); + + // Set blink effect (ON, OFF) in milliseconds + blinker.setDelay(25, 9075); + blinker.start(); + + // Initialize HID + DigiKeyboard.delay(0); + DigiKeyboard.sendKeyStroke(0); + + // Light up the LED for a second to show that passkey is ready + pinMode(LED_PIN, OUTPUT); + digitalWrite(LED_PIN, HIGH); + delay(1000); + digitalWrite(LED_PIN, LOW); +} + +void loop() { + // Start LED blink effect + blinker.blink(); + + // Read button state + if (digitalRead(BUTTON_PIN) == LOW) { + // Button is pressed + count++; + digitalWrite(LED_PIN, HIGH); + // Wait until button is released + while (digitalRead(BUTTON_PIN) == LOW) { + delay(1); + } + // Set the last press timestamp + last = millis(); + digitalWrite(LED_PIN, LOW); + } + + // Wait PAUSE time before executing a command + if (count > 0 && (millis() - last) >= PAUSE) { + // The switch case is the number of button presses + switch (count) { + case 1: + DigiKeyboard.println(passwords[0]); + break; + case 2: + DigiKeyboard.println(passwords[1]); + break; + case 3: + DigiKeyboard.println(passwords[2]); + break; + case 5: + // You can use print instead of println if you don't want + // to hit enter automatically after inserting the password + DigiKeyboard.print(passwords[3]); + break; + default: + break; + } + // Reset the counter + count = 0; + } +}