Compare commits
7 Commits
cec6bd2c0b
...
577ba83a58
Author | SHA1 | Date | |
---|---|---|---|
577ba83a58 | |||
87b3bf280f | |||
c6ff3c4923 | |||
4276e9a9cf | |||
f369f88899 | |||
b92eb13f76 | |||
c3bca0eba6 |
@ -3,11 +3,12 @@
|
|||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
|
|
||||||
#define ADC_CHANNEL 0
|
#define ADC_CHANNEL 0
|
||||||
#define PORT_ADCC(t) t##D
|
#define PORT_ADCC(t) t##C
|
||||||
#define PIN_ADCC (1 << 1)
|
#define PIN_ADCC (1 << 1)
|
||||||
|
|
||||||
#define BAT_THRES_POWER_ON 60 // TODO: Minimum ADC value to allow turning the device on
|
// Nominal 3.7V: 195; Full 4.2V: 220
|
||||||
#define BAT_THRES_POWER_OFF 50 // TODO: ADC value to (hard) power off the device.
|
#define BAT_THRES_POWER_ON 175 // TODO: Minimum ADC value to allow turning the device on (3.3V)
|
||||||
|
#define BAT_THRES_POWER_OFF 165 // TODO: ADC value to (hard) power off the device. (3.1V)
|
||||||
|
|
||||||
void batmon_init();
|
void batmon_init();
|
||||||
uint8_t batmon_get_voltage();
|
uint8_t batmon_get_voltage();
|
||||||
|
@ -2,16 +2,15 @@
|
|||||||
#define INPUT_H
|
#define INPUT_H
|
||||||
|
|
||||||
#define PORT_KEYPAD(t) t##D // Keys connected to: 0,1,2(INT0->POWER),5,6,7
|
#define PORT_KEYPAD(t) t##D // Keys connected to: 0,1,2(INT0->POWER),5,6,7
|
||||||
#define PIN_KEYPAD_MASK 0b11100111
|
#define PIN_KEYPAD_MASK 0b11111111
|
||||||
#define PORT_KEYAUX(t) t##B
|
#define PORT_KEYAUX(t) t##B
|
||||||
#define PIN_ROTARY_PUSH (1 << 0)
|
|
||||||
|
|
||||||
#define PORT_SBCMON(t) t##C
|
#define PORT_SBCMON(t) t##C
|
||||||
#define PIN_SBCMON (1 << 1)
|
#define PIN_SBCMON (1 << 1)
|
||||||
|
|
||||||
#define PORT_ROTARY(t) t##D
|
#define PORT_ROTARY(t) t##B
|
||||||
#define PIN_ROTARY_A (1 << 3) // INT1
|
#define PIN_ROTARY_A (1 << 0)
|
||||||
#define PIN_ROTARY_B (1 << 4)
|
#define PIN_ROTARY_B (1 << 1)
|
||||||
|
|
||||||
void input_init();
|
void input_init();
|
||||||
void input_proc();
|
void input_proc();
|
||||||
|
@ -47,7 +47,9 @@ uint8_t spi_proc()
|
|||||||
x++;
|
x++;
|
||||||
if (x == DISPLAY_WIDTH) {
|
if (x == DISPLAY_WIDTH) {
|
||||||
x = 0;
|
x = 0;
|
||||||
|
y = Y_MAX;
|
||||||
new_data = 1; // Only update the display if a full frame was received
|
new_data = 1; // Only update the display if a full frame was received
|
||||||
|
lcd_display();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
y--;
|
y--;
|
||||||
@ -55,7 +57,6 @@ uint8_t spi_proc()
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (new_data) {
|
if (new_data) {
|
||||||
lcd_display();
|
|
||||||
new_data = 0;
|
new_data = 0;
|
||||||
} else if ((y == Y_MAX - 3) && (x == 0)) { // If the last one was a I/O frame
|
} else if ((y == Y_MAX - 3) && (x == 0)) { // If the last one was a I/O frame
|
||||||
input_clear_events();
|
input_clear_events();
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
#define PM_H
|
#define PM_H
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
|
|
||||||
#define PORT_SBCPOW(t) t##C
|
#define PORT_SBCPOW(t) t##B
|
||||||
#define PIN_SBCPOW (1 << 2)
|
#define PIN_SBCPOW (1 << 7)
|
||||||
|
|
||||||
void pm_init();
|
void pm_init();
|
||||||
void suspend();
|
void suspend();
|
||||||
|
@ -5,9 +5,9 @@ import asyncio
|
|||||||
from mpd import MPDClient
|
from mpd import MPDClient
|
||||||
import spidev
|
import spidev
|
||||||
|
|
||||||
IO_DELAY = (1.0 / 25.0)
|
IO_DELAY = (1.0 / 18.0)
|
||||||
MPD_DELAY = 0.5
|
MPD_DELAY = 0.5
|
||||||
SPI_SPEED = 600000
|
SPI_SPEED = 500000
|
||||||
|
|
||||||
class display(object):
|
class display(object):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@ -129,14 +129,41 @@ class display_manager(object):
|
|||||||
# TODO: Consider also animating inactive screens... Might resolve some glitches when updating text while a screen is in the background (or pass `tick` to update funcs)
|
# TODO: Consider also animating inactive screens... Might resolve some glitches when updating text while a screen is in the background (or pass `tick` to update funcs)
|
||||||
|
|
||||||
class radioserv:
|
class radioserv:
|
||||||
|
def handle_rx(self, rdata):
|
||||||
|
# Handle key presses
|
||||||
|
key_id = rdata[0] & 0x0F
|
||||||
|
key_press_short = ((rdata[0] & 0xC0) == 128)
|
||||||
|
if (key_press_short):
|
||||||
|
print("Press key: {}".format(key_id))
|
||||||
|
if (key_id == 0): # Tune-
|
||||||
|
pass
|
||||||
|
elif (key_id == 1): # Tune+
|
||||||
|
self.mpd.previous()
|
||||||
|
elif (key_id == 2): # Power
|
||||||
|
self.kill_event.set()
|
||||||
|
elif (key_id == 4): # Wheel
|
||||||
|
self.mpd.pause()
|
||||||
|
elif (key_id == 5): # Source
|
||||||
|
pass
|
||||||
|
elif (key_id == 6): # Info / Menu
|
||||||
|
self.mpd.next()
|
||||||
|
elif (key_id == 7): # PRESET
|
||||||
|
pass
|
||||||
|
# Handle rotary input
|
||||||
|
rotary_delta = int(rdata[1])# - 128
|
||||||
|
if (rotary_delta > 0):
|
||||||
|
print("Rotary: {}".format(rdata[2]))
|
||||||
|
# self.mpd.volume(rotary_delta)
|
||||||
|
#print("Battery: {}".format(rdata[2]))
|
||||||
|
|
||||||
async def io_main(self):
|
async def io_main(self):
|
||||||
while True:
|
while True:
|
||||||
self.disp_mgr.animate(1)
|
self.disp_mgr.animate(1)
|
||||||
self.disp_mgr.render()
|
self.disp_mgr.render()
|
||||||
rdata = self.spi.xfer([100, 101, 102, 103], 100000, 1)
|
rdata = self.spi.xfer([100, 101, 102], 50000, 1000)
|
||||||
print(rdata)
|
self.handle_rx(rdata)
|
||||||
data = list(self.disp_mgr.get_image())
|
data = list(self.disp_mgr.get_image())
|
||||||
rdata = self.spi.xfer(data, SPI_SPEED, 1)
|
rdata = self.spi.xfer(data, SPI_SPEED, 10000)
|
||||||
await self.io_event.wait()
|
await self.io_event.wait()
|
||||||
self.io_event.clear()
|
self.io_event.clear()
|
||||||
|
|
||||||
@ -203,7 +230,7 @@ class radioserv:
|
|||||||
|
|
||||||
# Connect to MPD
|
# Connect to MPD
|
||||||
self.mpd = MPDClient()
|
self.mpd = MPDClient()
|
||||||
self.mpd.connect("yuki", 6600)
|
self.mpd.connect("localhost", 6600)
|
||||||
|
|
||||||
# Set up displays
|
# Set up displays
|
||||||
self.disp_playback = display_playback()
|
self.disp_playback = display_playback()
|
||||||
@ -214,13 +241,14 @@ class radioserv:
|
|||||||
|
|
||||||
# Create main tasks
|
# Create main tasks
|
||||||
self.io_event = asyncio.Event()
|
self.io_event = asyncio.Event()
|
||||||
|
self.kill_event = asyncio.Event()
|
||||||
|
|
||||||
io_task = asyncio.create_task(self.io_main())
|
io_task = asyncio.create_task(self.io_main())
|
||||||
io_timer_task = asyncio.create_task(self.io_timer_main())
|
io_timer_task = asyncio.create_task(self.io_timer_main())
|
||||||
mpd_task = asyncio.create_task(self.mpd_main())
|
mpd_task = asyncio.create_task(self.mpd_main())
|
||||||
|
|
||||||
# TODO: Wait for exit condition (shutdown command)
|
await self.kill_event.wait()
|
||||||
await asyncio.sleep(6000)
|
self.kill_event.clear()
|
||||||
|
|
||||||
io_timer_task.cancel()
|
io_timer_task.cancel()
|
||||||
io_task.cancel()
|
io_task.cancel()
|
||||||
|
Loading…
Reference in New Issue
Block a user