1
Fork 0
mirror of https://github.com/RGBCube/GDUS synced 2025-07-28 05:27:45 +00:00

Multiple LEDs

This commit is contained in:
RGBCube 2023-12-22 14:57:28 +03:00
parent eb584e3bf1
commit bb4131b5be
No known key found for this signature in database
4 changed files with 38 additions and 28 deletions

View file

@ -3,23 +3,29 @@ import os
from fastapi import FastAPI
import RPi.GPIO as gpio
LED_PIN = 17
led_state = False
leds = [
(),
(17, True),
(18, True),
(19, True),
]
gpio.setmode(gpio.BCM)
gpio.setup(LED_PIN, gpio.OUT)
gpio.output(LED_PIN, int(led_state))
for led in leds:
gpio.setmode(gpio.BCM)
gpio.setup(led[0], gpio.OUT)
gpio.output(LED_PIN, int(led[1]))
app = FastAPI()
@app.get("/led/toggle")
async def toggle() -> str:
global led_state
led_state = not led_state
gpio.output(LED_PIN, int(led_state))
async def toggle(number: int) -> str:
global leds
led = leds[number]
leds[number] = (led[0], not led[1])
return f"TOGGLE OK, NEW STATE: {'ON' if not led_state else 'OFF'}"
gpio.output(led[0], int(led[1]))
return f"TOGGLE OK, NEW STATE: {'ON' if led[1] else 'OFF'}"
@app.get("/speak")
async def speak(text: str) -> str:

View file

@ -24,7 +24,8 @@ async fn main() -> io::Result<()> {
r"
CREATE TABLE IF NOT EXISTS reminders (
date DATETIME NOT NULL,
message TEXT NOT NULL
message TEXT NOT NULL,
led TINYINT NOT NULL
)
",
)

View file

@ -16,6 +16,7 @@ use sqlx::SqlitePool;
pub struct Reminder {
date: String,
message: String,
led: String,
}
#[web::get("/submit-form")]
@ -30,13 +31,14 @@ async fn submit_form(
sqlx::query(
r"
INSERT INTO
reminders (date, message)
reminders (date, message, led)
VALUES
(?, ?)
(?, ?, ?)
",
)
.bind(date_time)
.bind(reminder.message)
.bind(reminder.led.parse::<u8>().unwrap_or(0))
.execute(&**data)
.await
.expect("Failed to save reminder.");
@ -134,6 +136,9 @@ async fn submit() -> web::Result<Markup> {
br;
label for="message" { "Mesaj:" }
input id="message" name="message";
br;
label for="led" { "Yakılacal LED (yakmamak için boş bırakın):" }
input id="led" name="led";
}
})
}

View file

@ -15,10 +15,10 @@ use sqlx::SqlitePool;
#[web::get("/view")]
async fn view(data: Data<SqlitePool>) -> web::Result<Markup> {
let reminders = sqlx::query_as::<_, (NaiveDateTime, String)>(
let reminders = sqlx::query_as::<_, (NaiveDateTime, String, i8)>(
r#"
SELECT
date, message
date, message, led
FROM
reminders
WHERE
@ -32,14 +32,15 @@ async fn view(data: Data<SqlitePool>) -> web::Result<Markup> {
println!("{reminders:?}");
let formatted_reminders: Vec<(i64, String, String)> = reminders
let formatted_reminders: Vec<(i64, String, String, i8)> = reminders
.into_iter()
.map(|(date_time, message)| {
.map(|(date_time, message, led)| {
let local_time = Local.from_local_datetime(&date_time).unwrap();
(
local_time.timestamp() as i64,
local_time.format("%Y/%m/%d %H:%M").to_string(),
message,
led,
)
})
.collect();
@ -81,8 +82,7 @@ async fn view(data: Data<SqlitePool>) -> web::Result<Markup> {
ul id="reminders" {
@for reminder in formatted_reminders {
li {
p class="timestamp" data-timestamp=(reminder.0) style="display: none;" {}
li data-timestamp=(reminder.0) data-led=(reminder.3) {
h3 { (reminder.1) }
p { (reminder.2) }
}
@ -93,14 +93,12 @@ async fn view(data: Data<SqlitePool>) -> web::Result<Markup> {
const alertIfTime = () => {
const reminders = Array.from(
document
.querySelectorAll("#reminders .timestamp")
.querySelectorAll("li")
)
.map(timestampItem => ({
content: timestampItem
.parentNode
.querySelector("p:not(.timestamp)")
.textContent,
timestamp: +timestampItem.getAttribute("data-timestamp"),
.map(item => ({
content: item.querySelector("p").textContent,
timestamp: +item.getAttribute("data-timestamp"),
led: +item.getAttribute("data-led"),
}));
const currentTime = Math.floor(Date.now() / 1000);
@ -109,7 +107,7 @@ async fn view(data: Data<SqlitePool>) -> web::Result<Markup> {
const differenceSeconds = currentTime - reminder.timestamp;
if (differenceSeconds < 1 * 60) {
fetch("http://localhost:3000/toggle-led").then(console.log);
if (reminder.led != 0) fetch("http://localhost:3000/led/toggle?" + new URLSearchParams({ number: reminder.led }).then(console.log);
fetch("http://localhost:3000/speak?" + new URLSearchParams({ text: reminder.content })).then(console.log);
}
});