1
Fork 0
mirror of https://github.com/RGBCube/GDUS synced 2025-07-28 13:37: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 from fastapi import FastAPI
import RPi.GPIO as gpio import RPi.GPIO as gpio
LED_PIN = 17 leds = [
led_state = False (),
(17, True),
(18, True),
(19, True),
]
gpio.setmode(gpio.BCM) for led in leds:
gpio.setup(LED_PIN, gpio.OUT) gpio.setmode(gpio.BCM)
gpio.setup(led[0], gpio.OUT)
gpio.output(LED_PIN, int(led_state)) gpio.output(LED_PIN, int(led[1]))
app = FastAPI() app = FastAPI()
@app.get("/led/toggle") @app.get("/led/toggle")
async def toggle() -> str: async def toggle(number: int) -> str:
global led_state global leds
led_state = not led_state led = leds[number]
gpio.output(LED_PIN, int(led_state)) 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") @app.get("/speak")
async def speak(text: str) -> str: async def speak(text: str) -> str:

View file

@ -24,7 +24,8 @@ async fn main() -> io::Result<()> {
r" r"
CREATE TABLE IF NOT EXISTS reminders ( CREATE TABLE IF NOT EXISTS reminders (
date DATETIME NOT NULL, 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 { pub struct Reminder {
date: String, date: String,
message: String, message: String,
led: String,
} }
#[web::get("/submit-form")] #[web::get("/submit-form")]
@ -30,13 +31,14 @@ async fn submit_form(
sqlx::query( sqlx::query(
r" r"
INSERT INTO INSERT INTO
reminders (date, message) reminders (date, message, led)
VALUES VALUES
(?, ?) (?, ?, ?)
", ",
) )
.bind(date_time) .bind(date_time)
.bind(reminder.message) .bind(reminder.message)
.bind(reminder.led.parse::<u8>().unwrap_or(0))
.execute(&**data) .execute(&**data)
.await .await
.expect("Failed to save reminder."); .expect("Failed to save reminder.");
@ -134,6 +136,9 @@ async fn submit() -> web::Result<Markup> {
br; br;
label for="message" { "Mesaj:" } label for="message" { "Mesaj:" }
input id="message" name="message"; 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")] #[web::get("/view")]
async fn view(data: Data<SqlitePool>) -> web::Result<Markup> { 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#" r#"
SELECT SELECT
date, message date, message, led
FROM FROM
reminders reminders
WHERE WHERE
@ -32,14 +32,15 @@ async fn view(data: Data<SqlitePool>) -> web::Result<Markup> {
println!("{reminders:?}"); println!("{reminders:?}");
let formatted_reminders: Vec<(i64, String, String)> = reminders let formatted_reminders: Vec<(i64, String, String, i8)> = reminders
.into_iter() .into_iter()
.map(|(date_time, message)| { .map(|(date_time, message, led)| {
let local_time = Local.from_local_datetime(&date_time).unwrap(); let local_time = Local.from_local_datetime(&date_time).unwrap();
( (
local_time.timestamp() as i64, local_time.timestamp() as i64,
local_time.format("%Y/%m/%d %H:%M").to_string(), local_time.format("%Y/%m/%d %H:%M").to_string(),
message, message,
led,
) )
}) })
.collect(); .collect();
@ -81,8 +82,7 @@ async fn view(data: Data<SqlitePool>) -> web::Result<Markup> {
ul id="reminders" { ul id="reminders" {
@for reminder in formatted_reminders { @for reminder in formatted_reminders {
li { li data-timestamp=(reminder.0) data-led=(reminder.3) {
p class="timestamp" data-timestamp=(reminder.0) style="display: none;" {}
h3 { (reminder.1) } h3 { (reminder.1) }
p { (reminder.2) } p { (reminder.2) }
} }
@ -93,14 +93,12 @@ async fn view(data: Data<SqlitePool>) -> web::Result<Markup> {
const alertIfTime = () => { const alertIfTime = () => {
const reminders = Array.from( const reminders = Array.from(
document document
.querySelectorAll("#reminders .timestamp") .querySelectorAll("li")
) )
.map(timestampItem => ({ .map(item => ({
content: timestampItem content: item.querySelector("p").textContent,
.parentNode timestamp: +item.getAttribute("data-timestamp"),
.querySelector("p:not(.timestamp)") led: +item.getAttribute("data-led"),
.textContent,
timestamp: +timestampItem.getAttribute("data-timestamp"),
})); }));
const currentTime = Math.floor(Date.now() / 1000); 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; const differenceSeconds = currentTime - reminder.timestamp;
if (differenceSeconds < 1 * 60) { 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); fetch("http://localhost:3000/speak?" + new URLSearchParams({ text: reminder.content })).then(console.log);
} }
}); });