This commit is contained in:
ParkerTenBroeck 2026-03-09 09:03:58 -04:00
parent b4841e6f40
commit e6c5947949
9 changed files with 156 additions and 63 deletions

View file

@ -46,10 +46,11 @@ struct ClientInput{
#[serde(rename_all = "snake_case")]
enum ServerMsg<'a> {
Log { stream: &'a str, line: &'a str },
/// bitfield of 32 leds
Led(u32),
/// bitfield of 4 hex displays, 7 segment with decimal
Hex(u32)
Seg0(u32),
Seg1(u32),
Seg2(u32),
Seg3(u32)
}
async fn ws_handler(socket: WebSocket) {
@ -93,14 +94,13 @@ async fn ws_handler(socket: WebSocket) {
Some(Ok(Message::Text(msg))) => {
let input = serde_json::from_str::<'_, ClientInput>(&msg)?;
use tokio::io::AsyncWriteExt;
process.stdin.write_all(format!("key={}\n", input.buttons).as_bytes()).await?;
process.stdin.write_all(format!("btn={}\n", input.buttons).as_bytes()).await?;
process.stdin.write_all(format!("sw={}\n", input.switch).as_bytes()).await?;
},
Some(Ok(_)) => {},
Some(Err(err)) => Err(err)?,
_ => break,
}
}
out = sout.next_line() => {
match out{
@ -121,10 +121,16 @@ async fn ws_handler(socket: WebSocket) {
err = serr.next_line() => {
match err{
Ok(Some(line)) => {
let msg = if let Some(repr) = line.strip_prefix("LED="){
let msg = if let Some(repr) = line.strip_prefix("led="){
ServerMsg::Led(repr.parse().unwrap_or(0))
}else if let Some(repr) = line.strip_prefix("HEX="){
ServerMsg::Hex(repr.parse().unwrap_or(0))
}else if let Some(repr) = line.strip_prefix("seg0="){
ServerMsg::Seg0(repr.parse().unwrap_or(0))
}else if let Some(repr) = line.strip_prefix("seg1="){
ServerMsg::Seg1(repr.parse().unwrap_or(0))
}else if let Some(repr) = line.strip_prefix("seg2="){
ServerMsg::Seg2(repr.parse().unwrap_or(0))
}else if let Some(repr) = line.strip_prefix("seg3="){
ServerMsg::Seg3(repr.parse().unwrap_or(0))
}else{
ServerMsg::Log {
stream: "stderr",
@ -139,6 +145,10 @@ async fn ws_handler(socket: WebSocket) {
}
}
}
_ = tokio::time::sleep(std::time::Duration::from_millis(30)) => {
use tokio::io::AsyncWriteExt;
process.stdin.write_all("\n".as_bytes()).await?;
}
}
}
Ok(())

View file

@ -11,7 +11,8 @@ pub struct Process{
pub async fn run(artifact_dir: &Path) -> Result<Process, Box<dyn std::error::Error + Send + Sync>>{
let mut cmd = Command::new("ghdl");
cmd.args(["-r", "--std=08", "tb", "--stop-delta=2147483647", "--unbuffered"]);
cmd.args(["-r", "--std=08", "tb", "--stop-delta=4294967296", "--unbuffered", "--"]);
cmd.args(std::env::args_os());
cmd.current_dir(artifact_dir);
cmd.kill_on_drop(true);

View file

@ -69,7 +69,7 @@ function clearLogs() {
function resetOutputsVisuals() {
// reset LED/HEX visuals to 0 immediately
setLeds(0);
setHex(0);
setSeg(0);
}
function u32BitGet(x, i) {
@ -196,7 +196,7 @@ function buildHex() {
}
}
function setHex(hexU32) {
function setSeg(hexU32, seg) {
const digits = parseHexDigits(hexU32 >>> 0);
for (let i = 0; i < 4; i++) {
@ -344,9 +344,27 @@ function connect() {
return;
}
if (parsed.hex !== undefined) {
const v = (parsed.hex ?? parsed.value ?? parsed[0] ?? parsed["0"] ?? 0) >>> 0;
setHex(v);
if (parsed.seg0 !== undefined) {
const v = (parsed.seg0 ?? parsed.value ?? parsed[0] ?? parsed["0"] ?? 0) >>> 0;
setSeg(v, 0);
return;
}
if (parsed.seg1 !== undefined) {
const v = (parsed.seg1 ?? parsed.value ?? parsed[0] ?? parsed["0"] ?? 0) >>> 0;
setSeg(v, 1);
return;
}
if (parsed.seg2 !== undefined) {
const v = (parsed.seg3 ?? parsed.value ?? parsed[0] ?? parsed["0"] ?? 0) >>> 0;
setSeg(v, 2);
return;
}
if (parsed.seg3 !== undefined) {
const v = (parsed.seg3 ?? parsed.value ?? parsed[0] ?? parsed["0"] ?? 0) >>> 0;
setSeg(v, 3);
return;
}