예제 #1
0
        //private ActionToken controllerListener;

        //public void AddToQueue(Action action)
        //{
        //    queueItems.Add(action);
        //}

        public override bool Start()
        {
            Common.logger.Info("-----------");
            Common.logger.Info("Listening mode");
            Common.logger.Info("-----------");

            Common.logger.Info("Loading available command classes...");
            var assembly       = typeof(COMMAND_CLASS_BASIC).GetTypeInfo().Assembly;
            var commandClasses = Common.GetAllCommandClasses(assembly, "CommandClasses");

            Common.logger.Info("Got {0} command classes", commandClasses.Count);
            var nestedCommandClasses = Common.GetAllNestedCommandClasses(commandClasses.Values);

            Common.logger.Info("Got all inner command classes for {0} command classes", commandClasses.Count);
            Common.logger.Info("Listening...");

            //byte[] numArray = File.ReadAllBytes(@"C:\Users\james\Desktop\tmp\MultiSensor 6_OTA_EU_A_V1_13.exe");
            //int length = (int)numArray[numArray.Length - 4] << 24 | (int)numArray[numArray.Length - 3] << 16 | (int)numArray[numArray.Length - 2] << 8 | (int)numArray[numArray.Length - 1];
            //byte[] flashDataB = new byte[length];
            //Array.Copy((Array)numArray, numArray.Length - length - 4 - 4 - 256, (Array)flashDataB, 0, length);
            //List<byte> flashData = new List<byte>(flashDataB);

            dataListener = controller.ListenData((x) =>
            {
                lock (lockObject)
                {
                    var filterActive = Filter != 0 && Filter != x.SrcNodeId;

                    var _commandClass = commandClasses.TryGetValue(x.Command[0], out var commandClass);
                    if (!_commandClass)
                    {
                        Common.logger.Error("node id: {1} - command class {0} not found!", x.Command[0], x.SrcNodeId);
                        return;
                    }
                    var _nestedDict = nestedCommandClasses.TryGetValue(commandClass, out var nestedDict);
                    if (!_nestedDict)
                    {
                        Common.logger.Error("node id: {1} - nested command classes for command class {0} not found!", commandClass.Name, x.SrcNodeId);
                        return;
                    }
                    var _nestedType = nestedDict.TryGetValue(x.Command[1], out Type nestedType);
                    if (!_nestedType)
                    {
                        Common.logger.Error("node id: {2} - nested command class {0} for command class {1} not found!", x.Command[1], commandClass.Name, x.SrcNodeId);
                        return;
                    }

                    if (!filterActive)
                    {
                        Common.logger.Info("{0}: {2}:{3} from node {1}", x.TimeStamp, x.SrcNodeId, _commandClass ? commandClass.Name : string.Format("unknown(id:{0})", x.Command[0]), _nestedType ? nestedType.Name : string.Format("unknown(id:{0})", x.Command[1]));
                    }

                    if (commandClass == null)
                    {
                        Common.logger.Error("command class is null!");
                        return;
                    }
                    if (nestedType == null)
                    {
                        Common.logger.Error("nested type is null!");
                        return;
                    }

                    //     var dummyInstance = Activator.CreateInstance(nestedType);

                    var implicitCastMethod =
                        nestedType.GetMethod("op_Implicit",
                                             new[] { x.Command.GetType() });

                    if (implicitCastMethod == null)
                    {
                        Common.logger.Warn("byteArray to {0} not possible!", nestedType.Name);
                        return;
                    }
                    var report = implicitCastMethod.Invoke(null, new[] { x.Command });
                    report.GetKeyValue(out Enums.EventKey eventKey, out float eventValue);
                    Common.logger.Info($"key: {eventKey} - value: {eventValue}");

                    if (!filterActive && Debug)
                    {
                        Common.logger.Info(Util.ObjToJson(report));
                    }

                    if (!(report is COMMAND_CLASS_FIRMWARE_UPDATE_MD_V5.FIRMWARE_UPDATE_MD_GET))
                    {
                        OutputManager.HandleCommand(report, x.SrcNodeId, x.DestNodeId);
                    }

                    //    Handle(dummyInstance, x.SrcNodeId, x.Command);
                    if (!Active)
                    {
                        return;
                    }

                    //switch (report)
                    //{
                    //    case COMMAND_CLASS_WAKE_UP_V2.WAKE_UP_NOTIFICATION _:
                    //        // TODO EVENT, last Battery
                    //        var lastDate = eventDao.GetLastEvent(typeof(COMMAND_CLASS_BATTERY.BATTERY_REPORT).Name, x.SrcNodeId);
                    //        if ((DateTime.Now - lastDate).TotalHours >= 6)
                    //        {
                    //            queueItems.Add(() => Common.RequestBatteryReport(controller, x.SrcNodeId));
                    //        }

                    //        break;

                    //    //case COMMAND_CLASS_FIRMWARE_UPDATE_MD_V5.FIRMWARE_UPDATE_MD_GET fupdateReport:

                    //    //    var rep1 = fupdateReport.properties1.reportNumber1;
                    //    //    var rep2 = fupdateReport.reportNumber2;
                    //    //    var count = fupdateReport.numberOfReports;

                    //    //    queueItems.Add(() =>
                    //    //    {
                    //    //        var take = 40;
                    //    //        var cmd = new COMMAND_CLASS_FIRMWARE_UPDATE_MD_V2.FIRMWARE_UPDATE_MD_REPORT();
                    //    //        cmd.properties1.last = 0;
                    //    //        cmd.properties1.reportNumber1 = rep1;
                    //    //        cmd.reportNumber2 = rep2;
                    //    //        short repNumber = BitConverter.ToInt16(new byte[] { rep2, rep1 });
                    //    //        //Console.WriteLine($"Repnumber: {repNumber}");
                    //    //        var offset = (repNumber - 1) * 40;
                    //    //        Common.logger.Info("Progress: {0}", (offset / (float)flashData.Count).ToString("0.00%"));

                    //    //        if ((flashData.Count - offset) < 40)
                    //    //        {
                    //    //            // Console.WriteLine("ima full!");
                    //    //            Console.WriteLine(offset);
                    //    //            Console.WriteLine(flashData.Count);
                    //    //            take = flashData.Count - offset;
                    //    //            Console.WriteLine(take);
                    //    //            cmd.properties1.last = 1;
                    //    //            Common.logger.Info("Progress: {0}", (1).ToString("0.00%"));
                    //    //        }
                    //    //        var data = flashData.Skip(offset).Take(take).ToArray();
                    //    //        cmd.data = data;
                    //    //        //7A 97
                    //    //        // Common.logger.Info(Util.ObjToJson((byte[])cmd));
                    //    //        // Common.logger.Info(Util.ObjToJson(new byte[] { COMMAND_CLASS_FIRMWARE_UPDATE_MD_V2.ID, COMMAND_CLASS_FIRMWARE_UPDATE_MD_V2.FIRMWARE_UPDATE_MD_REPORT.ID }.Concat(new byte[] { cmd.properties1, cmd.reportNumber2 }).Concat(data).ToArray()));
                    //    //        cmd.checksum = Tools.CalculateCrc16Array((byte[])cmd, 0, ((byte[])cmd).Length - 2);
                    //    //        //cmd.checksum =  Tools.CalculateCrc16Array(new byte[] { COMMAND_CLASS_FIRMWARE_UPDATE_MD_V2.ID, COMMAND_CLASS_FIRMWARE_UPDATE_MD_V2.FIRMWARE_UPDATE_MD_REPORT .ID}.Concat(new byte[] { cmd.properties1, cmd.reportNumber2 }).Concat(data));
                    //    //        controller.SendData(x.SrcNodeId, cmd, Common.txOptions);
                    //    //    });

                    //    //    break;

                    //    default:
                    //        break;
                    //}
                }
            });

            //controllerListener = controller.HandleControllerUpdate((r) =>
            //{
            //    if (!Active)
            //    {
            //        return;
            //    }
            //    Common.logger.Info("{0}: Got {2} for node {1}", DateTime.Now, r.NodeId, r.Status);
            //    var lastDate = eventDao.GetLastEvent(typeof(COMMAND_CLASS_BATTERY.BATTERY_REPORT).Name, r.NodeId);
            //    if ((DateTime.Now - lastDate).TotalHours >= 6)
            //    {
            //        queueItems.Add(() => Common.RequestBatteryReport(controller, r.NodeId));
            //    }
            //});

            //Active = true;
            //while (!queueItems.IsCompleted)
            //{
            //    try
            //    {
            //        var action = queueItems.Take();
            //        if (Active)
            //            action();
            //    }
            //    catch (InvalidOperationException) { }
            //}
            dataListener.WaitCompletedSignal();

            //   Active = false;
            Common.logger.Info("Listening done!");
            return(true);
        }