public void setNotificationListener(IntPtr sdkContext, UInt32 deviceID, bool isMasterDevice)
        {
            //TODO Configure zone to test alarm notification.

            //To test input detect notification.
            BS2TriggerActionConfig triggerActionConfig;

            Console.WriteLine("Trying to get trigger-action config.");
            BS2ErrorCode result = (BS2ErrorCode)API.BS2_GetTriggerActionConfig(sdkContext, deviceID, out triggerActionConfig);

            if (result != BS2ErrorCode.BS_SDK_SUCCESS)
            {
                Console.WriteLine("Got error({0}).", result);
                return;
            }

            triggerActionConfig.numItems = 1;
            triggerActionConfig.items[0].trigger.deviceID = deviceID;
            triggerActionConfig.items[0].trigger.type     = (byte)BS2TriggerTypeEnum.INPUT;

            BS2InputTrigger inputTrigger = Util.AllocateStructure <BS2InputTrigger>();

            inputTrigger.port       = 0;
            inputTrigger.switchType = (byte)BS2SwitchTypeEnum.NORMAL_OPEN;
            inputTrigger.duration   = 10;
            inputTrigger.scheduleID = (UInt32)BS2ScheduleIDEnum.ALWAYS;

            byte[] inputTriggerArray = Util.ConvertTo <BS2InputTrigger>(ref inputTrigger);
            Array.Clear(triggerActionConfig.items[0].trigger.triggerUnion, 0, triggerActionConfig.items[0].trigger.triggerUnion.Length);
            Array.Copy(inputTriggerArray, triggerActionConfig.items[0].trigger.triggerUnion, inputTriggerArray.Length);

            triggerActionConfig.items[0].action.deviceID = deviceID;
            triggerActionConfig.items[0].action.type     = (byte)BS2ActionTypeEnum.SOUND;

            BS2SoundAction soundAction = Util.AllocateStructure <BS2SoundAction>();

            soundAction.count      = 1;
            soundAction.soundIndex = (UInt16)BS2SoundIndexEnum.WELCOME;
            Array.Clear(soundAction.reserved, 0, soundAction.reserved.Length);

            byte[] inputActionArray = Util.ConvertTo <BS2SoundAction>(ref soundAction);
            Array.Clear(triggerActionConfig.items[0].action.actionUnion, 0, triggerActionConfig.items[0].action.actionUnion.Length);
            Array.Copy(inputActionArray, triggerActionConfig.items[0].action.actionUnion, inputActionArray.Length);

            Console.WriteLine("Trying to set trigger-action config.");
            result = (BS2ErrorCode)API.BS2_SetTriggerActionConfig(sdkContext, deviceID, ref triggerActionConfig);
            if (result != BS2ErrorCode.BS_SDK_SUCCESS)
            {
                Console.WriteLine("Got error({0}).", result);
                return;
            }

            Console.WriteLine("Trying to activate notification listening.");
            cbOnAlarmFired    = new API.OnAlarmFired(AlarmFired);
            cbOnInputDetected = new API.OnInputDetected(InputDetected);
            cbOnConfigChanged = new API.OnConfigChanged(ConfigChanged);
            result            = (BS2ErrorCode)API.BS2_SetNotificationListener(sdkContext, cbOnAlarmFired, cbOnInputDetected, cbOnConfigChanged);

            if (result != BS2ErrorCode.BS_SDK_SUCCESS)
            {
                Console.WriteLine("Got error({0}).", result);
                return;
            }

            Console.WriteLine("Press ESC to stop notification listening.");
            while (Console.ReadKey(true).Key != ConsoleKey.Escape)
            {
                Thread.Sleep(100);
            }

            Console.WriteLine("Trying to deactivate notification listening.");
            result = (BS2ErrorCode)API.BS2_SetNotificationListener(sdkContext, null, null, null);
            if (result != BS2ErrorCode.BS_SDK_SUCCESS)
            {
                Console.WriteLine("Got error({0}).", result);
            }

            cbOnAlarmFired    = null;
            cbOnInputDetected = null;
            cbOnConfigChanged = null;
        }
        public static string getActionMsg(BS2Action action)
        {
            BS2ActionTypeEnum actionType = (BS2ActionTypeEnum)action.type;

            switch (actionType)
            {
            case BS2ActionTypeEnum.NONE:
                return("Not specified");

            case BS2ActionTypeEnum.RELAY:
            {
                BS2RelayAction relay = Util.ConvertTo <BS2RelayAction>(action.actionUnion);
                return(String.Format("RelayAction relayIndex[{0}] signalID[{1}] count[{2}] onDuration[{3}ms] offDuration[{4}ms] delay[{5}ms]",
                                     relay.relayIndex,
                                     relay.signal.signalID,
                                     relay.signal.count,
                                     relay.signal.onDuration,
                                     relay.signal.offDuration,
                                     relay.signal.delay));
            }

            case BS2ActionTypeEnum.TTL:
            {
                BS2OutputPortAction outputPort = Util.ConvertTo <BS2OutputPortAction>(action.actionUnion);
                return(String.Format("OutputPortAction relayIndex[{0}] signalID[{1}] count[{2}] onDuration[{3}ms] offDuration[{4}ms] delay[{5}ms]",
                                     outputPort.portIndex,
                                     outputPort.signal.signalID,
                                     outputPort.signal.count,
                                     outputPort.signal.onDuration,
                                     outputPort.signal.offDuration,
                                     outputPort.signal.delay));
            }

            case BS2ActionTypeEnum.DISPLAY:
            {
                BS2DisplayAction display = Util.ConvertTo <BS2DisplayAction>(action.actionUnion);
                return(String.Format("DisplayAction displayID[{0}] resourceID[{1}] delay[{2}ms]",
                                     display.displayID,
                                     display.resourceID,
                                     display.duration));
            }

            case BS2ActionTypeEnum.SOUND:
            {
                BS2SoundAction sound = Util.ConvertTo <BS2SoundAction>(action.actionUnion);
                return(String.Format("SoundAction soundIndex[{0}] count[{1}]", sound.soundIndex, sound.count));
            }

            case BS2ActionTypeEnum.LED:
            {
                BS2LedAction led          = Util.ConvertTo <BS2LedAction>(action.actionUnion);
                string       ledSignalStr = "";
                for (int idx = 0; idx < BS2Environment.BS2_LED_SIGNAL_NUM; ++idx)
                {
                    ledSignalStr += String.Format("[color[{0}] duration[{1}ms] delay[{2}ms]]",
                                                  (BS2LedColorEnum)led.signal[idx].color,
                                                  led.signal[idx].duration,
                                                  led.signal[idx].delay);

                    if (idx + 1 < BS2Environment.BS2_LED_SIGNAL_NUM)
                    {
                        ledSignalStr += ", ";
                    }
                }

                return(String.Format("LedAction count[{0}] {1}", led.count, ledSignalStr));
            }

            case BS2ActionTypeEnum.BUZZER:
            {
                BS2BuzzerAction buzzer          = Util.ConvertTo <BS2BuzzerAction>(action.actionUnion);
                string          buzzerSignalStr = "";
                for (int idx = 0; idx < BS2Environment.BS2_BUZZER_SIGNAL_NUM; ++idx)
                {
                    buzzerSignalStr += String.Format("[tone[{0}] fadeout[{1}] duration[{2}ms] delay[{3}ms]]",
                                                     (BS2BuzzerToneEnum)buzzer.signal[idx].tone,
                                                     Convert.ToBoolean(buzzer.signal[idx].fadeout),
                                                     buzzer.signal[idx].duration,
                                                     buzzer.signal[idx].delay);

                    if (idx + 1 < BS2Environment.BS2_BUZZER_SIGNAL_NUM)
                    {
                        buzzerSignalStr += ", ";
                    }
                }

                return(String.Format("BuzzerAction count[{0}] {1}", buzzer.count, buzzerSignalStr));
            }

            case BS2ActionTypeEnum.LIFT:
            {
                BS2LiftAction lift = Util.ConvertTo <BS2LiftAction>(action.actionUnion);
                return(String.Format("LiftAction deviceID[{0}] type[{1}]", lift.liftID, (BS2LiftActionTypeEnum)lift.type));
            }

            default:
                return("Not implemented yet.");
            }
        }