|
@@ -458,25 +458,33 @@ class Unit:
|
|
|
|
|
|
## source_bytes:
|
|
|
## Command Greaseweazle to source 'nr' garbage bytes.
|
|
|
- def source_bytes(self, nr):
|
|
|
- self._send_cmd(struct.pack("<2BI", Cmd.SourceBytes, 6, nr))
|
|
|
- while nr > 0:
|
|
|
- self.ser.read(1)
|
|
|
- waiting = self.ser.in_waiting
|
|
|
- self.ser.read(waiting)
|
|
|
- nr -= 1 + waiting
|
|
|
-
|
|
|
+ def source_bytes(self, nr, seed):
|
|
|
+ try:
|
|
|
+ self._send_cmd(struct.pack("<2B2I", Cmd.SourceBytes, 10, nr, seed))
|
|
|
+ dat = self.ser.read(nr)
|
|
|
+ except CmdError as error:
|
|
|
+ if error.code != Ack.BadCommand:
|
|
|
+ raise
|
|
|
+ # Firmware v0.28 and earlier
|
|
|
+ self._send_cmd(struct.pack("<2BI", Cmd.SourceBytes, 6, nr))
|
|
|
+ self.ser.read(nr)
|
|
|
+ dat = None
|
|
|
+ return dat
|
|
|
|
|
|
## sink_bytes:
|
|
|
- ## Command Greaseweazle to sink 'nr' garbage bytes.
|
|
|
- def sink_bytes(self, nr):
|
|
|
- self._send_cmd(struct.pack("<2BI", Cmd.SinkBytes, 6, nr))
|
|
|
- dat = bytes(1024*1024)
|
|
|
- while nr > len(dat):
|
|
|
- self.ser.write(dat)
|
|
|
- nr -= len(dat)
|
|
|
- self.ser.write(dat[:nr])
|
|
|
- self.ser.read(1) # Sync with Greaseweazle
|
|
|
+ ## Command Greaseweazle to sink given data buffer.
|
|
|
+ def sink_bytes(self, dat, seed):
|
|
|
+ try:
|
|
|
+ self._send_cmd(struct.pack("<2BII", Cmd.SinkBytes, 10,
|
|
|
+ len(dat), seed))
|
|
|
+ except CmdError as error:
|
|
|
+ if error.code != Ack.BadCommand:
|
|
|
+ raise
|
|
|
+ # Firmware v0.28 and earlier
|
|
|
+ self._send_cmd(struct.pack("<2BI", Cmd.SinkBytes, 6, len(dat)))
|
|
|
+ self.ser.write(dat)
|
|
|
+ (ack,) = struct.unpack("B", self.ser.read(1))
|
|
|
+ return ack
|
|
|
|
|
|
|
|
|
## bw_stats:
|