phidgets-ffi 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,11 @@
1
+ module Phidgets
2
+ module Error
3
+ @errors = {}
4
+ Phidgets::FFI::ErrorCodes.to_hash.each_pair do |sym, num|
5
+ eval "@errors[num] = (#{sym.to_s.split("_").map(&:capitalize).join} = Class.new(Exception))"
6
+ end
7
+ def self.exception_for(error_code)
8
+ @errors[error_code]
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,50 @@
1
+ module Phidgets
2
+ module FFI
3
+ class Error < Exception; end
4
+ attach_function :CPhidget_open, [:phid, :int], :int #int CPhidget_open(CPhidgetHandle phid, int serialNumber);
5
+ attach_function :CPhidget_openLabel, [:phid, :string], :int #int CPhidget_openLabel(CPhidgetHandle phid, const char *label);
6
+ attach_function :CPhidget_close, [:phid], :int #int CPhidget_close(CPhidgetHandle phid);
7
+ attach_function :CPhidget_delete, [:phid], :int #int CPhidget_delete(CPhidgetHandle phid);
8
+ callback :CPhidget_set_OnDetach_Callback, [:phid, :user_ptr], :int
9
+ attach_function :CPhidget_set_OnDetach_Handler, [:phid, :CPhidget_set_OnDetach_Callback, :user_ptr], :int #int CPhidget_set_OnDetach_Handler(CPhidgetHandle phid, int( *fptr)(CPhidgetHandle phid, void *userPtr), void *userPtr);
10
+ callback :CPhidget_set_OnAttach_Callback, [:phid, :user_ptr], :int
11
+ attach_function :CPhidget_set_OnAttach_Handler, [:phid, :CPhidget_set_OnAttach_Callback, :user_ptr], :int #int CPhidget_set_OnAttach_Handler(CPhidgetHandle phid, int( *fptr)(CPhidgetHandle phid, void *userPtr), void *userPtr);
12
+ callback :CPhidget_set_OnServerConnect_Callback, [:phid, :user_ptr], :int
13
+ attach_function :CPhidget_set_OnServerConnect_Handler, [:phid, :CPhidget_set_OnServerConnect_Callback, :user_ptr], :int #int CPhidget_set_OnServerConnect_Handler(CPhidgetHandle phid, int ( *fptr)(CPhidgetHandle phid, void *userPtr), void *userPtr);
14
+ callback :CPhidget_set_OnServerDisconnect_Callback, [:phid, :user_ptr], :int
15
+ attach_function :CPhidget_set_OnServerDisconnect_Handler, [:phid, :CPhidget_set_OnServerDisconnect_Callback, :user_ptr], :int #int CPhidget_set_OnServerDisconnect_Handler(CPhidgetHandle phid, int ( *fptr)(CPhidgetHandle phid, void *userPtr), void *userPtr);
16
+ callback :CPhidget_set_OnError_Callback, [:phid, :user_ptr, :int, :string], :int
17
+ attach_function :CPhidget_set_OnError_Handler, [:phid, :CPhidget_set_OnError_Callback, :user_ptr], :int #int CPhidget_set_OnError_Handler(CPhidgetHandle phid, int( *fptr)(CPhidgetHandle phid, void *userPtr, int errorCode, const char *errorString), void *userPtr);
18
+ attach_function :CPhidget_getDeviceName, [:phid, :pointer], :int #int CPhidget_getDeviceName(CPhidgetHandle phid, const char **deviceName);
19
+ attach_function :CPhidget_getSerialNumber, [:phid, :pointer], :int #int CPhidget_getSerialNumber(CPhidgetHandle phid, int *serialNumber);
20
+ attach_function :CPhidget_getDeviceVersion, [:phid, :pointer], :int #int CPhidget_getDeviceVersion(CPhidgetHandle phid, int *deviceVersion);
21
+ attach_function :CPhidget_getDeviceStatus, [:phid, :pointer], :int #int CPhidget_getDeviceStatus(CPhidgetHandle phid, int *deviceStatus);
22
+ attach_function :CPhidget_getLibraryVersion, [:pointer], :int
23
+ attach_function :CPhidget_getDeviceType, [:phid, :pointer], :int #int CPhidget_getDeviceType(CPhidgetHandle phid, const char **deviceType);
24
+ attach_function :CPhidget_getDeviceLabel, [:phid, :pointer], :int #int CPhidget_getDeviceLabel(CPhidgetHandle phid, const char **deviceLabel);
25
+ attach_function :CPhidget_setDeviceLabel, [:phid, :string], :int #int CPhidget_setDeviceLabel(CPhidgetHandle phid, const char *deviceLabel);
26
+ attach_function :CPhidget_getErrorDescription, [:int, :pointer], :int #int CPhidget_getErrorDescription(int errorCode, const char **errorString);
27
+ attach_function :CPhidget_waitForAttachment, [:phid, :int], :int #int CPhidget_waitForAttachment(CPhidgetHandle phid, int milliseconds);
28
+ attach_function :CPhidget_getServerID, [:phid, :pointer], :int #int CPhidget_getServerID(CPhidgetHandle phid, const char **serverID);
29
+ attach_function :CPhidget_getServerAddress, [:phid, :pointer, :pointer], :int #int CPhidget_getServerAddress(CPhidgetHandle phid, const char **address, int *port);
30
+ attach_function :CPhidget_getServerStatus, [:phid, :pointer], :int #int CPhidget_getServerStatus(CPhidgetHandle phid, int *serverStatus);
31
+ attach_function :CPhidget_getDeviceID, [:phid, :pointer], :int #int CPhidget_getDeviceID(CPhidgetHandle phid, CPhidget_DeviceID *deviceID);
32
+ attach_function :CPhidget_getDeviceClass, [:phid, :pointer], :int #int CPhidget_getDeviceClass(CPhidgetHandle phid, CPhidget_DeviceClass *deviceClass);
33
+ callback :CPhidget_set_OnWillSleep_Callback, [:user_ptr], :int
34
+ attach_function :CPhidget_set_OnWillSleep_Handler, [:CPhidget_set_OnWillSleep_Callback, :user_ptr], :int #int CPhidget_set_OnWillSleep_Handler(int( *fptr)(void *userPtr), void *userPtr);
35
+ callback :CPhidget_set_OnWakeup_Callback, [:user_ptr], :int
36
+ attach_function :CPhidget_set_OnWakeup_Handler, [:CPhidget_set_OnWakeup_Callback, :user_ptr], :int #int CPhidget_set_OnWakeup_Handler(int( *fptr)(void *userPtr), void *userPtr);
37
+
38
+ module Common
39
+ def self.method_missing(method, *args, &block)
40
+ if ::Phidgets::FFI.respond_to?("CPhidget_#{method}".to_sym)
41
+ if (rs = ::Phidgets::FFI.send("CPhidget_#{method}".to_sym, *args, &block)) != 0
42
+ raise Phidgets::Error.exception_for(rs), Phidgets::FFI.error_description(rs)
43
+ end
44
+ else
45
+ super(method, *args, &block)
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,109 @@
1
+ module Phidgets
2
+ module FFI
3
+ typedef :pointer, :phid
4
+ typedef :pointer, :user_ptr
5
+
6
+ DeviceStatus = enum(
7
+ :detached, 0,
8
+ :attached
9
+ )
10
+
11
+ DeviceClass = enum(
12
+ :accelerometer, 2,
13
+ :advanced_servo, 3,
14
+ :encoder, 4,
15
+ :analog, 22,
16
+ :bridge, 23,
17
+ :frequency_counter, 21,
18
+ :gps, 5,
19
+ :interface_kit, 7,
20
+ :ir, 19,
21
+ :led, 8,
22
+ :motor_control, 9,
23
+ :ph_sensor, 10,
24
+ :rfid, 11,
25
+ :servo, 12,
26
+ :spatial, 20,
27
+ :stepper, 13,
28
+ :temperature_sensor, 14,
29
+ :text_lcd, 15,
30
+ :text_led, 16,
31
+ :weight_sensor, 17
32
+ )
33
+
34
+ DeviceID = enum(
35
+ :accelerometer_3axis, 0x07E,
36
+ :advanced_servo_1motor, 0x082,
37
+ :advanced_servo_8motor, 0x03A,
38
+ :analog_4output, 0x037,
39
+ :bipolar_stepper_1motor, 0x07B,
40
+ :bridge_4input, 0x03B,
41
+ :encoder_1encoder_1input, 0x04B,
42
+ :encoder_hs_1encoder, 0x080,
43
+ :encoder_hs_4encoder_4input, 0x04F,
44
+ :frequency_counter_2input, 0x035,
45
+ :gps, 0x079,
46
+ :interface_kit_0_0_4, 0x040,
47
+ :interface_kit_0_0_8, 0x081,
48
+ :interface_kit_0_16_16, 0x044,
49
+ :interface_kit_2_2_2, 0x036,
50
+ :interface_kit_8_8_8, 0x045,
51
+ :interface_kit_8_8_8_w_lcd, 0x07D,
52
+ :ir, 0x04D,
53
+ :led_64_adv, 0x04C,
54
+ :linear_touch, 0x076,
55
+ :motor_control_1motor, 0x03E,
56
+ :motor_control_hc_2motor, 0x059,
57
+ :rfid_2output, 0x031,
58
+ :rotary_touch, 0x077,
59
+ :spatial_accel_3axis, 0x07F,
60
+ :spatial_accel_gyro_compass, 0x033,
61
+ :temperature_sensor, 0x070,
62
+ :temperature_sensor_4, 0x032,
63
+ :sensor_ir, 0x03C,
64
+ :textlcd_2x20_w_8_8_8, 0x17D,
65
+ :textlcd_adapter, 0x03D,
66
+ :unipolar_stepper_4motor, 0x07A,
67
+ :accelerometer_2axis, 0x071,
68
+ :interface_kit_0_8_8_w_lcd, 0x053,
69
+ :interface_kit_4_8_8, 4,
70
+ :led_64, 0x04A,
71
+ :motorcontrol_LV_2motor_4input, 0x058,
72
+ :ph_sensor, 0x074,
73
+ :rfid, 0x030,
74
+ :servo_1motor, 0x039,
75
+ :servo_1motor_old, 2,
76
+ :servo_4motor, 0x038,
77
+ :servo_4motor_old, 3,
78
+ :textlcd_2x20, 0x052,
79
+ :textlcd_2x20_w_0_8_8, 0x153,
80
+ :textled_1x8, 0x049,
81
+ :textled_4x8, 0x048,
82
+ :weight_sensor, 0x072
83
+ )
84
+
85
+ ErrorCodes = enum(
86
+ :ok, 0,
87
+ :not_found,
88
+ :no_memory,
89
+ :unexpected,
90
+ :invalid_arg,
91
+ :not_attached,
92
+ :interrupted,
93
+ :invalid,
94
+ :network,
95
+ :unknown_val,
96
+ :bad_password,
97
+ :unsupported,
98
+ :duplicate,
99
+ :timeout,
100
+ :out_of_bounds,
101
+ :event,
102
+ :network_not_connected,
103
+ :wrong_device,
104
+ :closed,
105
+ :bad_version,
106
+ :error_code_count
107
+ )
108
+ end
109
+ end
@@ -0,0 +1,17 @@
1
+ class Array
2
+ def to_varargs
3
+ return nil if empty?
4
+ self.map { |a|
5
+ case
6
+ when a.kind_of?(String)
7
+ [:string, a]
8
+ when a.kind_of?(Fixnum)
9
+ [:long_long, a]
10
+ when a.kind_of?(Float)
11
+ [:double, a]
12
+ else
13
+ raise Phidgets::FFI::Error, "Unsupported vararg type: #{a.class}"
14
+ end
15
+ }.flatten
16
+ end
17
+ end
@@ -0,0 +1,44 @@
1
+ module Phidgets
2
+ module FFI
3
+ typedef :pointer, :dict
4
+
5
+ KeyChangeReason = enum(
6
+ :changed, 1,
7
+ :added,
8
+ :removed,
9
+ :unchanged
10
+ )
11
+ attach_function :CPhidgetDictionary_create, [:dict], :int #int CPhidgetDictionary_create(CPhidgetDictionaryHandle *dict);
12
+ attach_function :CPhidgetDictionary_close, [:dict], :int #int CPhidgetDictionary_close(CPhidgetDictionaryHandle dict);
13
+ attach_function :CPhidgetDictionary_delete, [:dict], :int #int CPhidgetDictionary_delete(CPhidgetDictionaryHandle dict);
14
+ callback :CPhidgetDictionary_set_OnError_Callback, [:dict, :pointer, :int, :string], :int
15
+ attach_function :CPhidgetDictionary_set_OnError_Handler, [:dict, :CPhidgetDictionary_set_OnError_Callback, :pointer], :int #int CPhidgetDictionary_set_OnError_Handler(CPhidgetDictionaryHandle dict, int( *fptr)(CPhidgetDictionaryHandle, void *userPtr, int errorCode, const char *errorString), void *userPtr);
16
+ attach_function :CPhidgetDictionary_addKey, [:dict, :string, :string, :int], :int #int CPhidgetDictionary_addKey(CPhidgetDictionaryHandle dict, const char *key, const char *value, int persistent);
17
+ attach_function :CPhidgetDictionary_removeKey, [:dict, :string], :int #int CPhidgetDictionary_removeKey(CPhidgetDictionaryHandle dict, const char *pattern);
18
+ attach_function :CPhidgetDictionary_getKey, [:dict, :string, :pointer, :int], :int #int CPhidgetDictionary_getKey(CPhidgetDictionaryHandle dict, const char *key, char *value, int valuelen);
19
+ callback :CPhidgetDictionary_set_OnServerConnect_Callback, [:dict, :pointer], :int
20
+ attach_function :CPhidgetDictionary_set_OnServerConnect_Handler, [:dict, :CPhidgetDictionary_set_OnServerConnect_Callback, :pointer], :int #int CPhidgetDictionary_set_OnServerConnect_Handler(CPhidgetDictionaryHandle dict, int ( *fptr)(CPhidgetDictionaryHandle dict, void *userPtr), void *userPtr);
21
+ callback :CPhidgetDictionary_set_OnServerDisconnect_Callback, [:dict, :pointer], :int
22
+ attach_function :CPhidgetDictionary_set_OnServerDisconnect_Handler, [:dict, :CPhidgetDictionary_set_OnServerDisconnect_Callback, :pointer], :int #int CPhidgetDictionary_set_OnServerDisconnect_Handler(CPhidgetDictionaryHandle dict, int ( *fptr)(CPhidgetDictionaryHandle dict, void *userPtr), void *userPtr);
23
+ attach_function :CPhidgetDictionary_getServerID, [:dict, :pointer], :int #int CPhidgetDictionary_getServerID(CPhidgetDictionaryHandle dict, const char **serverID);
24
+ attach_function :CPhidgetDictionary_getServerAddress, [:dict, :pointer, :pointer], :int #int CPhidgetDictionary_getServerAddress(CPhidgetDictionaryHandle dict, const char **address, int *port);
25
+ attach_function :CPhidgetDictionary_getServerStatus, [:dict, :pointer], :int #int CPhidgetDictionary_getServerStatus(CPhidgetDictionaryHandle dict, int *serverStatus);
26
+ attach_function :CPhidgetDictionary_openRemote, [:dict, :string, :string], :int #int CPhidgetDictionary_openRemote(CPhidgetDictionaryHandle dict, const char *serverID, const char *password);
27
+ attach_function :CPhidgetDictionary_openRemoteIP, [:dict, :string, :int, :string], :int #int CPhidgetDictionary_openRemoteIP(CPhidgetDictionaryHandle dict, const char *address, int port, const char *password);
28
+ callback :CPhidgetDictionary_set_OnKeyChange_Callback, [:dict, :pointer, :string, :string, KeyChangeReason], :int
29
+ attach_function :CPhidgetDictionary_set_OnKeyChange_Handler, [:dict, :pointer, :string, :CPhidgetDictionary_set_OnKeyChange_Callback, :pointer], :int #int CPhidgetDictionary_set_OnKeyChange_Handler(CPhidgetDictionaryHandle dict, CPhidgetDictionaryListenerHandle *dictlistener, const char *pattern, CPhidgetDictionary_OnKeyChange_Function fptr, void *userPtr);
30
+ attach_function :CPhidgetDictionary_remove_OnKeyChange_Handler, [:dict], :int #int CPhidgetDictionary_remove_OnKeyChange_Handler(CPhidgetDictionaryListenerHandle dictlistener);
31
+
32
+ module CPhidgetDictionary
33
+ def self.method_missing(method, *args, &block)
34
+ if ::Phidgets::FFI.respond_to?("CPhidgetDictionary_#{method}".to_sym)
35
+ if (rs = ::Phidgets::FFI.send("CPhidgetDictionary_#{method}".to_sym, *args, &block)) != 0
36
+ raise Phidgets::Error.exception_for(rs), Phidgets::FFI.error_description(rs)
37
+ end
38
+ else
39
+ super(method, *args, &block)
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,39 @@
1
+ module Phidgets
2
+ module FFI
3
+ attach_function :CPhidgetInterfaceKit_create, [:phid], :int #int CPhidgetInterfaceKit_create(CPhidgetInterfaceKitHandle *phid);
4
+ attach_function :CPhidgetInterfaceKit_getInputCount, [:phid, :pointer], :int #int CPhidgetInterfaceKit_getInputCount(CPhidgetInterfaceKitHandle phid, int *count);
5
+ attach_function :CPhidgetInterfaceKit_getInputState, [:phid, :int, :pointer], :int #int CPhidgetInterfaceKit_getInputState(CPhidgetInterfaceKitHandle phid, int index, int *inputState);
6
+ callback :CPhidgetInterfaceKit_set_OnInputChange_Callback, [:phid, :user_ptr, :int, :int], :int
7
+ attach_function :CPhidgetInterfaceKit_set_OnInputChange_Handler, [:phid, :CPhidgetInterfaceKit_set_OnInputChange_Callback, :user_ptr], :int #int CPhidgetInterfaceKit_set_OnInputChange_Handler(CPhidgetInterfaceKitHandle phid, int ( *fptr)(CPhidgetInterfaceKitHandle phid, void *userPtr, int index, int inputState), void *userPtr);
8
+ attach_function :CPhidgetInterfaceKit_getOutputCount, [:phid, :pointer], :int #int CPhidgetInterfaceKit_getOutputCount(CPhidgetInterfaceKitHandle phid, int *count);
9
+ attach_function :CPhidgetInterfaceKit_getOutputState, [:phid, :int, :pointer], :int #int CPhidgetInterfaceKit_getOutputState(CPhidgetInterfaceKitHandle phid, int index, int *outputState);
10
+ attach_function :CPhidgetInterfaceKit_setOutputState, [:phid, :int, :int], :int #int CPhidgetInterfaceKit_setOutputState(CPhidgetInterfaceKitHandle phid, int index, int outputState);
11
+ callback :CPhidgetInterfaceKit_set_OnOutputChange_Callback, [:phid, :user_ptr, :int, :int], :int
12
+ attach_function :CPhidgetInterfaceKit_set_OnOutputChange_Handler, [:phid, :CPhidgetInterfaceKit_set_OnOutputChange_Callback, :user_ptr], :int #int CPhidgetInterfaceKit_set_OnOutputChange_Handler(CPhidgetInterfaceKitHandle phid, int ( *fptr)(CPhidgetInterfaceKitHandle phid, void *userPtr, int index, int outputState), void *userPtr);
13
+ attach_function :CPhidgetInterfaceKit_getSensorCount, [:phid, :pointer], :int #int CPhidgetInterfaceKit_getSensorCount(CPhidgetInterfaceKitHandle phid, int *count);
14
+ attach_function :CPhidgetInterfaceKit_getSensorValue, [:phid, :int, :pointer], :int #int CPhidgetInterfaceKit_getSensorValue(CPhidgetInterfaceKitHandle phid, int index, int *sensorValue);
15
+ attach_function :CPhidgetInterfaceKit_getSensorRawValue, [:phid, :int, :pointer], :int #int CPhidgetInterfaceKit_getSensorRawValue(CPhidgetInterfaceKitHandle phid, int index, int *sensorRawValue);
16
+ callback :CPhidgetInterfaceKit_set_OnSensorChange_Callback, [:phid, :user_ptr, :int, :int], :int
17
+ attach_function :CPhidgetInterfaceKit_set_OnSensorChange_Handler, [:phid, :CPhidgetInterfaceKit_set_OnSensorChange_Callback, :user_ptr], :int #int CPhidgetInterfaceKit_set_OnSensorChange_Handler(CPhidgetInterfaceKitHandle phid, int ( *fptr)(CPhidgetInterfaceKitHandle phid, void *userPtr, int index, int sensorValue), void *userPtr);
18
+ attach_function :CPhidgetInterfaceKit_getSensorChangeTrigger, [:phid, :int, :pointer], :int #int CPhidgetInterfaceKit_getSensorChangeTrigger(CPhidgetInterfaceKitHandle phid, int index, int *trigger);
19
+ attach_function :CPhidgetInterfaceKit_setSensorChangeTrigger, [:phid, :int, :int], :int #int CPhidgetInterfaceKit_setSensorChangeTrigger(CPhidgetInterfaceKitHandle phid, int index, int trigger);
20
+ attach_function :CPhidgetInterfaceKit_getRatiometric, [:phid, :pointer], :int #int CPhidgetInterfaceKit_getRatiometric(CPhidgetInterfaceKitHandle phid, int *ratiometric);
21
+ attach_function :CPhidgetInterfaceKit_setRatiometric, [:phid, :int], :int #int CPhidgetInterfaceKit_setRatiometric(CPhidgetInterfaceKitHandle phid, int ratiometric);
22
+ attach_function :CPhidgetInterfaceKit_getDataRate, [:phid, :int, :pointer], :int #int CPhidgetInterfaceKit_getDataRate(CPhidgetInterfaceKitHandle phid, int index, int *milliseconds);
23
+ attach_function :CPhidgetInterfaceKit_setDataRate, [:phid, :int, :int], :int #int CPhidgetInterfaceKit_setDataRate(CPhidgetInterfaceKitHandle phid, int index, int milliseconds);
24
+ attach_function :CPhidgetInterfaceKit_getDataRateMax, [:phid, :int, :pointer], :int #int CPhidgetInterfaceKit_getDataRateMax(CPhidgetInterfaceKitHandle phid, int index, int *max);
25
+ attach_function :CPhidgetInterfaceKit_getDataRateMin, [:phid, :int, :pointer], :int #int CPhidgetInterfaceKit_getDataRateMin(CPhidgetInterfaceKitHandle phid, int index, int *min);
26
+
27
+ module CPhidgetInterfaceKit
28
+ def self.method_missing(method, *args, &block)
29
+ if ::Phidgets::FFI.respond_to?("CPhidgetInterfaceKit_#{method}".to_sym)
30
+ if (rs = ::Phidgets::FFI.send("CPhidgetInterfaceKit_#{method}".to_sym, *args, &block)) != 0
31
+ raise Phidgets::Error.exception_for(rs), Phidgets::FFI.error_description(rs)
32
+ end
33
+ else
34
+ super(method, *args, &block)
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,36 @@
1
+ module Phidgets
2
+ module FFI
3
+ LogLevel = enum(
4
+ :critical, 1,
5
+ :error,
6
+ :warning,
7
+ :debug,
8
+ :info,
9
+ :verbose
10
+ )
11
+
12
+ attach_function :CPhidget_enableLogging, [LogLevel, :string], :int #int CPhidget_enableLogging(CPhidgetLog_level level, const char *outputFile);
13
+ attach_function :CPhidget_disableLogging, [], :int #int CPhidget_disableLogging();
14
+ attach_function :CPhidget_log, [LogLevel, :string, :string, :varargs], :int #int CPhidget_log(CPhidgetLog_level level, const char *id, const char *message, ...);
15
+
16
+ module Log
17
+ def self.log(loglevel, identifier, message, *args)
18
+ if !args.empty?
19
+ ::Phidgets::FFI::CPhidget_log(loglevel, identifier, message, *args.to_varargs)
20
+ else
21
+ ::Phidgets::FFI::CPhidget_log(loglevel, identifier, message)
22
+ end
23
+ end
24
+
25
+ def self.method_missing(method, *args, &block)
26
+ if ::Phidgets::FFI.respond_to?("CPhidget_#{method}".to_sym)
27
+ if (rs = ::Phidgets::FFI.send("CPhidget_#{method}".to_sym, *args, &block)) != 0
28
+ raise Phidgets::Error.exception_for(rs), Phidgets::FFI.error_description(rs)
29
+ end
30
+ else
31
+ super(method, *args, &block)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,36 @@
1
+ module Phidgets
2
+ module FFI
3
+ typedef :pointer, :phidm
4
+
5
+ attach_function :CPhidgetManager_create, [:phidm], :int #int CPhidgetManager_create(CPhidgetManagerHandle *phidm);
6
+ attach_function :CPhidgetManager_open, [:phidm], :int #int CPhidgetManager_open(CPhidgetManagerHandle phidm);
7
+ attach_function :CPhidgetManager_close, [:phidm], :int #int CPhidgetManager_close(CPhidgetManagerHandle phidm);
8
+ attach_function :CPhidgetManager_delete, [:phidm], :int #int CPhidgetManager_delete(CPhidgetManagerHandle phidm);
9
+ callback :CPhidgetManager_set_OnAttach_Callback, [:phid, :user_ptr], :int
10
+ attach_function :CPhidgetManager_set_OnAttach_Handler, [:phidm, :CPhidgetManager_set_OnAttach_Callback, :user_ptr], :int #int CPhidgetManager_set_OnAttach_Handler(CPhidgetManagerHandle phidm, int ( *fptr)(CPhidgetHandle phid, void *userPtr), void *userPtr);
11
+ callback :CPhidgetManager_set_OnDetach_Callback, [:phid, :user_ptr], :int
12
+ attach_function :CPhidgetManager_set_OnDetach_Handler, [:phidm, :CPhidgetManager_set_OnDetach_Callback, :user_ptr], :int #int CPhidgetManager_set_OnDetach_Handler(CPhidgetManagerHandle phidm, int ( *fptr)(CPhidgetHandle phid, void *userPtr), void *userPtr);
13
+ attach_function :CPhidgetManager_getAttachedDevices, [:phidm, :pointer, :pointer], :int #int CPhidgetManager_getAttachedDevices(CPhidgetManagerHandle phidm, CPhidgetHandle *phidArray[], int *count);
14
+ attach_function :CPhidgetManager_freeAttachedDevicesArray, [:pointer], :int #int CPhidgetManager_freeAttachedDevicesArray(CPhidgetHandle phidArray[]);
15
+ callback :CPhidgetManager_set_OnError_Callback, [:phidm, :user_ptr, :int, :string], :int
16
+ attach_function :CPhidgetManager_set_OnError_Handler, [:phidm, :CPhidgetManager_set_OnError_Callback, :user_ptr], :int #int CPhidgetManager_set_OnError_Handler(CPhidgetManagerHandle phidm, int( *fptr)(CPhidgetManagerHandle phidm, void *userPtr, int errorCode, const char *errorString), void *userPtr);
17
+ callback :CPhidgetManager_set_OnServerConnect_Callback, [:phidm, :user_ptr], :int
18
+ attach_function :CPhidgetManager_set_OnServerConnect_Handler, [:phidm, :CPhidgetManager_set_OnServerConnect_Callback, :user_ptr], :int #int CPhidgetManager_set_OnServerConnect_Handler(CPhidgetManagerHandle phidm, int ( *fptr)(CPhidgetManagerHandle phidm, void *userPtr), void *userPtr);
19
+ callback :CPhidgetManager_set_OnServerDisconnect_Callback, [:phidm, :user_ptr], :int
20
+ attach_function :CPhidgetManager_set_OnServerDisconnect_Handler, [:phidm, :CPhidgetManager_set_OnServerDisconnect_Callback, :user_ptr], :int #int CPhidgetManager_set_OnServerDisconnect_Handler(CPhidgetManagerHandle phidm, int ( *fptr)(CPhidgetManagerHandle phidm, void *userPtr), void *userPtr);
21
+ attach_function :CPhidgetManager_getServerID, [:phidm, :pointer], :int #int CPhidgetManager_getServerID(CPhidgetManagerHandle phidm, const char **serverID);
22
+ attach_function :CPhidgetManager_getServerAddress, [:phidm, :pointer, :pointer], :int#int CPhidgetManager_getServerAddress(CPhidgetManagerHandle phidm, const char **address, int *port);
23
+
24
+ module CPhidgetManager
25
+ def self.method_missing(method, *args, &block)
26
+ if ::Phidgets::FFI.respond_to?("CPhidgetManager_#{method}".to_sym)
27
+ if (rs = ::Phidgets::FFI.send("CPhidgetManager_#{method}".to_sym, *args, &block)) != 0
28
+ raise Phidgets::Error.exception_for(rs), Phidgets::FFI.error_description(rs)
29
+ end
30
+ else
31
+ super(method, *args, &block)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,50 @@
1
+ module Phidgets
2
+ module FFI
3
+ ServoType = enum(
4
+ :default, 1,
5
+ :raw_us_mode,
6
+ :hitec_hs322hd,
7
+ :hitec_hS5245mg,
8
+ :hitec_805bb,
9
+ :hitec_hs422,
10
+ :towerpro_mg90,
11
+ :hitec_hsr1425cr,
12
+ :hitec_hs785hb,
13
+ :hitec_hs485hb,
14
+ :hitec_hs645mg,
15
+ :hitec_815bb,
16
+ :firgelli_l12_30_50_06_r,
17
+ :firgelli_l12_50_100_06_r,
18
+ :firgelli_l12_50_210_06_r,
19
+ :firgelli_l12_100_50_06_r,
20
+ :firgelli_l12_100_100_06_r,
21
+ :user_defind
22
+ )
23
+
24
+ attach_function :CPhidgetServo_create, [:phid], :int #int CPhidgetServo_create(CPhidgetServoHandle *phid);
25
+ attach_function :CPhidgetServo_getMotorCount, [:phid, :pointer], :int # int CPhidgetServo_getMotorCount(CPhidgetServoHandle phid, int *count);
26
+ attach_function :CPhidgetServo_getPosition, [:phid, :int, :pointer], :int #int CPhidgetServo_getPosition(CPhidgetServoHandle phid, int index, double *position);
27
+ attach_function :CPhidgetServo_setPosition, [:phid, :int, :double], :int #int CPhidgetServo_setPosition(CPhidgetServoHandle phid, int index, double position);
28
+ attach_function :CPhidgetServo_getPositionMax, [:phid, :int, :pointer], :int #int CPhidgetServo_getPositionMax(CPhidgetServoHandle phid, int index, double *max);
29
+ attach_function :CPhidgetServo_getPositionMin, [:phid, :int, :pointer], :int #int CPhidgetServo_getPositionMin(CPhidgetServoHandle phid, int index, double *min);
30
+ callback :CPhidgetServo_set_OnPositionChange_Callback, [:phid, :user_ptr, :int, :double], :int
31
+ attach_function :CPhidgetServo_set_OnPositionChange_Handler, [:phid, :CPhidgetServo_set_OnPositionChange_Callback, :user_ptr], :int #int CPhidgetServo_set_OnPositionChange_Handler(CPhidgetServoHandle phid, int ( *fptr)(CPhidgetServoHandle phid, void *userPtr, int index, double position), void *userPtr);
32
+ attach_function :CPhidgetServo_getEngaged, [:phid, :int, :pointer], :int #int CPhidgetServo_getEngaged(CPhidgetServoHandle phid, int index, int *engagedState);
33
+ attach_function :CPhidgetServo_setEngaged, [:phid, :int, :int], :int #int CPhidgetServo_setEngaged(CPhidgetServoHandle phid, int index, int engagedState);
34
+ attach_function :CPhidgetServo_getServoType, [:phid, :int, :pointer], :int #int CPhidgetServo_getServoType(CPhidgetServoHandle phid, int index, CPhidget_ServoType *servoType);
35
+ attach_function :CPhidgetServo_setServoType, [:phid, :int, ServoType], :int #int CPhidgetServo_setServoType(CPhidgetServoHandle phid, int index, CPhidget_ServoType servoType);
36
+ attach_function :CPhidgetServo_setServoParameters, [:phid, :int, :double, :double, :double], :int #int CPhidgetServo_setServoParameters(CPhidgetServoHandle phid, int index, double min_us,double max_us,double degrees);
37
+
38
+ module CPhidgetServo
39
+ def self.method_missing(method, *args, &block)
40
+ if ::Phidgets::FFI.respond_to?("CPhidgetServo_#{method}".to_sym)
41
+ if (rs = ::Phidgets::FFI.send("CPhidgetServo_#{method}".to_sym, *args, &block)) != 0
42
+ raise Phidgets::Error.exception_for(rs), Phidgets::FFI.error_description(rs)
43
+ end
44
+ else
45
+ super(method, *args, &block)
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,212 @@
1
+ module Phidgets
2
+ class InterfaceKit
3
+
4
+ Klass = Phidgets::FFI::CPhidgetInterfaceKit
5
+ include Phidgets::Common
6
+
7
+ attr_reader :inputs, :outputs, :sensors
8
+
9
+ def initialize(serial_number=-1, &block)
10
+ create
11
+ open(serial_number)
12
+ wait_for_attachment
13
+ load_inputs
14
+ load_outputs
15
+ load_sensors
16
+ if block_given?
17
+ yield self
18
+ close
19
+ delete
20
+ end
21
+ end
22
+
23
+ def attributes
24
+ super.merge({
25
+ :inputs => inputs.size,
26
+ :outputs => outputs.size,
27
+ :sensors => sensors.size,
28
+ })
29
+ end
30
+
31
+ def on_input_change(obj=nil, &block)
32
+ @on_input_change_obj = obj
33
+ @on_input_change = Proc.new { |device, obj_ptr, index, state|
34
+ yield @inputs[index], (state == 0 ? false : true), object_for(obj_ptr)
35
+ }
36
+ Klass.set_OnInputChange_Handler(@handle, @on_input_change, pointer_for(obj))
37
+ end
38
+
39
+ def on_output_change(obj=nil, &block)
40
+ @on_output_change_obj = obj
41
+ @on_output_change = Proc.new { |device, obj_ptr, index, state|
42
+ yield @outputs[index], (state == 0 ? false : true), object_for(obj_ptr)
43
+ }
44
+ Klass.set_OnOutputChange_Handler(@handle, @on_output_change, pointer_for(obj))
45
+ end
46
+
47
+ def on_sensor_change(obj=nil, &block)
48
+ @on_sensor_change_obj = obj
49
+ @on_sensor_change = Proc.new { |device, obj_ptr, index, value|
50
+ yield @sensors[index], value, object_for(obj_ptr)
51
+ }
52
+ Klass.set_OnSensorChange_Handler(@handle, @on_sensor_change, pointer_for(obj))
53
+ end
54
+
55
+ def ratiometric
56
+ ptr = ::FFI::MemoryPointer.new(:int)
57
+ Klass.getRatiometric(@handle, ptr)
58
+ (ptr.get_int(0) == 0) ? false : true
59
+ end
60
+ alias_method :ratiometric?, :ratiometric
61
+
62
+ def ratiometric=(val)
63
+ tmp = val ? 1 : 0
64
+ Klass.setRatiometric(@handle, tmp)
65
+
66
+ val
67
+ end
68
+ private
69
+
70
+ def load_inputs
71
+ ptr = ::FFI::MemoryPointer.new(:int)
72
+ Klass.getInputCount(@handle, ptr)
73
+
74
+ @inputs = []
75
+ ptr.get_int(0).times do |i|
76
+ @inputs << InterfaceKitInput.new(@handle, i)
77
+ end
78
+ end
79
+
80
+ def load_outputs
81
+ ptr = ::FFI::MemoryPointer.new(:int)
82
+ Klass.getOutputCount(@handle, ptr)
83
+
84
+ @outputs = []
85
+ ptr.get_int(0).times do |i|
86
+ @outputs << InterfaceKitOutput.new(@handle, i)
87
+ end
88
+ end
89
+
90
+ def load_sensors
91
+ ptr = ::FFI::MemoryPointer.new(:int)
92
+ Klass.getSensorCount(@handle, ptr)
93
+
94
+ @sensors = []
95
+ ptr.get_int(0).times do |i|
96
+ @sensors << InterfaceKitSensor.new(@handle, i)
97
+ end
98
+ end
99
+ end
100
+
101
+ class InterfaceKitInput
102
+ Klass = Phidgets::FFI::CPhidgetInterfaceKit
103
+
104
+ attr_reader :index
105
+
106
+ def initialize(handle, index)
107
+ @handle, @index = handle, index.to_i
108
+ end
109
+
110
+ def state
111
+ ptr = ::FFI::MemoryPointer.new(:int)
112
+ Klass.getInputState(@handle, @index, ptr)
113
+ (ptr.get_int(0) == 0) ? false : true
114
+ end
115
+ end
116
+
117
+ class InterfaceKitOutput
118
+ Klass = Phidgets::FFI::CPhidgetInterfaceKit
119
+
120
+ attr_reader :index
121
+
122
+ def initialize(handle, index)
123
+ @handle, @index = handle, index.to_i
124
+ end
125
+
126
+ def state=(val)
127
+ tmp = val ? 1 : 0
128
+ Klass.setOutputState(@handle, @index, tmp)
129
+
130
+ val
131
+ end
132
+
133
+ def state
134
+ ptr = ::FFI::MemoryPointer.new(:int)
135
+ Klass.getOutputState(@handle, @index, ptr)
136
+ (ptr.get_int(0) == 0) ? false : true
137
+ end
138
+
139
+ def on
140
+ state == true
141
+ end
142
+ alias_method :on?, :state
143
+
144
+ def off
145
+ !on
146
+ end
147
+ alias_method :off?, :off
148
+ end
149
+
150
+ class InterfaceKitSensor
151
+ Klass = Phidgets::FFI::CPhidgetInterfaceKit
152
+
153
+ attr_reader :index
154
+
155
+ def initialize(handle, index)
156
+ @handle, @index = handle, index.to_i
157
+ end
158
+
159
+ def inspect
160
+ "#<#{self.class} @value=#{value}, @raw_value=#{raw_value}, @rate=#{rate}, @trigger=#{trigger}, @max_rate=#{max_rate}, @min_rate=#{min_rate}>"
161
+ end
162
+
163
+ def value
164
+ ptr = ::FFI::MemoryPointer.new(:int)
165
+ Klass.getSensorValue(@handle, @index, ptr)
166
+ ptr.get_int(0)
167
+ end
168
+ alias_method :to_i, :value
169
+
170
+ def raw_value
171
+ ptr = ::FFI::MemoryPointer.new(:int)
172
+ Klass.getSensorRawValue(@handle, @index, ptr)
173
+ ptr.get_int(0)
174
+ end
175
+
176
+ def trigger
177
+ ptr = ::FFI::MemoryPointer.new(:int)
178
+ Klass.getSensorChangeTrigger(@handle, @index, ptr)
179
+ ptr.get_int(0)
180
+ end
181
+
182
+ def trigger=(val)
183
+ Klass.setSensorChangeTrigger(@handle, @index, val.to_i)
184
+
185
+ val.to_i
186
+ end
187
+
188
+ def max_rate
189
+ ptr = ::FFI::MemoryPointer.new(:int)
190
+ Klass.getDataRateMax(@handle, @index, ptr)
191
+ ptr.get_int(0)
192
+ end
193
+
194
+ def min_rate
195
+ ptr = ::FFI::MemoryPointer.new(:int)
196
+ Klass.getDataRateMin(@handle, @index, ptr)
197
+ ptr.get_int(0)
198
+ end
199
+
200
+ def rate
201
+ ptr = ::FFI::MemoryPointer.new(:int)
202
+ Klass.getDataRate(@handle, @index, ptr)
203
+ ptr.get_int(0)
204
+ end
205
+
206
+ def rate=(val)
207
+ Klass.setDataRate(@handle, @index, val.to_i)
208
+
209
+ val.to_i
210
+ end
211
+ end
212
+ end