Пример #1
0
        public Kugelmatik(Config config, ClusterConfig clusterConfig)
        {
            this.Config = config;
            this.ClusterConfig = clusterConfig;

            IAddressProvider addressProvider;
            if (!string.IsNullOrWhiteSpace(config.AddressFile))
                addressProvider = new FileAddressProvider(config.AddressFile);
            else if (!string.IsNullOrWhiteSpace(config.FixedIP))
                addressProvider = new FixedAddressProvider(config.FixedIP);
            else
                addressProvider = new KugelmatikAddressProvider();

            InitClusters(addressProvider);
        }
Пример #2
0
        public static ClusterConfig GetDefault()
        {
            ClusterConfig config = new ClusterConfig();
            config.StepMode = StepMode.Half;
            config.BrakeMode = BrakeMode.Smart;
            config.TickTime = 3500;
            config.HomeTime = 3500;
            config.FixTime = 3500;

            config.MaxSteps = 8000;
            config.HomeSteps = 8000;
            config.FixSteps = 8000;

            config.BrakeTicks = 10000;

            config.MinStepDelta = 10;
            return config;
        }
Пример #3
0
 public Kugelmatik(Config config, ClusterConfig clusterConfig, IAddressProvider addressProvider)
 {
     this.Config = config;
     this.ClusterConfig = clusterConfig;
     InitClusters(addressProvider);
 }
Пример #4
0
 /// <summary>
 /// Sendet einen Config-Befehl an alle Cluster.
 /// </summary>
 public void SendConfig(ClusterConfig config)
 {
     foreach (Cluster cluster in clusters)
         cluster.SendConfig(config);
 }
