mirror of
https://github.com/ParkerTenBroeck/hdl_sim.git
synced 2026-06-06 21:24:06 -04:00
updated
This commit is contained in:
parent
b4841e6f40
commit
e6c5947949
9 changed files with 156 additions and 63 deletions
|
|
@ -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(())
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue