/// <summary> /// return the software id from eeprom /// </summary> /// <param name="comport">Port</param> /// <param name="version">Board type</param> /// <returns></returns> public static int decodeApVar(string comport, string version) { ArduinoComms port = new ArduinoSTK(); if (version == "1280") { port = new ArduinoSTK(); port.BaudRate = 57600; } else if (version == "2560" || version == "2560-2") { port = new ArduinoSTKv2(); port.BaudRate = 115200; } else { return -1; } port.PortName = comport; port.DtrEnable = true; port.Open(); port.connectAP(); byte[] buffer = port.download(1024 * 4); port.Close(); if (buffer[0] != 'A' && buffer[0] != 'P' || buffer[1] != 'P' && buffer[1] != 'A') // this is the apvar header { return -1; } else { if (buffer[0] == 'A' && buffer[1] == 'P' && buffer[2] == 2) { // apvar header and version int pos = 4; byte key = 0; while (pos < (1024 * 4)) { int size = buffer[pos] & 63; pos++; key = buffer[pos]; pos++; log.InfoFormat("{0:X4}: key {1} size {2}\n ", pos - 2, key, size + 1); if (key == 0xff) { log.InfoFormat("end sentinal at {0}", pos - 2); break; } if (key == 0) { //Array.Reverse(buffer, pos, 2); return BitConverter.ToUInt16(buffer, pos); } for (int i = 0; i <= size; i++) { Console.Write(" {0:X2}", buffer[pos]); pos++; } } } if (buffer[0] == 'P' && buffer[1] == 'A' && buffer[2] == 5) // ap param { int pos = 4; byte key = 0; while (pos < (1024 * 4)) { key = buffer[pos]; pos++; int group = buffer[pos]; pos++; int type = buffer[pos]; pos++; int size = type_size((ap_var_type)Enum.Parse(typeof(ap_var_type), type.ToString())); Console.Write("{0:X4}: type {1} ({2}) key {3} group {4} size {5}\n ", pos - 2, type, type_names[type], key, group, size); if (key == 0xff) { log.InfoFormat("end sentinal at {0}", pos - 2); break; } if (key == 0) { //Array.Reverse(buffer, pos, 2); return BitConverter.ToUInt16(buffer, pos); } for (int i = 0; i < size; i++) { Console.Write(" {0:X2}", buffer[pos]); pos++; } } } } return -1; }
public void UploadFlash(string filename, string board) { if (board == "px4") { UploadPX4(filename); return; } byte[] FLASH = new byte[1]; StreamReader sr = null; try { lbl_status.Text = "Reading Hex File"; this.Refresh(); Application.DoEvents(); sr = new StreamReader(filename); FLASH = readIntelHEXv2(sr); sr.Close(); log.InfoFormat("\n\nSize: {0}\n\n", FLASH.Length); } catch (Exception ex) { if (sr != null) { sr.Dispose(); } lbl_status.Text = "Failed read HEX"; CustomMessageBox.Show("Failed to read firmware.hex : " + ex.Message); return; } IArduinoComms port = new ArduinoSTK(); if (board == "1280") { if (FLASH.Length > 126976) { CustomMessageBox.Show("Firmware is to big for a 1280, Please upgrade your hardware!!"); return; } //port = new ArduinoSTK(); port.BaudRate = 57600; } else if (board == "2560" || board == "2560-2") { port = new ArduinoSTKv2 { BaudRate = 115200 }; } port.DataBits = 8; port.StopBits = System.IO.Ports.StopBits.One; port.Parity = System.IO.Ports.Parity.None; port.DtrEnable = true; try { port.PortName = MainV2.comPortName; port.Open(); flashing = true; if (port.connectAP()) { log.Info("starting"); lbl_status.Text = "Uploading " + FLASH.Length + " bytes to APM Board: " + board; progress.Value = 0; this.Refresh(); // this is enough to make ap_var reset //port.upload(new byte[256], 0, 2, 0); port.Progress += port_Progress; if (!port.uploadflash(FLASH, 0, FLASH.Length, 0)) { flashing = false; if (port.IsOpen) port.Close(); throw new Exception("Upload failed. Lost sync. Try Arduino!!"); } port.Progress -= new ProgressEventHandler(port_Progress); progress.Value = 100; log.Info("Uploaded"); this.Refresh(); int start = 0; short length = 0x100; byte[] flashverify = new byte[FLASH.Length + 256]; lbl_status.Text = "Verify APM"; progress.Value = 0; this.Refresh(); while (start < FLASH.Length) { progress.Value = (int)((start / (float)FLASH.Length) * 100); progress.Refresh(); port.setaddress(start); log.Info("Downloading " + length + " at " + start); port.downloadflash(length).CopyTo(flashverify, start); start += length; } progress.Value = 100; for (int s = 0; s < FLASH.Length; s++) { if (FLASH[s] != flashverify[s]) { CustomMessageBox.Show("Upload succeeded, but verify failed: exp " + FLASH[s].ToString("X") + " got " + flashverify[s].ToString("X") + " at " + s); break; } } lbl_status.Text = "Write Done... Waiting (17 sec)"; } else { lbl_status.Text = "Failed upload"; CustomMessageBox.Show("Communication Error - no connection"); } port.Close(); flashing = false; Application.DoEvents(); try { ((SerialPort)port).Open(); } catch { } DateTime startwait = DateTime.Now; //CustomMessageBox.Show("1. If you are updating your firmware from a previous version, please verify your parameters are appropriate for the new version.\n2. Please ensure your accelerometer is calibrated after installing or re-calibrated after updating the firmware."); while ((DateTime.Now - startwait).TotalSeconds < 17) { try { // Console.Write(((SerialPort)port).ReadExisting().Replace("\0"," ")); } catch { } System.Threading.Thread.Sleep(1000); progress.Value = (int)Math.Min(((DateTime.Now - startwait).TotalSeconds / 17 * 100), 100); Application.DoEvents(); } try { ((SerialPort)port).Close(); } catch { } progress.Value = 100; lbl_status.Text = "Done"; } catch (Exception ex) { lbl_status.Text = "Failed upload"; CustomMessageBox.Show("Check port settings or Port in use? " + ex); try { port.Close(); } catch { } } flashing = false; MainV2.comPort.giveComport = false; }
/// <summary> /// return the software id from eeprom /// </summary> /// <param name="comport">Port</param> /// <param name="version">Board type</param> /// <returns></returns> public static int decodeApVar(string comport, BoardDetect.boards version) { IArduinoComms port = new ArduinoSTK(); if (version == boards.b1280) { port = new ArduinoSTK(); port.BaudRate = 57600; } else if (version == boards.b2560 || version == boards.b2560v2) { port = new ArduinoSTKv2(); port.BaudRate = 115200; } else { return -1; } port.PortName = comport; port.DtrEnable = true; port.Open(); port.connectAP(); byte[] buffer = port.download(1024 * 4); port.Close(); if (buffer[0] != 'A' && buffer[0] != 'P' || buffer[1] != 'P' && buffer[1] != 'A') // this is the apvar header { return -1; } else { if (buffer[0] == 'A' && buffer[1] == 'P' && buffer[2] == 2) { // apvar header and version int pos = 4; byte key = 0; while (pos < (1024 * 4)) { int size = buffer[pos] & 63; pos++; key = buffer[pos]; pos++; log.InfoFormat("{0:X4}: key {1} size {2}\n ", pos - 2, key, size + 1); if (key == 0xff) { log.InfoFormat("end sentinal at {0}", pos - 2); break; } if (key == 0) { //Array.Reverse(buffer, pos, 2); return BitConverter.ToUInt16(buffer, pos); } for (int i = 0; i <= size; i++) { Console.Write(" {0:X2}", buffer[pos]); pos++; } } } if (buffer[0] == 'P' && buffer[1] == 'A' && buffer[2] == 5) // ap param { int pos = 4; byte key = 0; while (pos < (1024 * 4)) { key = buffer[pos]; pos++; int group = buffer[pos]; pos++; int type = buffer[pos]; pos++; int size = type_size((ap_var_type)Enum.Parse(typeof(ap_var_type), type.ToString())); Console.Write("{0:X4}: type {1} ({2}) key {3} group {4} size {5}\n ", pos - 2, type, type_names[type], key, group, size); if (key == 0xff) { log.InfoFormat("end sentinal at {0}", pos - 2); break; } if (key == 0) { //Array.Reverse(buffer, pos, 2); return BitConverter.ToUInt16(buffer, pos); } for (int i = 0; i < size; i++) { Console.Write(" {0:X2}", buffer[pos]); pos++; } } } if (buffer[0] == 'P' && buffer[1] == 'A' && buffer[2] == 6) // ap param { int pos = 4; byte key = 0; while (pos < (1024 * 4)) { key = buffer[pos]; pos++; if (key == 0xff) { log.InfoFormat("end sentinal at {0}", pos - 1); break; } int type = buffer[pos] & 0x3f; // 6 bits uint group = BitConverter.ToUInt32(buffer, pos);//((byte)(buffer[pos]) >> 6) | ((byte)(buffer[pos + 1]) << 8) | ((byte)(buffer[pos + 2]) << 16); // 18 bits group = (group >> 6) & 0x3ffff; pos++; pos++; pos++; int size = BoardDetect.type_size((BoardDetect.ap_var_type)Enum.Parse(typeof(BoardDetect.ap_var_type), type.ToString())); Console.Write("{0:X4}: type {1} ({2}) key {3} group_element {4} size {5} value ", pos - 4, type, BoardDetect.type_names[type], key, group, size); if (key == 0) { //Array.Reverse(buffer, pos, 2); return BitConverter.ToUInt16(buffer, pos); } for (int i = 0; i < size; i++) { Console.Write(" {0:X2}", buffer[pos]); pos++; } Console.WriteLine(); } } } return -1; }
/// <summary> /// upload to arduino standalone /// </summary> /// <param name="filename"></param> /// <param name="board"></param> public bool UploadFlash(string comport, string filename, string board) { if (board == "px4") { return UploadPX4(filename); } byte[] FLASH = new byte[1]; StreamReader sr = null; try { updateProgress(0, "Reading Hex File"); sr = new StreamReader(filename); FLASH = readIntelHEXv2(sr); sr.Close(); log.InfoFormat("\n\nSize: {0}\n\n", FLASH.Length); } catch (Exception ex) { if (sr != null) { sr.Dispose(); } updateProgress(0, "Failed read HEX"); CustomMessageBox.Show("Failed to read firmware.hex : " + ex.Message); return false; } IArduinoComms port = new ArduinoSTK(); if (board == "1280") { if (FLASH.Length > 126976) { CustomMessageBox.Show("Firmware is to big for a 1280, Please upgrade your hardware!!"); return false; } //port = new ArduinoSTK(); port.BaudRate = 57600; } else if (board == "2560" || board == "2560-2") { port = new ArduinoSTKv2 { BaudRate = 115200 }; } port.DataBits = 8; port.StopBits = System.IO.Ports.StopBits.One; port.Parity = System.IO.Ports.Parity.None; port.DtrEnable = true; try { port.PortName = comport; port.Open(); if (port.connectAP()) { log.Info("starting"); updateProgress(0, "Uploading " + FLASH.Length + " bytes to Board: " + board); // this is enough to make ap_var reset //port.upload(new byte[256], 0, 2, 0); port.Progress += updateProgress; if (!port.uploadflash(FLASH, 0, FLASH.Length, 0)) { if (port.IsOpen) port.Close(); throw new Exception("Upload failed. Lost sync. Try Arduino!!"); } port.Progress -= updateProgress; updateProgress(100, "Upload Complete"); log.Info("Uploaded"); int start = 0; short length = 0x100; byte[] flashverify = new byte[FLASH.Length + 256]; updateProgress(0, "Verify Firmware"); while (start < FLASH.Length) { updateProgress((int)((start / (float)FLASH.Length) * 100), "Verify Firmware"); port.setaddress(start); log.Info("Downloading " + length + " at " + start); port.downloadflash(length).CopyTo(flashverify, start); start += length; } for (int s = 0; s < FLASH.Length; s++) { if (FLASH[s] != flashverify[s]) { CustomMessageBox.Show("Upload succeeded, but verify failed: exp " + FLASH[s].ToString("X") + " got " + flashverify[s].ToString("X") + " at " + s); port.Close(); return false; } } updateProgress(100, "Verify Complete"); } else { updateProgress(0,"Failed upload"); CustomMessageBox.Show("Communication Error - no connection"); } port.Close(); try { ((SerialPort)port).Open(); } catch { } //CustomMessageBox.Show("1. If you are updating your firmware from a previous version, please verify your parameters are appropriate for the new version.\n2. Please ensure your accelerometer is calibrated after installing or re-calibrated after updating the firmware."); try { ((SerialPort)port).Close(); } catch { } updateProgress(100, "Done"); } catch (Exception ex) { updateProgress(0,"Failed upload"); CustomMessageBox.Show("Check port settings or Port in use? " + ex); try { port.Close(); } catch { } return false; } MainV2.comPort.giveComport = false; return true; }
/// <summary> /// return the software id from eeprom /// </summary> /// <param name="comport">Port</param> /// <param name="version">Board type</param> /// <returns></returns> public static int decodeApVar(string comport, string version) { IArduinoComms port = new ArduinoSTK(); if (version == "1280") { port = new ArduinoSTK(); port.BaudRate = 57600; } else if (version == "2560" || version == "2560-2") { port = new ArduinoSTKv2(); port.BaudRate = 115200; } else { return(-1); } port.PortName = comport; port.DtrEnable = true; port.Open(); port.connectAP(); byte[] buffer = port.download(1024 * 4); port.Close(); if (buffer[0] != 'A' && buffer[0] != 'P' || buffer[1] != 'P' && buffer[1] != 'A') // this is the apvar header { return(-1); } else { if (buffer[0] == 'A' && buffer[1] == 'P' && buffer[2] == 2) { // apvar header and version int pos = 4; byte key = 0; while (pos < (1024 * 4)) { int size = buffer[pos] & 63; pos++; key = buffer[pos]; pos++; log.InfoFormat("{0:X4}: key {1} size {2}\n ", pos - 2, key, size + 1); if (key == 0xff) { log.InfoFormat("end sentinal at {0}", pos - 2); break; } if (key == 0) { //Array.Reverse(buffer, pos, 2); return(BitConverter.ToUInt16(buffer, pos)); } for (int i = 0; i <= size; i++) { Console.Write(" {0:X2}", buffer[pos]); pos++; } } } if (buffer[0] == 'P' && buffer[1] == 'A' && buffer[2] == 5) // ap param { int pos = 4; byte key = 0; while (pos < (1024 * 4)) { key = buffer[pos]; pos++; int group = buffer[pos]; pos++; int type = buffer[pos]; pos++; int size = type_size((ap_var_type)Enum.Parse(typeof(ap_var_type), type.ToString())); Console.Write("{0:X4}: type {1} ({2}) key {3} group {4} size {5}\n ", pos - 2, type, type_names[type], key, group, size); if (key == 0xff) { log.InfoFormat("end sentinal at {0}", pos - 2); break; } if (key == 0) { //Array.Reverse(buffer, pos, 2); return(BitConverter.ToUInt16(buffer, pos)); } for (int i = 0; i < size; i++) { Console.Write(" {0:X2}", buffer[pos]); pos++; } } } if (buffer[0] == 'P' && buffer[1] == 'A' && buffer[2] == 6) // ap param { int pos = 4; byte key = 0; while (pos < (1024 * 4)) { key = buffer[pos]; pos++; if (key == 0xff) { log.InfoFormat("end sentinal at {0}", pos - 1); break; } int type = buffer[pos] & 0x3f; // 6 bits uint group = BitConverter.ToUInt32(buffer, pos); //((byte)(buffer[pos]) >> 6) | ((byte)(buffer[pos + 1]) << 8) | ((byte)(buffer[pos + 2]) << 16); // 18 bits group = (group >> 6) & 0x3ffff; pos++; pos++; pos++; int size = ArduinoDetect.type_size((ArduinoDetect.ap_var_type)Enum.Parse(typeof(ArduinoDetect.ap_var_type), type.ToString())); Console.Write("{0:X4}: type {1} ({2}) key {3} group_element {4} size {5} value ", pos - 4, type, ArduinoDetect.type_names[type], key, group, size); if (key == 0) { //Array.Reverse(buffer, pos, 2); return(BitConverter.ToUInt16(buffer, pos)); } for (int i = 0; i < size; i++) { Console.Write(" {0:X2}", buffer[pos]); pos++; } Console.WriteLine(); } } } return(-1); }