public FirmwareUno(Node node, byte systemFlags)
 {
     _node = node;
     _operationTimeRestictionDictionary = new Dictionary<ushort, Operation>();
     _operationDictionary = new Dictionary<ushort, Operation[]>();
     _systemFlags = systemFlags;
     _baseConfiguration = node.GetBaseConfiguration();
 }
        public static Node CreateNode(BaseTypes baseType, ShieldTypes shieldType)
        {
            Node node = new Node
            {
                Base = baseType,
                Shield = shieldType,
                NetworkRetries = 3,
            };

            foreach (var item in ProductConfiguration.GetShieldDictionary(shieldType))
            {
                if(item.Value.Item1 != DataLayer.Entities.Enums.ConnectorTypes.DimmerPassZero)
                    node.Connectors.Add(BusinessConnector.CreateConnector(item.Key, item.Value.Item1));
            }

            return node;
        }
        public async void SendConfiguration(Node node, Home home)
        {
            ushort nodeAddress = (ushort)node.Address;

            bool isNewTransaction = !this.currentWriteTransactions.ContainsKey(nodeAddress);
            bool isAbortedOrCompletedTransaction = isNewTransaction ?
                false : 
                this.currentWriteTransactions[nodeAddress].FragmentWriteTransaction.IsAborted ||
                this.currentWriteTransactions[nodeAddress].FragmentWriteTransaction.IsCompleted;

            if (isNewTransaction || isAbortedOrCompletedTransaction)
            {
                // If the last transaction was aborted or completed. Remove it to allow a new one.
                if (isAbortedOrCompletedTransaction)
                    this.currentWriteTransactions.Remove(nodeAddress);

                var configuration = node.GetBinaryConfiguration(home);

                var newTransaction = new FragmentWriteTransaction(this, OperationMessage.OPCodes.ConfigWrite, typeof(ConfigWriteStatusCodes), nodeAddress, configuration.Item2);
                this.currentWriteTransactions.Add(nodeAddress, new ConfigTransaction()
                {
                    Checksum = configuration.Item1,
                    FragmentWriteTransaction = newTransaction,
                    TimeFlag = (DateTime)(node.LastChecksumUpdate ?? DateTime.MinValue),
                });

                if (!await newTransaction.StartTransaction())
                {
                    //TODO: Check the problem
                    PrintLog(true, string.Format("An error occurred on configuration update for node 0x{0:X4}", nodeAddress));
                }
            }
        }