private static MemoryBlock ReadHexFile(IEnumerable <string> hexFileContents, int memorySize)
 {
     try
     {
         var reader = new HexFileReader(hexFileContents, memorySize);
         return(reader.Parse());
     }
     catch (Exception ex)
     {
         UploaderLogger.LogErrorAndThrow(ex.Message);
     }
     return(null);
 }
        public void UploadSketch()
        {
            var hexFileName = options.FileName;

            logger.Info("Starting upload process for file '{0}'.", hexFileName);
            string[] hexFileContents = null;
            try
            {
                hexFileContents = File.ReadAllLines(hexFileName);
            }
            catch (Exception ex)
            {
                UploaderLogger.LogErrorAndThrow(ex.Message);
            }
            UploadSketch(hexFileContents);
        }
示例#3
0
 private void TryToOpenSerialPort()
 {
     logger.Trace("Opening serial port...");
     try
     {
         serialPort.Open();
     }
     catch (UnauthorizedAccessException)
     {
         UploaderLogger.LogAndThrowError <UnauthorizedAccessException>(
             "Access to the port is denied. This or another process is currently using this port.");
     }
     catch (ArgumentOutOfRangeException)
     {
         UploaderLogger.LogAndThrowError <ArgumentOutOfRangeException>(
             "The configuration parameters for the port are invalid (e.g. baud rate, parity, databits).");
     }
     catch (IOException)
     {
         UploaderLogger.LogAndThrowError <IOException>("The port is in an invalid state.");
     }
     logger.Trace("Opened serial port {0} with baud rate {1}!", serialPort.PortName, serialPort.BaudRate);
 }
        public void UploadSketch(IEnumerable <string> hexFileContents)
        {
            var serialPortName = options.PortName;

            var ports = SerialPortStream.GetPortNames();

            if (!ports.Any() || ports.Distinct().SingleOrDefault(
                    x => x.Equals(serialPortName, StringComparison.OrdinalIgnoreCase)) == null)
            {
                UploaderLogger.LogErrorAndThrow(
                    string.Format("Specified COM port name '{0}' is not valid.", serialPortName));
            }

            logger.Trace("Creating serial port '{0}'...", serialPortName);
            SerialPortBootloaderProgrammer programmer = null;

            IMCU             mcu = null;
            SerialPortConfig serialPortConfig;

            switch (options.ArduinoModel)
            {
            case ArduinoModel.Mega1284:
            {
                mcu = new ATMega1284();
                serialPortConfig = new SerialPortConfig(serialPortName, 115200);
                programmer       = new OptibootBootloaderProgrammer(serialPortConfig, mcu);
                break;
            }

            case ArduinoModel.Mega2560:
            {
                mcu = new ATMega2560();
                serialPortConfig = new SerialPortConfig(serialPortName, 115200);
                programmer       = new WiringBootloaderProgrammer(serialPortConfig, mcu);
                break;
            }

            case ArduinoModel.Leonardo:
            case ArduinoModel.Micro:
            {
                mcu = new ATMega32U4();
                serialPortConfig = new SerialPortConfig(serialPortName, 57600);
                programmer       = new ButterflyBootloaderProgrammer(serialPortConfig, mcu);
                break;
            }

            case ArduinoModel.NanoR2:
            {
                mcu = new ATMega168();
                serialPortConfig = new SerialPortConfig(serialPortName, 19200);
                programmer       = new OptibootBootloaderProgrammer(serialPortConfig, mcu);
                break;
            }

            case ArduinoModel.NanoR3:
            {
                mcu = new ATMega328P();
                serialPortConfig = new SerialPortConfig(serialPortName, 57600);
                programmer       = new OptibootBootloaderProgrammer(serialPortConfig, mcu);
                break;
            }

            case ArduinoModel.UnoR3:
            {
                mcu = new ATMega328P();
                serialPortConfig = new SerialPortConfig(serialPortName, 115200);
                programmer       = new OptibootBootloaderProgrammer(serialPortConfig, mcu);
                break;
            }

            default:
            {
                UploaderLogger.LogErrorAndThrow(
                    string.Format("Unsupported model: {0}!", options.ArduinoModel));
                break;
            }
            }

            try
            {
                programmer.Open();

                logger.Info("Establishing sync...");
                programmer.EstablishSync();
                logger.Info("Sync established.");

                logger.Info("Checking device signature...");
                programmer.CheckDeviceSignature();
                logger.Info("Device signature checked.");

                logger.Info("Initializing device...");
                programmer.InitializeDevice();
                logger.Info("Device initialized.");

                logger.Info("Enabling programming mode on the device...");
                programmer.EnableProgrammingMode();
                logger.Info("Programming mode enabled.");

                logger.Info("Programming device...");
                programmer.ProgramDevice(ReadHexFile(hexFileContents, mcu.Flash.Size), progress);
                logger.Info("Device programmed.");

                logger.Info("Leaving programming mode...");
                programmer.LeaveProgrammingMode();
                logger.Info("Left programming mode!");
            }
            finally
            {
                programmer.Close();
            }
            logger.Info("All done, shutting down!");
        }