]> gitweb.factorcode.org Git - factor.git/commitdiff
usb: add help, implement higher level functions
authorchris.double <chris.double@double.co.nz>
Sat, 16 Sep 2006 06:14:59 +0000 (06:14 +0000)
committerchris.double <chris.double@double.co.nz>
Sat, 16 Sep 2006 06:14:59 +0000 (06:14 +0000)
contrib/usb/load.factor
contrib/usb/usb.factor
contrib/usb/usb.facts [new file with mode: 0644]

index 6c0ce06a3acdab69b6e39deae9539af794939bcb..d37bf1edbc9f1cca4255ff2022c0fc14816e1ca7 100644 (file)
@@ -8,5 +8,6 @@ PROVIDE: contrib/usb {
        { "usb-win32.factor" [ win32? ] }
        { "usb-macosx.factor" [ macosx? ] }
        "usb.factor" 
+       "usb.facts" 
 } { 
 } ;
index 8e9ab6a06062d9373f11b20e7216eb5ddb42ced7..5a6c7f96b64eb72ce725d04f81dec4fd6a39361f 100644 (file)
@@ -2,7 +2,7 @@
 ! See http://factorcode.org/license.txt for BSD license.
 !
 IN: usb
-USING: kernel alien io math ;
+USING: kernel alien io math arrays sequences ;
 
 LIBRARY: usb
 
@@ -38,27 +38,51 @@ FUNCTION: int usb_find_devices ( ) ;
 FUNCTION: usb_device* usb_device ( usb_dev_handle* dev ) ;
 FUNCTION: usb_bus* usb_get_busses ( ) ;
 
+: bus-each ( usb_bus quot -- ) 
+  [ call ] 2keep >r usb_bus-next r> over [ bus-each ] [ 2drop ] if ;
 
-: t1 ( -- string )
-  usb_find_busses drop usb_find_devices drop usb_get_busses usb_bus-dirname ;
+: device-each ( usb_device quot -- )
+  [ call ] 2keep >r usb_device-next r> over [ device-each ] [ 2drop ] if ;
 
-: ((t2)) ( device -- )
-  terpri
-  [
-    "  " write
-    dup usb_device-filename write 
-    " - " write dup usb_device-descriptor usb_device_descriptor-bLength number>string write 
-    " - " write dup usb_device-descriptor usb_device_descriptor-idVendor >hex write 
-    " - " write usb_device-descriptor usb_device_descriptor-idProduct >hex write 
-  ] when* ;
+: vendor-id-matches? ( id usb_device -- bool )
+  usb_device-descriptor usb_device_descriptor-idVendor = ;
 
-: (t2) ( bus -- )
-  [
+: product-id-matches? ( id usb_device  -- bool )
+  usb_device-descriptor usb_device_descriptor-idProduct = ;
+
+: is-device? ( vendor-id product-id usb_device -- bool )
+  tuck product-id-matches? >r vendor-id-matches? r> and ;
+
+: find-devices ( vendor-id product-id -- seq )
+  2array
+  V{ } clone
+  usb_get_busses [
+    usb_bus-devices [
+      pick first2 pick is-device? [
+        over push
+      ] [
+        drop
+      ] if
+    ] device-each
+  ] bus-each nip ;
+
+: init ( -- )
+  #! Initialize libusb and find devices and busses
+  usb_init usb_find_busses drop usb_find_devices drop ;
+       
+: display-devices ( -- )
+  #! Example function to list all usb devices on system
+  usb_get_busses [
     dup usb_bus-dirname write " - " write 
-    dup usb_bus-devices ((t2))
+    usb_bus-devices [
+      terpri "  " write
+      dup usb_device-filename write 
+      " - " write 
+      dup usb_device-descriptor usb_device_descriptor-bLength number>string write 
+      " - " write 
+      dup usb_device-descriptor usb_device_descriptor-idVendor >hex write 
+      " - " write 
+      usb_device-descriptor usb_device_descriptor-idProduct >hex write
+    ] device-each
     terpri
-    usb_bus-next (t2) 
-  ] when* ;
-
-: t2 ( -- )
-  usb_get_busses (t2) ;
+  ] bus-each ;
diff --git a/contrib/usb/usb.facts b/contrib/usb/usb.facts
new file mode 100644 (file)
index 0000000..72f159b
--- /dev/null
@@ -0,0 +1,44 @@
+! Copyright (C) 2006 Chris Double.
+! See http://factorcode.org/license.txt for BSD license.
+
+USING: help usb ;
+
+HELP: bus-each 
+{ $values { "usb_bus" "an alien pointing to a usb_bus structure" } { "quot" "A quotation with stack effect " { $snippet "( usb_bus -- )" } } }
+{ $description "Starting with the given usb_bus, traverse the linked list of busses calling the quotation on each one." } 
+{ $examples
+  { $example "usb_get_busses [ display-devices ]" }
+}
+{ $see-also device-each find-devices } ;
+
+HELP: device-each 
+{ $values { "usb_device" "an alien pointing to a usb_device structure" } { "quot" "A quotation with stack effect " { $snippet "( usb_device -- )" } } }
+{ $description "Starting with the given usb_device, traverse the linked list of devices calling the quotation on each one." } 
+{ $examples
+  { $example "usb_get_busses [\n  usb_bus-devices [ display-device ]\n] bus-each" }
+}
+{ $see-also bus-each find-devices } ;
+
+HELP: vendor-id-matches?
+{ $values { "id" "the integer vendor id" } { "usb_device" "an alien pointing to a usb_device structure" } { "bool" "a boolean" } }
+{ $description "Return true if the device has the given vendor id." } 
+{ $see-also product-id-matches? is-device? } ;
+
+HELP: product-id-matches?
+{ $values { "id" "the integer product id" } { "usb_device" "an alien pointing to a usb_device structure" } { "bool" "a boolean" } }
+{ $description "Return true if the device has the given product id." } 
+{ $see-also vendor-id-matches? is-device? } ;
+
+HELP: is-device?
+{ $values { "vendor-id" "the integer vendor id" } { "product-id" "the integer product-id" } { "usb_device" "an alien pointing to a usb_device structure" } { "bool" "a boolean" } }
+{ $description "Return true if the device has the given vendor and product id." } 
+{ $see-also vendor-id-matches? product-id-matches? } ;
+
+HELP: find-devices 
+{ $values { "vendor-id" "the integer vendor id for the device to find" } { "product-id" "the integer product id for the device to find" } { "seq" "a sequence containing the usb_devices found" } }
+{ $description "Traverse the devices on all USB busses looking for a device with the given vendor and product id's. Return a sequence containing all the usb_device structures found matcing the vendor and product id's." } 
+{ $examples
+  { $example "HEX: 10D6 HEX: 1100 find-devices" }
+}
+{ $see-also bus-each device-each } ;
+