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
28
rpid/main.py
28
rpid/main.py
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
)
|
)
|
||||||
",
|
",
|
||||||
)
|
)
|
||||||
|
|
|
@ -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";
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue