mirror of
https://github.com/RGBCube/GDUS
synced 2025-07-28 13:37:45 +00:00
Multiple LEDs
This commit is contained in:
parent
eb584e3bf1
commit
bb4131b5be
4 changed files with 38 additions and 28 deletions
26
rpid/main.py
26
rpid/main.py
|
@ -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),
|
||||
]
|
||||
|
||||
for led in leds:
|
||||
gpio.setmode(gpio.BCM)
|
||||
gpio.setup(LED_PIN, gpio.OUT)
|
||||
|
||||
gpio.output(LED_PIN, int(led_state))
|
||||
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:
|
||||
|
|
|
@ -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
|
||||
)
|
||||
",
|
||||
)
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
});
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue