Compare commits

...

4 commits
pages ... main

Author SHA1 Message Date
82518c0b6b
Feat: add nosleep
All checks were successful
/ build (push) Successful in 3m36s
2024-01-20 15:10:56 +01:00
7230eaca2b
Chore: lock to dark mode
All checks were successful
/ build (push) Successful in 3m56s
2024-01-20 11:32:39 +01:00
48fe73611d
Fix: properly wait for audio
All checks were successful
/ build (push) Successful in 3m40s
2024-01-20 11:16:01 +01:00
bc4a087614
Chore: add domain
All checks were successful
/ build (push) Successful in 3m22s
2024-01-20 10:55:16 +01:00
8 changed files with 50 additions and 9 deletions

View file

@ -10,7 +10,9 @@
#include "freertos/queue.h" #include "freertos/queue.h"
#include "esp_log.h" #include "esp_log.h"
#include "esp_timer.h" #include "esp_timer.h"
#include "esp_sleep.h"
#include "driver/gpio.h" #include "driver/gpio.h"
#include "driver/rtc_io.h"
#define TAG "main" #define TAG "main"
#define TRIGGER_PIN GPIO_NUM_12 #define TRIGGER_PIN GPIO_NUM_12
@ -82,6 +84,9 @@ void handleTrigger(void *)
void app_main() void app_main()
{ {
rtc_gpio_pullup_en(TRIGGER_PIN);
esp_sleep_enable_ext0_wakeup(TRIGGER_PIN, 0);
ESP_LOGI("main", "Starting BLE work!"); ESP_LOGI("main", "Starting BLE work!");
NimBLEDevice::init("Speed buzzer"); NimBLEDevice::init("Speed buzzer");
@ -124,11 +129,14 @@ void app_main()
for (;;) for (;;)
{ {
uint64_t currentTime; uint64_t currentTime;
if (xQueueReceive(triggerQueue, &currentTime, portMAX_DELAY) == pdTRUE) if (xQueueReceive(triggerQueue, &currentTime, 5 * 60 * 1000 / portTICK_PERIOD_MS) == pdTRUE)
{ {
bleLastTriggerTimeCharacteristic->setValue(currentTime); bleLastTriggerTimeCharacteristic->setValue(currentTime);
bleLastTriggerTimeCharacteristic->notify(); bleLastTriggerTimeCharacteristic->notify();
// ESP_LOGI(TAG, "Characteristic written!"); }
else if (bleServer->getConnectedCount() == 0)
{
esp_deep_sleep_start();
} }
} }
} }

17
package-lock.json generated
View file

@ -8,12 +8,14 @@
"name": "bluetooth-buzzer", "name": "bluetooth-buzzer",
"version": "0.0.1", "version": "0.0.1",
"dependencies": { "dependencies": {
"nosleep.js": "^0.12.0",
"ua-parser-js": "^1.0.37" "ua-parser-js": "^1.0.37"
}, },
"devDependencies": { "devDependencies": {
"@sveltejs/adapter-auto": "^2.0.0", "@sveltejs/adapter-auto": "^2.0.0",
"@sveltejs/adapter-static": "^2.0.3", "@sveltejs/adapter-static": "^2.0.3",
"@sveltejs/kit": "^1.27.4", "@sveltejs/kit": "^1.27.4",
"@types/nosleep.js": "^0.10.0",
"@types/ua-parser-js": "^0.7.39", "@types/ua-parser-js": "^0.7.39",
"@types/web-bluetooth": "^0.0.20", "@types/web-bluetooth": "^0.0.20",
"@typescript-eslint/eslint-plugin": "^6.0.0", "@typescript-eslint/eslint-plugin": "^6.0.0",
@ -766,6 +768,16 @@
"integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
"dev": true "dev": true
}, },
"node_modules/@types/nosleep.js": {
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/@types/nosleep.js/-/nosleep.js-0.10.0.tgz",
"integrity": "sha512-eFRD95pEYIPo7YZnRbasEJAwSzBOxkT9++vZ7ykoDDuxvBauSuEGKZsijLm2BzohGt5wIj8gSiI+9vwjKfmNgA==",
"deprecated": "This is a stub types definition. nosleep.js provides its own type definitions, so you do not need this installed.",
"dev": true,
"dependencies": {
"nosleep.js": "*"
}
},
"node_modules/@types/pug": { "node_modules/@types/pug": {
"version": "2.0.10", "version": "2.0.10",
"resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.10.tgz", "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.10.tgz",
@ -2592,6 +2604,11 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/nosleep.js": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/nosleep.js/-/nosleep.js-0.12.0.tgz",
"integrity": "sha512-9d1HbpKLh3sdWlhXMhU6MMH+wQzKkrgfRkYV0EBdvt99YJfj0ilCJrWRDYG2130Tm4GXbEoTCx5b34JSaP+HhA=="
},
"node_modules/object-assign": { "node_modules/object-assign": {
"version": "4.1.1", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",

View file

@ -15,6 +15,7 @@
"@sveltejs/adapter-auto": "^2.0.0", "@sveltejs/adapter-auto": "^2.0.0",
"@sveltejs/adapter-static": "^2.0.3", "@sveltejs/adapter-static": "^2.0.3",
"@sveltejs/kit": "^1.27.4", "@sveltejs/kit": "^1.27.4",
"@types/nosleep.js": "^0.10.0",
"@types/ua-parser-js": "^0.7.39", "@types/ua-parser-js": "^0.7.39",
"@types/web-bluetooth": "^0.0.20", "@types/web-bluetooth": "^0.0.20",
"@typescript-eslint/eslint-plugin": "^6.0.0", "@typescript-eslint/eslint-plugin": "^6.0.0",
@ -38,6 +39,7 @@
}, },
"type": "module", "type": "module",
"dependencies": { "dependencies": {
"nosleep.js": "^0.12.0",
"ua-parser-js": "^1.0.37" "ua-parser-js": "^1.0.37"
} }
} }

