Skip to content

Commit 2e7d24f

Browse files
committed
add tests for firmware-emulator
1 parent 86493ee commit 2e7d24f

File tree

9 files changed

+1012
-70
lines changed

9 files changed

+1012
-70
lines changed

autd3-driver/src/firmware_version.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* Created Date: 27/04/2022
55
* Author: Shun Suzuki
66
* -----
7-
* Last Modified: 06/12/2023
7+
* Last Modified: 14/12/2023
88
* Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp)
99
* -----
1010
* Copyright (c) 2022-2023 Shun Suzuki. All rights reserved.
@@ -14,7 +14,7 @@
1414
use std::fmt;
1515

1616
pub const LATEST_VERSION_NUM_MAJOR: u8 = 0x8C;
17-
pub const LATEST_VERSION_NUM_MINOR: u8 = 0x00;
17+
pub const LATEST_VERSION_NUM_MINOR: u8 = 0x02;
1818

1919
const ENABLED_EMULATOR_BIT: u8 = 1 << 7;
2020

@@ -286,7 +286,7 @@ mod tests {
286286

287287
#[test]
288288
fn latest_firmware_version() {
289-
assert_eq!("v4.1.0", FirmwareInfo::latest_version());
289+
assert_eq!("v4.1.2", FirmwareInfo::latest_version());
290290
}
291291

292292
#[test]

autd3-firmware-emulator/Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,7 @@ keywords = ["autd"]
1414
autd3-driver = { path = "../autd3-driver", version = "19.0.0" }
1515
num-integer = "0.1.45"
1616
thiserror = "1.0.40"
17+
18+
[dev-dependencies]
19+
autd3-derive = { path = "../autd3-derive", version = "19.0.0" }
20+
rand = "0.8.5"

autd3-firmware-emulator/src/cpu/emulator.rs

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* Created Date: 06/05/2022
55
* Author: Shun Suzuki
66
* -----
7-
* Last Modified: 06/12/2023
7+
* Last Modified: 14/12/2023
88
* Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp)
99
* -----
1010
* Copyright (c) 2022-2023 Shun Suzuki. All rights reserved.
@@ -60,6 +60,14 @@ impl CPUEmulator {
6060
self.num_transducers
6161
}
6262

