gamebridge: Twitch Control #2
|
@ -75,3 +75,4 @@ sm64config.txt
|
||||||
/target
|
/target
|
||||||
vblank
|
vblank
|
||||||
input
|
input
|
||||||
|
*.m64
|
||||||
|
|
|
@ -7,16 +7,22 @@ use std::{
|
||||||
|
|
||||||
fn main() -> anyhow::Result<()> {
|
fn main() -> anyhow::Result<()> {
|
||||||
pretty_env_logger::try_init()?;
|
pretty_env_logger::try_init()?;
|
||||||
let controller_data = [0; 4];
|
let mut controller_data = [0; 4];
|
||||||
|
|
||||||
let mut vblank = File::open("vblank")?;
|
let mut vblank = File::open("vblank")?;
|
||||||
let mut input = OpenOptions::new().write(true).open("input")?;
|
let mut input = OpenOptions::new().write(true).open("input")?;
|
||||||
|
let mut demofile = File::open("demo.m64")?;
|
||||||
|
|
||||||
|
{
|
||||||
|
let mut buf = [0; 1024];
|
||||||
|
demofile.read(&mut buf)?;
|
||||||
|
}
|
||||||
|
|
||||||
info!("ready");
|
info!("ready");
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let mut data = [0; 3];
|
let mut data = [0; 3];
|
||||||
info!("waiting for vblank");
|
debug!("waiting for vblank");
|
||||||
vblank.read(&mut data)?;
|
vblank.read(&mut data)?;
|
||||||
let str = from_utf8(&data)?;
|
let str = from_utf8(&data)?;
|
||||||
debug!("got data: {}", str);
|
debug!("got data: {}", str);
|
||||||
|
@ -24,6 +30,7 @@ fn main() -> anyhow::Result<()> {
|
||||||
warn!("asked to exit by the game");
|
warn!("asked to exit by the game");
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
demofile.read(&mut controller_data)?;
|
||||||
input.write(&controller_data)?;
|
input.write(&controller_data)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,17 @@ static FILE *input;
|
||||||
#define bye "BYE"
|
#define bye "BYE"
|
||||||
|
|
||||||
static void gamebridge_close(void) {
|
static void gamebridge_close(void) {
|
||||||
|
if (!configGameBridge) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("[gamebridge] exiting\n");
|
||||||
fwrite(bye, 1, strlen(bye), vblank);
|
fwrite(bye, 1, strlen(bye), vblank);
|
||||||
|
fclose(vblank);
|
||||||
|
fclose(input);
|
||||||
|
|
||||||
|
unlink(vblank_fname);
|
||||||
|
unlink(input_fname);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gamebridge_init(void) {
|
static void gamebridge_init(void) {
|
||||||
|
@ -68,14 +78,14 @@ static void gamebridge_read(OSContPad *pad) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("[gamebridge] waiting for input\n");
|
//printf("[gamebridge] waiting for input\n");
|
||||||
fwrite(ok, 1, strlen(ok), vblank);
|
fwrite(ok, 1, strlen(ok), vblank);
|
||||||
uint8_t bytes[4] = {0};
|
uint8_t bytes[4] = {0};
|
||||||
fread(bytes, 1, 4, input);
|
fread(bytes, 1, 4, input);
|
||||||
pad->button = (bytes[0] << 8) | bytes[1];
|
pad->button = (bytes[0] << 8) | bytes[1];
|
||||||
pad->stick_x = bytes[2];
|
pad->stick_x = bytes[2];
|
||||||
pad->stick_y = bytes[3];
|
pad->stick_y = bytes[3];
|
||||||
printf("[gamebridge] %02x%02x %02x%02x\n", bytes[0], bytes[1], bytes[2], bytes[3]);
|
//printf("[gamebridge] %02x%02x %02x%02x\n", bytes[0], bytes[1], bytes[2], bytes[3]);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue