public MultiClampCommander(uint serialNumber, uint channel, IClock clock)
        {
            SerialNumber = serialNumber;
            Channel      = channel;
            Clock        = clock;

            UInt32 lParam = MulticlampInterop.MCTG_Pack700BSignalIDs(this.SerialNumber, this.Channel); // Pack the above two into an UInt32
            int    result = Win32Interop.PostMessage(Win32Interop.HWND_BROADCAST, MulticlampInterop.MCTG_OPEN_MESSAGE, (IntPtr)Win32Interop.MessageEvents.WindowHandle, (IntPtr)lParam);

            Win32Interop.MessageEvents.WatchMessage(Win32Interop.WM_COPYDATA, (sender, evtArgs) =>
            {
                // WM_COPYDATA LPARAM is a pointer to a COPYDATASTRUCT structure
                Win32Interop.COPYDATASTRUCT cds;
                cds = (Win32Interop.COPYDATASTRUCT)
                      Marshal.PtrToStructure(evtArgs.Message.LParam, typeof(Win32Interop.COPYDATASTRUCT));

                // WM_COPYDATA structure (COPYDATASTRUCT)
                // dwData -- RegisterWindowMessage(MCTG_REQUEST_MESSAGE_STR)
                // cbData -- size (in bytes) of the MC_TELEGRAPH_DATA structure being sent
                // lpData -- MC_TELEGRAPH_DATA*
                MulticlampInterop.MC_TELEGRAPH_DATA mtd;
                mtd    = (MulticlampInterop.MC_TELEGRAPH_DATA)Marshal.PtrToStructure(cds.lpData, typeof(MulticlampInterop.MC_TELEGRAPH_DATA));
                var md = new MulticlampInterop.MulticlampData(mtd);

                OnParametersChanged(md);
            });
        }
Esempio n. 2
0
        private static void OpenMultiClampConversation(uint lParam)
        {
            log.Debug("Opening MultiClamp conversation...");
            int result = Win32Interop.PostMessage(Win32Interop.HWND_BROADCAST, MultiClampInterop.MCTG_OPEN_MESSAGE,
                                                  (IntPtr)Win32Interop.MessageEvents.WindowHandle, (IntPtr)lParam);

            log.DebugFormat("  result = {0}", result);
        }
Esempio n. 3
0
        private static void RequestTelegraphValue(uint lParam)
        {
            log.Debug("Requesting telegraph data...");
            int result = Win32Interop.PostMessage(Win32Interop.HWND_BROADCAST, MultiClampInterop.MCTG_REQUEST_MESSAGE,
                                                  (IntPtr)Win32Interop.MessageEvents.WindowHandle, (IntPtr)lParam);

            log.DebugFormat("  result = {0}", result);
        }
        void Dispose(bool disposing)
        {
            if (!this._disposed)
            {
                UInt32 lParam = MulticlampInterop.MCTG_Pack700BSignalIDs(this.SerialNumber, this.Channel); // Pack the above two into an UInt32
                int    result = Win32Interop.PostMessage(Win32Interop.HWND_BROADCAST, MulticlampInterop.MCTG_CLOSE_MESSAGE, (IntPtr)Win32Interop.MessageEvents.WindowHandle, (IntPtr)lParam);

                // Note disposing has been done.
                _disposed = true;
            }
        }
Esempio n. 5
0
        void Dispose(bool disposing)
        {
            if (!this._disposed)
            {
                if (disposing)
                {
                    //Handle manage object disposal

                    // This object will be cleaned up by the Dispose method.
                    // Therefore, you should call GC.SupressFinalize to
                    // take this object off the finalization queue
                    // and prevent finalization code for this object
                    // from executing a second time.
                    GC.SuppressFinalize(this);
                }

                UInt32 lParam = MultiClampInterop.MCTG_Pack700BSignalIDs(this.SerialNumber, this.Channel); // Pack the above two into an UInt32
                int    result = Win32Interop.PostMessage(Win32Interop.HWND_BROADCAST, MultiClampInterop.MCTG_CLOSE_MESSAGE, (IntPtr)Win32Interop.MessageEvents.WindowHandle, (IntPtr)lParam);

                // Note disposing has been done.
                _disposed = true;
            }
        }
        private void ReceiveWmCopyDataEvent(object sender, Win32Interop.MessageReceivedEventArgs evtArgs)
        {
            // WM_COPYDATA LPARAM is a pointer to a COPYDATASTRUCT structure
            Win32Interop.COPYDATASTRUCT cds = (Win32Interop.COPYDATASTRUCT) Marshal.PtrToStructure(evtArgs.Message.LParam, typeof (Win32Interop.COPYDATASTRUCT));

            // WM_COPYDATA structure (COPYDATASTRUCT)
            // dwData -- RegisterWindowMessage(MCTG_REQUEST_MESSAGE_STR)
            // cbData -- size (in bytes) of the MC_TELEGRAPH_DATA structure being sent
            // lpData -- MC_TELEGRAPH_DATA*
            try
            {
                if (cds.lpData == IntPtr.Zero || (cds.cbData != 128 /* 700A */ && cds.cbData != 256 /* 700B */) || (long)cds.dwData != MultiClampInterop.MCTG_REQUEST_MESSAGE)
                    return;

                var mtd = (MultiClampInterop.MC_TELEGRAPH_DATA)Marshal.PtrToStructure(cds.lpData, typeof(MultiClampInterop.MC_TELEGRAPH_DATA));
                if (mtd.uChannelID != Channel)
                    return;

                // For some reason the hardware type can come through corrupted. The rest of the structure is intact however.
                if (mtd.uHardwareType != (uint)MultiClampInterop.HardwareType.MCTG_HW_TYPE_MC700A && mtd.uHardwareType != (uint)MultiClampInterop.HardwareType.MCTG_HW_TYPE_MC700B)
                {
                    log.Debug("Unknown hardware type in received message. Using device hardware type instead.");
                    mtd.uHardwareType = (uint)HardwareType;
                }
                if (mtd.uHardwareType != (uint)HardwareType)
                    return;

                var md = new MultiClampInterop.MulticlampData(mtd);

                log.Debug("WM_COPYDATA message received from MCCommander");
                OnParametersChanged(md);
            }
            catch (ArgumentOutOfRangeException)
            {
                log.ErrorFormat("WM_COPYDATA message received from MCCommander, but operating mode is not valid.");
                RequestTelegraphValue((uint) evtArgs.Message.LParam);
            }
        }
        private void ReceiveReconnectEvent(object sender, Win32Interop.MessageReceivedEventArgs evtArgs)
        {
            var lParam = DeviceLParam();
            if (evtArgs.Message.LParam != (IntPtr) lParam)
                return;

            log.DebugFormat("Received MCTG_RECONNECT_MESSAGE: {0}", evtArgs.Message);

            UnregisterForWmCopyDataEvents();
            UnregisterForReconnectEvents();

            OpenMultiClampConversation(lParam);
            RegisterForWmCopyDataEvents();
            RegisterForReconnectEvents();

            RequestTelegraphValue((uint) lParam);
        }
        private static void ReceiveIdEvent(object sender, Win32Interop.MessageReceivedEventArgs evtArgs)
        {
            log.DebugFormat("Received MCTG_ID_MESSAGE: {0}", evtArgs.Message);

            // Not aware of a good way to determine if this is a 700A or 700B messsage. We'll assume 700B and let
            // the user do some bitwise operators on the serial number to get the COM port and device number if they
            // know the message is coming from a 700A Commander.
            uint serialNumber;
            uint channel;
            MultiClampInterop.MCTG_Unpack700BSignalIDs((uint)evtArgs.Message.LParam, out serialNumber, out channel);

            availableSerialNumbers.Add(serialNumber);
        }