Esempio n. 1
0
        public IActionResult DisplayViewAsImage()
        {
            var sim = Program.uglyGlobalSimulation;

            lock (sim)
            {
                var filename = "/tmp/tmp.png";
                var w        = 1600;
                var h        = 1000;
                var scale    = 0.150;       // TODO: automatically determine boundaries of view
                var fontSize = 9;
                GraphicsOutput.RenderPng(sim.CoordSpace, sim.Network, sim.Units, Program.uglyGlobalTCSS, filename, w, h, scale, fontSize);

                byte[] filedata    = System.IO.File.ReadAllBytes(filename);
                string contentType = "image/png";

                return(File(filedata, contentType));
            }
        }
Esempio n. 2
0
        private static void Subscribe(Simulation sim)
        {
            var factory = new ConnectionFactory()
            {
                HostName = "localhost"
            };
            var connection = factory.CreateConnection();

            var channel = connection.CreateModel();

            var simStateQueue = channel.QueueDeclare().QueueName;

            channel.ExchangeDeclare(exchange: "SimState_full.cbor",
                                    type: ExchangeType.Fanout);
            channel.QueueBind(queue: simStateQueue,
                              exchange: "SimState_full.cbor",
                              routingKey: "");

            channel.ExchangeDeclare(exchange: "TSIM.cbor",
                                    type: ExchangeType.Fanout);

            var consumer = new EventingBasicConsumer(channel);

            consumer.Received += (model, ea) =>
            {
                // var message = Encoding.UTF8.GetString(ea.Body.ToArray());
                // Console.WriteLine("RX " + message);

                var(unitsSnapshot, controlSnapshot, simInfoSnapshot) = Serialization.UnglueFullSimSnapshot(ea.Body.ToArray());

                // var message = Encoding.UTF8.GetString(unitsSnapshot);
                // Console.WriteLine("RX " + message);

                // var message = Encoding.UTF8.GetString(controlSnapshot);
                // Console.WriteLine("RX " + message);

                var controlStateMap = Serialization.DeserializeTrainControlState(controlSnapshot);

                uglyGlobalTCSS = controlStateMap;

                lock (sim)
                {
                    // Serialization.DeserializeInfoSnapshot(sim, simInfoSnapshot);
                    sim.Units.SnapshotFullRestore(unitsSnapshot);

                    // Render outputs

                    var filename = "/tmp/tmp.png";
                    var w        = 1400;
                    var h        = 1000;
                    var scale    = 0.150;       // TODO: automatically determine boundaries of view
                    var fontSize = 9;
                    GraphicsOutput.RenderPng(sim.CoordSpace, sim.Network, sim.Units, Program.uglyGlobalTCSS, filename, w, h, scale, fontSize);

                    byte[] filedata    = System.IO.File.ReadAllBytes(filename);
                    string contentType = "image/png";

                    // Wrap in CBOR & publish

                    var cbor = CBORObject.NewMap()
                               .Add("objects", CBORObject.NewArray()
                                    .Add(CBORObject.NewMap()
                                         .Add("name", "main") // deprecated
                                         .Add("topic", "main")
                                         .Add("displayName", "TSIM View")
                                         .Add("mimeType", contentType)
                                         .Add("data", filedata)
                                         )
                                    .Add(ControlSystemStateMapToCbor(Program.uglyGlobalTCSS))
                                    .Add(SimulationStateMapToCbor(/*sim.SimTimeElapsed*/ simInfoSnapshot))
                                    .Add(UnitsToCbor(sim.Units))
                                    )
                               .Add("controls", CBORObject.NewArray())
                    ;

                    channel.BasicPublish(exchange: "TSIM.cbor",
                                         routingKey: "",
                                         basicProperties: null,
                                         body: cbor.EncodeToBytes());
                    // Console.WriteLine($"Pub now");
                }
            };

            channel.BasicConsume(queue: simStateQueue,
                                 autoAck: true,
                                 consumer: consumer);
        }