Пример #5
0
        private void HandlePacket(byte[] packet)
        {
            // jedes Kugelmatik V3 Paket ist mindestens HeaderSize Bytes lang und fangen mit "KKS" an
            if (packet.Length < HeaderSize || packet[0] != 'K' || packet[1] != 'K' || packet[2] != 'S')
                return;

            bool isGuaranteed = packet[3] > 0;
            PacketType type = (PacketType)packet[4];

            using (MemoryStream stream = new MemoryStream(packet))
            using (BinaryReader reader = new BinaryReader(stream))
            {
                stream.Position = HeaderSize - 4; // 4 Bytes für die Revision

                int revision = reader.ReadInt32();

                if (Kugelmatik.Config.VerbosePacketReceive
                    && type != PacketType.Ack
                    && (type != PacketType.Ping || Kugelmatik.Config.LogPingPacket))
                    Log.Verbose("[{0}, {1}] Received: [{2}] {3}, size: {4} bytes", X, Y, revision, type, packet.Length);

                switch (type)
                {
                    case PacketType.Ping:
                        bool wasNotConnected = !CheckConnection();

                        lastPing = Environment.TickCount;

                        long time = reader.ReadInt64(); // time ist der Wert von stopwatch zum Zeitpunkt des Absenden des Pakets
                        Ping = (int)(stopwatch.ElapsedMilliseconds - time);

                        RemovePacketToAcknowlegde(revision);

                        if (wasNotConnected && OnConnected != null)
                            OnConnected(this, EventArgs.Empty);
                        break;
                    case PacketType.Ack:
                        IPacket acknowlegdedPacket;
                        if (!packetsToAcknowledge.TryGetValue(revision, out acknowlegdedPacket))
                        {
                            if (Kugelmatik.Config.VerbosePacketReceive)
                                Log.Verbose("[{0}, {1}] Unknown acknowlegde: [{2}]", X, Y, revision);
                            break;
                        }

                        if (Kugelmatik.Config.VerbosePacketReceive)
                            Log.Verbose("[{0}, {1}] Acknowlegde: [{2}] {3}", X, Y, revision, acknowlegdedPacket.Type);

                        RemovePacketToAcknowlegde(revision);
                        break;
                    case PacketType.GetData:
                        for (int x = 0; x < Width; x++) // for-Schleife muss mit Firmware übereinstimmen
                            for (int y = 0; y < Height; y++)
                            {
                                Stepper stepper = GetStepperByPosition(x, y);

                                ushort height = reader.ReadUInt16();
                                if (height > Kugelmatik.ClusterConfig.MaxSteps)
                                    continue; // Höhe ignorieren

                                byte waitTime = reader.ReadByte();
                                stepper.Height = height;
                                stepper.WaitTime = waitTime;
                                stepper.OnDataSent();
                            }
                        RemovePacketToAcknowlegde(revision);
                        break;
                    case PacketType.Info:
                        byte buildVersion = reader.ReadByte();

                        BusyCommand currentBusyCommand = BusyCommand.None;
                        if (buildVersion >= 11)
                            currentBusyCommand = (BusyCommand)reader.ReadByte();
                        else if (buildVersion >= 8)
                            currentBusyCommand = reader.ReadByte() > 0 ? BusyCommand.Unknown : BusyCommand.None;

                        int highestRevision = 0;
                        if (buildVersion >= 9)
                            highestRevision = reader.ReadInt32();

                        ClusterConfig config = new ClusterConfig();
                        if (buildVersion < 15)
                        {
                            byte stepMode = reader.ReadByte();
                            if (!Enum.IsDefined(typeof(StepMode), stepMode))
                                throw new InvalidDataException("Unknown step mode");

                            int delayTime = reader.ReadInt32();

                            bool useBreak = false;
                            if (buildVersion >= 6)
                                useBreak = reader.ReadByte() > 0;

                            config = ClusterConfig.GetCompatibility((StepMode)stepMode, delayTime, useBreak);
                        }

                        ErrorCode lastError = ErrorCode.None;
                        if (buildVersion >= 12) {
                            int error = reader.ReadByte();
                            if (!Enum.IsDefined(typeof(ErrorCode), error))
                                lastError = ErrorCode.UnknownError;
                            else
                                lastError = (ErrorCode)error;
                        }

                        ErrorCode lastSavedError = Info == null ? ErrorCode.None : info.LastError;
                        if (lastSavedError != lastError && lastError != ErrorCode.None)
                            Log.Error("[{0}, {1}] Error changed from {2} to {3}", X, Y, lastSavedError, lastError);

                        int freeRam = -1;
                        if (buildVersion >= 14)
                            freeRam = reader.ReadInt16();

                        if (buildVersion >= 15)
                        {
                            ushort configSize = reader.ReadUInt16();
                            if (configSize != ClusterConfig.Size)
                            {
                                config = new ClusterConfig();
                                Log.Error("[{0}, {1}] Packet config size does not match config structure size (firmware: {2}, size: {3} != {4})", X, Y, buildVersion, configSize, ClusterConfig.Size);
                            }
                            else
                                config = ClusterConfig.Read(reader);
                        }

                        byte mcpStatus = 0;
                        int loopTime = 0;
                        int networkTime = 0;
                        int maxNetworkTime = 0;
                        int stepperTime = 0;
                        int upTime = 0;

                        if (buildVersion >= 17)
                        {
                            mcpStatus = reader.ReadByte();
                            loopTime = reader.ReadInt32();
                            networkTime = reader.ReadInt32();
                            maxNetworkTime = reader.ReadInt32();
                            stepperTime = reader.ReadInt32();
                            upTime = reader.ReadInt32();
                        }

                        Info = new ClusterInfo(buildVersion, currentBusyCommand, highestRevision,
                            config, lastError, freeRam, mcpStatus,
                            loopTime, networkTime, maxNetworkTime, stepperTime,
                            upTime);
                        RemovePacketToAcknowlegde(revision);
                        break;
                    default:
                        throw new InvalidDataException("Invalid packet type sent by cluster.");
                }
            }
        }
Пример #6
0
        /// <summary>
        /// Schickt einen Config-Befehl an das Cluster.
        /// </summary>
        public void SendConfig(ClusterConfig config)
        {
            if (IsDisposed)
                throw new ObjectDisposedException(GetType().Name);

            if (Info != null && Info.BuildVersion >= 15)
                SendPacket(new PacketConfig2(config), true);
            else
                SendPacket(new PacketConfig(config), true);
        }