63+
pub fn synchronized(&self) -> bool {
64+
self.synchronized
65+
}
66+
67+
pub fn reads_fpga_info(&self) -> bool {
68+
self.read_fpga_info
69+
}
70+
6371
pub fn ack(&self) -> u8 {
6472
self.ack
6573
}
@@ -138,7 +146,7 @@ impl CPUEmulator {
138146
fn write_mod(&mut self, data: &[u8]) {
139147
let flag = data[1];
140148

141-
let write = ((data[3] as u16) << 8) | data[2] as u16;
149+
let write = ((data[3] as u32) << 8) | data[2] as u32;
142150
let data = if (flag & MODULATION_FLAG_BEGIN) == MODULATION_FLAG_BEGIN {
143151
self.mod_cycle = 0;
144152
self.bram_write(BRAM_SELECT_CONTROLLER, BRAM_ADDR_MOD_ADDR_OFFSET, 0);
@@ -160,7 +168,7 @@ impl CPUEmulator {
160168
let page_capacity =
161169
(self.mod_cycle & !MOD_BUF_PAGE_SIZE_MASK) + MOD_BUF_PAGE_SIZE - self.mod_cycle;
162170

163-
if write as u32 <= page_capacity {
171+
if write < page_capacity {
164172
self.bram_cpy(
165173
BRAM_SELECT_MOD,
166174
((self.mod_cycle & MOD_BUF_PAGE_SIZE_MASK) >> 1) as u16,
@@ -176,7 +184,7 @@ impl CPUEmulator {
176184
(page_capacity >> 1) as usize,
177185
);
178186
self.mod_cycle += page_capacity;
179-
let data = unsafe { data.add(page_capacity as _) };
187+
let data = unsafe { data.add((page_capacity >> 1) as _) };
180188
self.bram_write(
181189
BRAM_SELECT_CONTROLLER,
182190
BRAM_ADDR_MOD_ADDR_OFFSET,
@@ -300,7 +308,7 @@ impl CPUEmulator {
300308
let page_capacity = (self.stm_cycle & !POINT_STM_BUF_PAGE_SIZE_MASK)
301309
+ POINT_STM_BUF_PAGE_SIZE
302310
- self.stm_cycle;
303-
if size <= page_capacity {
311+
if size < page_capacity {
304312
let mut dst = ((self.stm_cycle & POINT_STM_BUF_PAGE_SIZE_MASK) << 3) as u16;
305313
(0..size as usize).for_each(|_| unsafe {
306314
self.bram_write(BRAM_SELECT_STM, dst, src.read());
@@ -590,7 +598,6 @@ impl CPUEmulator {
590598

591599
fn handle_payload(&mut self, tag: u8, data: &[u8]) {
592600
match tag {
593-
TAG_NONE => {}
594601
TAG_CLEAR => self.clear(),
595602
TAG_SYNC => self.synchronize(),
596603
TAG_FIRM_INFO => match data[1] {
@@ -615,10 +622,9 @@ impl CPUEmulator {
615622
self.read_fpga_info = self.read_fpga_info_store;
616623
}
617624
_ => {
618-
unimplemented!("Unsupported firmware info type")
625+
unreachable!("Unsupported firmware info type")
619626
}
620627
},
621-
TAG_UPDATE_FLAGS => (),
622628
TAG_MODULATION => self.write_mod(data),
623629
TAG_MODULATION_DELAY => self.write_mod_delay(&data[2..]),
624630
TAG_SILENCER => self.config_silencer(data),
@@ -665,3 +671,24 @@ impl CPUEmulator {
665671
self.ack = header.msg_id;
666672
}
667673
}
674+
675+
#[cfg(test)]
676+
mod tests {
677+
use super::*;
678+
679+
use rand::Rng;
680+
681+
#[test]
682+
fn cpu_idx() {
683+
let mut rng = rand::thread_rng();
684+
let idx = rng.gen();
685+
let cpu = CPUEmulator::new(idx, 249);
686+
assert_eq!(cpu.idx(), idx);
687+
}
688+
689+
#[test]
690+
fn num_transducers() {
691+
let cpu = CPUEmulator::new(0, 249);
692+
assert_eq!(cpu.num_transducers(), 249);
693+
}
694+
}

autd3-firmware-emulator/src/cpu/params.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@
44
* Created Date: 07/05/2022
55
* Author: Shun Suzuki
66
* -----
7-
* Last Modified: 06/12/2023
7+
* Last Modified: 14/12/2023
88
* Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp)
99
* -----
1010
* Copyright (c) 2022-2023 Shun Suzuki. All rights reserved.
1111
*
1212
*/
1313

1414
pub const CPU_VERSION_MAJOR: u16 = 0x8C;
15-
pub const CPU_VERSION_MINOR: u16 = 0x00;
15+
pub const CPU_VERSION_MINOR: u16 = 0x02;
1616

1717
pub const BRAM_SELECT_CONTROLLER: u8 = 0x0;
1818
pub const BRAM_SELECT_MOD: u8 = 0x1;
@@ -53,11 +53,9 @@ pub const GAIN_STM_BUF_PAGE_SIZE_WIDTH: u32 = 6;
5353
pub const GAIN_STM_BUF_PAGE_SIZE: u32 = 1 << GAIN_STM_BUF_PAGE_SIZE_WIDTH;
5454
pub const GAIN_STM_BUF_PAGE_SIZE_MASK: u32 = GAIN_STM_BUF_PAGE_SIZE - 1;
5555

56-
pub const TAG_NONE: u8 = 0x00;
5756
pub const TAG_CLEAR: u8 = 0x01;
5857
pub const TAG_SYNC: u8 = 0x02;
5958
pub const TAG_FIRM_INFO: u8 = 0x03;
60-
pub const TAG_UPDATE_FLAGS: u8 = 0x04;
6159
pub const TAG_MODULATION: u8 = 0x10;
6260
pub const TAG_MODULATION_DELAY: u8 = 0x11;
6361
pub const TAG_SILENCER: u8 = 0x20;

autd3-firmware-emulator/src/error.rs

Lines changed: 0 additions & 33 deletions
This file was deleted.

autd3-firmware-emulator/src/fpga/emulator.rs

Lines changed: 45 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* Created Date: 06/05/2022
55
* Author: Shun Suzuki
66
* -----
7-
* Last Modified: 06/12/2023
7+
* Last Modified: 14/12/2023
88
* Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp)
99
* -----
1010
* Copyright (c) 2022-2023 Shun Suzuki. All rights reserved.
@@ -86,17 +86,6 @@ impl FPGAEmulator {
8686
let addr = (addr & 0x3FFF) as usize;
8787
match select {
8888
BRAM_SELECT_CONTROLLER => self.controller_bram[addr],
89-
BRAM_SELECT_MOD => {
90-
let offset = self.controller_bram[ADDR_MOD_ADDR_OFFSET];
91-
let addr = (offset as usize) << 14 | addr;
92-
self.modulator_bram[addr]
93-
}
94-
BRAM_SELECT_NORMAL => self.normal_op_bram[addr],
95-
BRAM_SELECT_STM => {
96-
let offset = self.controller_bram[ADDR_STM_ADDR_OFFSET];
97-
let addr = (offset as usize) << 14 | addr;
98-
self.stm_op_bram[addr]
99-
}
10089
_ => unreachable!(),
10190
}
10291
}
@@ -215,7 +204,7 @@ impl FPGAEmulator {
215204
m.push(((b >> 8) & 0x00FF) as u8);
216205
});
217206
if cycle % 2 != 0 {
218-
let b = self.modulator_bram[(cycle + 1) >> 1];
207+
let b = self.modulator_bram[cycle >> 1];
219208
m.push((b & 0x00FF) as u8);
220209
}
221210
m
@@ -284,21 +273,21 @@ impl FPGAEmulator {
284273
let mut x = (self.stm_op_bram[8 * idx + 1] as u32) << 16 & 0x30000;
285274
x |= self.stm_op_bram[8 * idx] as u32;
286275
let x = if (x & 0x20000) != 0 {
287-
-131072 + (x & 0x1FFFF) as i32
276+
(x | 0xFFFC0000) as i32
288277
} else {
289278
x as i32
290279
};
291280
let mut y = (self.stm_op_bram[8 * idx + 2] as u32) << 14 & 0x3C000;
292281
y |= self.stm_op_bram[8 * idx + 1] as u32 >> 2;
293282
let y = if (y & 0x20000) != 0 {
294-
-131072 + (y & 0x1FFFF) as i32
283+
(y | 0xFFFC0000) as i32
295284
} else {
296285
y as i32
297286
};
298287
let mut z = (self.stm_op_bram[8 * idx + 3] as u32) << 12 & 0x3F000;
299288
z |= self.stm_op_bram[8 * idx + 2] as u32 >> 4;
300289
let z = if (z & 0x20000) != 0 {
301-
-131072 + (z & 0x1FFFF) as i32
290+
(z | 0xFFFC0000) as i32
302291
} else {
303292
z as i32
304293
};
@@ -344,13 +333,51 @@ mod tests {
344333

345334
#[test]
346335
fn test_to_pulse_width() {
347-
for a in 0x00..0xFF {
348-
for b in 0x00..0xFF {
336+
for a in 0x00..=0xFF {
337+
for b in 0x00..=0xFF {
349338
assert_eq!(
350339
to_pulse_width_actual(a, b),
351340
FPGAEmulator::to_pulse_width(a, b)
352341
);
353342
}
354343
}
355344
}
345+
346+
#[test]
347+
#[should_panic]
348+
fn read_panic() {
349+
let fpga = FPGAEmulator::new(249);
350+
let addr = BRAM_SELECT_MOD << 14;
351+
fpga.read(addr);
352+
}
353+
354+
#[test]
355+
fn modulation() {
356+
let mut fpga = FPGAEmulator::new(249);
357+
fpga.modulator_bram[0] = 0x1234;
358+
fpga.modulator_bram[1] = 0x5678;
359+
fpga.controller_bram[ADDR_MOD_CYCLE] = 3 - 1;
360+
assert_eq!(3, fpga.modulation_cycle());
361+
assert_eq!(0x34, fpga.modulation_at(0));
362+
assert_eq!(0x12, fpga.modulation_at(1));
363+
assert_eq!(0x78, fpga.modulation_at(2));
364+
let m = fpga.modulation();
365+
assert_eq!(m.len(), 3);
366+
assert_eq!(0x34, m[0]);
367+
assert_eq!(0x12, m[1]);
368+
assert_eq!(0x78, m[2]);
369+
}
370+
371+
#[test]
372+
fn is_outputting() {
373+
let mut fpga = FPGAEmulator::new(249);
374+
assert!(!fpga.is_outputting());
375+
376+
fpga.normal_op_bram[0] = 0xFFFF;
377+
assert!(!fpga.is_outputting());
378+
379+
fpga.modulator_bram[0] = 0xFFFF;
380+
fpga.controller_bram[ADDR_MOD_CYCLE] = 2 - 1;
381+
assert!(fpga.is_outputting());
382+
}
356383
}

autd3-firmware-emulator/src/fpga/params.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@
44
* Created Date: 07/05/2022
55
* Author: Shun Suzuki
66
* -----
7-
* Last Modified: 06/12/2023
7+
* Last Modified: 14/12/2023
88
* Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp)
99
* -----
1010
* Copyright (c) 2022-2023 Shun Suzuki. All rights reserved.
1111
*
1212
*/
1313

1414
pub const VERSION_NUM_MAJOR: u8 = 0x8C;
15-
pub const VERSION_NUM_MINOR: u8 = 0x00;
15+
pub const VERSION_NUM_MINOR: u8 = 0x02;
1616

1717
pub const BRAM_SELECT_CONTROLLER: u16 = 0x0;
1818
pub const BRAM_SELECT_MOD: u16 = 0x1;

autd3-firmware-emulator/src/lib.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,14 @@
44
* Created Date: 06/05/2022
55
* Author: Shun Suzuki
66
* -----
7-
* Last Modified: 19/05/2023
7+
* Last Modified: 14/12/2023
88
* Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp)
99
* -----
1010
* Copyright (c) 2022-2023 Shun Suzuki. All rights reserved.
1111
*
1212
*/
1313

1414
pub mod cpu;
15-
pub mod error;
1615
pub mod fpga;
1716

1817
pub use cpu::emulator::CPUEmulator;

0 commit comments

Comments
 (0)