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); }
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; }
public Kugelmatik(Config config, ClusterConfig clusterConfig, IAddressProvider addressProvider) { this.Config = config; this.ClusterConfig = clusterConfig; InitClusters(addressProvider); }
/// <summary> /// Sendet einen Config-Befehl an alle Cluster. /// </summary> public void SendConfig(ClusterConfig config) { foreach (Cluster cluster in clusters) cluster.SendConfig(config); }
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."); } } }
/// <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); }