瀏覽代碼

Split 'gw pin' into 'gw pin set' and 'gw pin get' subcommands.

Based on a patch by Troed Sangberg.
Keir Fraser 3 年之前
父節點
當前提交
fc60ec36b3
共有 2 個文件被更改,包括 52 次插入4 次删除
  1. 43 3
      scripts/greaseweazle/tools/pin.py
  2. 9 1
      scripts/greaseweazle/usb.py

+ 43 - 3
scripts/greaseweazle/tools/pin.py

@@ -20,15 +20,15 @@ def level(letter):
         raise argparse.ArgumentTypeError("invalid pin level: '%s'" % letter)
     return levels[letter.upper()]
 
-def main(argv):
+def pin_set(argv):
 
     parser = util.ArgumentParser(usage='%(prog)s [options] pin level')
     parser.add_argument("--device", help="greaseweazle device name")
     parser.add_argument("pin", type=int, help="pin number")
     parser.add_argument("level", type=level, help="pin level (H,L)")
     parser.description = description
-    parser.prog += ' ' + argv[1]
-    args = parser.parse_args(argv[2:])
+    parser.prog += ' pin set'
+    args = parser.parse_args(argv[3:])
 
     try:
         usb = util.usb_open(args.device)
@@ -38,6 +38,46 @@ def main(argv):
     except USB.CmdError as error:
         print("Command Failed: %s" % error)
 
+def _pin_get(usb, args, **_kwargs):
+    """Get the specified pin value.
+    """
+    value = usb.get_pin(args.pin)
+    print("Pin %u is %s" %
+          (args.pin, ("Low (0v)", "High (5v)")[value]))
+
+def pin_get(argv):
+
+    parser = util.ArgumentParser(usage='%(prog)s [options] pin')
+    parser.add_argument("--device", help="greaseweazle device name")
+    parser.add_argument("--drive", type=util.drive_letter, default='A',
+                        help="drive to read (A,B,0,1,2)")
+    parser.add_argument("pin", type=int, help="pin number")
+    parser.description = description
+    parser.prog += ' pin get'
+    args = parser.parse_args(argv[3:])
+
+    try:
+        usb = util.usb_open(args.device)
+        util.with_drive_selected(_pin_get, usb, args, motor=False)
+    except USB.CmdError as error:
+        print("Command Failed: %s" % error)
+
+def usage(argv):
+    print("usage: gw pin get|set [-h] ...")
+    print("  get|set  Get or set a pin")
+    sys.exit(1)
+
+def main(argv):
+
+    if len(argv) < 3:
+        usage(argv)
+
+    if argv[2] == 'get':
+        pin_get(argv)
+    elif argv[2] == 'set':
+        pin_set(argv)
+    else:
+        usage(argv)
 
 if __name__ == "__main__":
     main(sys.argv)

+ 9 - 1
scripts/greaseweazle/usb.py

@@ -95,7 +95,7 @@ class Ack:
         NoUnit: "No drive unit selected",
         NoBus: "No bus type (eg. Shugart, IBM/PC) specified",
         BadUnit: "Invalid unit number",
-        BadPin: "Not a modifiable pin",
+        BadPin: "Invalid pin",
         BadCylinder: "Invalid cylinder"
     }
 
@@ -230,6 +230,14 @@ class Unit:
         self._send_cmd(struct.pack("4B", Cmd.SetPin, 4, pin, int(level)))
 
 
+    ## get_pin:
+    ## Get a pin level.
+    def get_pin(self, pin):
+        self._send_cmd(struct.pack("3B", Cmd.GetPin, 3, pin))
+        v, = struct.unpack("B", self.ser.read(1))
+        return v
+
+
     ## power_on_reset:
     ## Re-initialise to power-on defaults.
     def power_on_reset(self):