Hello, all,
     I am so pleased to be on the mail list and hope to be able to 
contribute to the project.
I have enjoyed the benefits of comtypes over other solutions very much 
and had great success on XP + Python 2.5
I am currently working on Windows 7, Python 2.6.5, comtypes 0.6.2. (or 
whatever the latest fetch from CVS was (thank you, Thomas for all your 
hard work).
     My current undertaking is wrapping the SensorAPI - 
http://msdn.microsoft.com/en-us/library/dd318953%28VS.85%29.aspx which 
does not have an associated typelib (yet?) and does not support 
TypeInfo.  I generated most of the components from the sibling 
LocationAPI and have hand written the rest of the interface.  I am 
currenly implementing the SensorDevKitDiagnosticApp in wxPython.

The trickiest thing has been getting events to hookup and release 
properly.  I have complete initial testing and am quite happy with the 
results.
I can also share my wx subclasses if anyone is interested.  Here's the 
pure python part:


## Forward Declaration
##
##    MIDL_INTERFACE("5D8DCC91-4641-47E7-B7C3-B74F48A6C391")
##    ISensorEvents : public IUnknown
##    {
class ISensorEvents(IUnknown):
     _iid_ = GUID("{5D8DCC91-4641-47E7-B7C3-B74F48A6C391}")

##    MIDL_INTERFACE("5FA08F80-2657-458E-AF75-46F73FA6AC5C")
##    ISensor : public IUnknown
##    {
class ISensor(IUnknown):
     _iid_ = GUID("{5FA08F80-2657-458E-AF75-46F73FA6AC5C}")
     _methods_ = [...]

ISensorEvents._methods_ = [
##    public:
##        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE 
OnStateChanged(
##            /* [in] */ __RPC__in_opt ISensor *pSensor,
##            /* [in] */ SensorState state) = 0;
     COMMETHOD([helpstring(u'method OnStateChanged')], HRESULT, 
'OnStateChanged',
               ( ['in'], POINTER(ISensor), 'pSensor' ),
               ( ['in'], SensorStateEnum, 'state' )),
##        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE 
OnDataUpdated(
##            /* [in] */ __RPC__in_opt ISensor *pSensor,
##            /* [in] */ __RPC__in_opt ISensorDataReport *pNewData) = 0;
     COMMETHOD([helpstring(u'method OnDataUpdated')], HRESULT, 
'OnDataUpdated',
               ( ['in'], POINTER(ISensor), 'pSensor' ),
               ( ['in'], POINTER(ISensorDataReport), 'pNewData' )),
##        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnEvent(
##            /* [in] */ __RPC__in_opt ISensor *pSensor,
##            /* [in] */ __RPC__in REFGUID eventID,
##            /* [in] */ __RPC__in_opt IPortableDeviceValues 
*pEventData) = 0;
     COMMETHOD([helpstring(u'method OnEvent')], HRESULT, 'OnEvent',
               ( ['in'], POINTER(ISensor), 'pSensor' ),
               ( ['in'], REFGUID, 'eventID' ),
               ( ['in'], POINTER(IPortableDeviceValues), 'pEventData' )),
##        virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE OnLeave(
##            /* [in] */ __RPC__in REFSENSOR_ID ID) = 0;
     COMMETHOD([helpstring(u'method OnLeave')], HRESULT, 'OnLeave',
               ( ['out'], POINTER(SENSOR_ID), 'pID' )),
##    };
               ]

class SensorEventsBase(COMObject):
     u'SensorEvents Class'
     _com_interfaces_ = [ISensorEvents]

     def OnStateChanged(self, this, *args):
         print "OnStateChanged", args

     def OnDataUpdated(self, this, *args):
         print "OnDataUpdated", args

     def OnEvent(self, this, *args):
         print "OnEvent", args

     def OnLeave(self, this, *args):
         print "OnLeave", args


def SensorManager():
     ##    hr = CoCreateInstance( __uuidof(SensorManager), 
//CLSID_SensorManager,
     ##                    NULL,
     ##                    CLSCTX_INPROC_SERVER,
     ##                    __uuidof(ISensorManager), //IID_ISensorManager,
     ##                    (LPVOID*)&this->m_pSensorManager );
     return CoCreateInstance(CLSID_SensorManager, ISensorManager, 
CLSCTX_INPROC_SERVER)

sm = SensorManager()
sensCollPtr = sm.GetSensorsByType(SENSOR_TYPE_ACCELEROMETER_3D)
Accelerometer = sensCollPtr.GetAt(0)
Accelerometer.SetEventSink(SensorEventsBase())    # no need to keep a 
reference to the sink

In order for the sink to be released properly, the sensor must be told 
to stop delivering events:
nullEvtSink = POINTER(ISensorEvents)()
Accelerometer.SetEventSink(nullEvtSink)

I hope to generate some interest in this project and share my interface 
files,
Barton

------------------------------------------------------------------------------
Download Intel® Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
comtypes-users mailing list
comtypes-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/comtypes-users

Reply via email to