Exemple #1
0
 internal Compiler(ArgHandler args)
 {
     _args = args;
 }
        private static int Main(string[] userArgs)
        {
            try
            {
                // Handle args:
                var args = new ArgHandler(userArgs);

                // Search for target device amongst connected usb hid devices:
                var hidManager    = new HidManager();
                var isTargetFound = hidManager.FindDevice((short)args.UsbVendorId, (short)args.UsbProductId);
                if (!isTargetFound)
                {
                    Logger.Log("USB transfer failed.\n", Logger.LOG_INFO);
                    return((int)ExitCode.TransferFailed);
                }
                Console.WriteLine($"USB device found (VendorID {args.UsbVendorId}, ProductID {args.UsbProductId}).");

                // Send break packet:
                var breakPacket = new byte[args.UsbPacketByteSize];
                for (int i = 0; i < breakPacket.Length; i++)
                {
                    breakPacket[i] = 0xFF;
                }
                Logger.Log("Break packet: ", Logger.LOG_DBG);
                if (!hidManager.SendBreakPacket(breakPacket))
                {
                    var e = new Exception($"USB transfer failed.");
                    e.Data.Add("ExitCode", (int)ExitCode.TransferFailed);
                    throw e;
                }

                // Transfer data packets:
                int packetIdx          = 0;
                int packetSuccessCount = 0;
                int totalPackets       = args.UsbPacketList.Count;
                foreach (var dataPacket in args.UsbPacketList)
                {
                    Logger.Log("Data packet " + ++packetIdx + ": ", Logger.LOG_DBG);
                    if (!hidManager.SendDataPacket(dataPacket))
                    {
                        Logger.Log("USB transfer failed.\n", Logger.LOG_INFO);
                        Logger.Log(packetSuccessCount + " out of " + totalPackets + " data-packets sent.\n", Logger.LOG_INFO);
                        return((int)ExitCode.TransferFailed);
                    }
                    packetSuccessCount++;
                }

                if (args.DownloadLightshow)
                {
                    Logger.Log("Break packet: ", Logger.LOG_DBG);
                    if (!hidManager.SendBreakPacket(breakPacket))
                    {
                        Logger.Log("USB transfer failed.\n", Logger.LOG_INFO);
                        return((int)ExitCode.TransferFailed);
                    }
                }

                Logger.Log("USB transfer succeeded: ", Logger.LOG_INFO);
                Logger.Log(packetSuccessCount + " out of " + totalPackets + " data-packets sent.\n", Logger.LOG_INFO);
                return((int)ExitCode.Success);
            }
            catch (Exception e)
            {
                Console.Write(e.Message);
                return(e.Data["ExitCode"] != null ? (int)e.Data["ExitCode"] : 1);
            }
        }
        private static int Main(string[] userArgs)
        {
            Console.WriteLine("Starting build...");

            try
            {
                // Handle args:
                var args = new ArgHandler(userArgs);

                if (args.Lines == null && args.Lines.Count() == 0)
                {
                    Console.WriteLine($"Empty or invalid code file.");
                    throw new Exception();
                }

                // Remove comments, extra whitespace, tabs, empty lines, etc:
                var codeLines = CodeCleanup(args.Lines);

                // Store code lines in their respective table:
                PopulateCodeTables(codeLines);

                // Build tables:
                DeviceTable.Build();
                DefineTable.Build();
                FunctionTable.Build();

                // Compile/link start function:
                var compiler     = new Compiler(args);
                var isSuccessful = compiler.Compile(out byte[] lightshowByteArray, out uint contextRegionByteSize, out uint maxInstrPathByteSize, out int threadCount);
                if (lightshowByteArray == null)
                {
                    Console.WriteLine("No build data generated.");
                    throw new Exception();
                }
                if (DeviceTable.Dev.SimulatorBrightnessCoeff == 0)
                {
                    Console.WriteLine("Invalid simulator brightness coefficient.");
                    throw new Exception();
                }
                Console.WriteLine($"Device threads usage: {Math.Round(100f * threadCount / DeviceTable.Proto.MaxThreads, 1):F1}% ({threadCount} of {DeviceTable.Proto.MaxThreads} threads).");
                CheckMemoryUsage(lightshowByteArray, contextRegionByteSize, maxInstrPathByteSize);

                Console.WriteLine("Build completed successfully.");

                // Generate output files (xml/bin):
                var controlPacketGenerator     = new ControlPacketGenerator(args);
                var downloadLightshowByteArray = controlPacketGenerator.GetDownloadLightshowPackets(lightshowByteArray);
                var startLightshowByteArray    = controlPacketGenerator.GetStartLightshowPacket();
                var pauseLightshowByteArray    = controlPacketGenerator.GetPauseLightshowPacket();
                var resumeLightshowByteArray   = controlPacketGenerator.GetResumeLightshowPacket();
                var outputXmlFilePath          = Path.Combine(Path.GetDirectoryName(args.InputFilePath), Path.GetFileNameWithoutExtension(args.InputFilePath) + ".xml");
                var outputBinFilePath          = Path.Combine(Path.GetDirectoryName(args.InputFilePath), Path.GetFileNameWithoutExtension(args.InputFilePath) + ".bin");
                PrintOutput(
                    lightshowByteArray, downloadLightshowByteArray, startLightshowByteArray, pauseLightshowByteArray, resumeLightshowByteArray,
                    outputXmlFilePath, outputBinFilePath);

                return((int)ExitCode.Success);
            }
            catch
            {
                return((int)ExitCode.Fail);
            }
        }
 internal ControlPacketGenerator(ArgHandler args)
 {
     _args = args;
 }