View file

@ -1,5 +1,5 @@
<!doctype html> <!doctype html>
<html lang="en"> <html lang="en" class="dark">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />

View file

@ -4,8 +4,10 @@
import { bluetoothState } from '../stores'; import { bluetoothState } from '../stores';
import { UAParser } from 'ua-parser-js'; import { UAParser } from 'ua-parser-js';
import Timer from './Timer.svelte'; import Timer from './Timer.svelte';
import NoSleep from 'nosleep.js';
const uap = new UAParser(); const uap = new UAParser();
const noSleep = new NoSleep();
let timer: Timer; let timer: Timer;
let state: 'idle' | 'wait' | 'ready' | 'running' = 'idle'; let state: 'idle' | 'wait' | 'ready' | 'running' = 'idle';
@ -15,12 +17,23 @@
}; };
const start = async () => { const start = async () => {
if (!noSleep.isEnabled) {
noSleep.enable();
}
state = 'wait'; state = 'wait';
await delay(3000); await delay(3000);
state = 'ready'; state = 'ready';
await new Audio('/sound/ok-ready-go.mp3').play(); const audio = new Audio('/sound/ok-ready-go.mp3');
await delay(2600); const audioDone = new Promise<void>((resolve) => {
timer.start(); audio.onended = () => {
resolve();
};
});
await audio.play();
await audioDone;
timer.start(200n);
state = 'running'; state = 'running';
}; };

View file

@ -3,8 +3,8 @@
import { buzzerState } from '../stores'; import { buzzerState } from '../stores';
import { Button } from 'flowbite-svelte'; import { Button } from 'flowbite-svelte';
export const start = () => { export const start = (offset: bigint = 0n) => {
timerStartedAt = BigInt(Math.floor(performance.now())); timerStartedAt = BigInt(Math.floor(performance.now())) - offset;
timerStoppedAt = undefined; timerStoppedAt = undefined;
}; };

1
static/.domains Normal file
View file

@ -0,0 +1 @@
bluetooth-buzzer.dorian.im

View file

@ -59,7 +59,7 @@ const config = {
], ],
plugins: [require('flowbite/plugin')], plugins: [require('flowbite/plugin')],
darkMode: 'media' darkMode: 'class'
}; };
module.exports = config; module.exports = config;