diff --git a/rpid/main.py b/rpid/main.py index deef1ce..2f6fb36 100644 --- a/rpid/main.py +++ b/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), +] -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: diff --git a/server/src/main.rs b/server/src/main.rs index 5a01f5a..6faab32 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -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 ) ", ) diff --git a/server/src/submit.rs b/server/src/submit.rs index 8495c41..f0e6844 100644 --- a/server/src/submit.rs +++ b/server/src/submit.rs @@ -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::().unwrap_or(0)) .execute(&**data) .await .expect("Failed to save reminder."); @@ -134,6 +136,9 @@ async fn submit() -> web::Result { 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"; } }) } diff --git a/server/src/view.rs b/server/src/view.rs index 01c6719..500422f 100644 --- a/server/src/view.rs +++ b/server/src/view.rs @@ -15,10 +15,10 @@ use sqlx::SqlitePool; #[web::get("/view")] async fn view(data: Data) -> web::Result { - 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) -> web::Result { 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) -> web::Result { 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) -> web::Result { 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) -> web::Result { 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); } });