/// <summary> /// Message which contains header is received, extract header from it, populate DataGridView and isue a new header request if needed /// </summary> /// <param name="b"> Message which contains header </param> private void FetchHeaders(byte[] b) { ByteArrayDecoderClass decoder = new ByteArrayDecoderClass(b); decoder.Get2BytesAsInt(); // Remove first 2 values (number of data received) // Fill header with remaining data headers[currentHeader].timestamp = decoder.Get6BytesAsTimestamp(); headers[currentHeader].prescaler = decoder.Get4BytesAsInt(); headers[currentHeader].numOfPoints = decoder.Get2BytesAsInt(); headers[currentHeader].operatingMode = decoder.Get1ByteAsInt(); headers[currentHeader].channel = decoder.Get1ByteAsInt(); PopulateDataGridWithHeader(headers[currentHeader], currentHeader); currentHeader++; if (currentHeader == headers.Count) // Last time in here, reset everything { //Console.WriteLine("Done fetching headers"); return; } // Send command to get measurement header CommandFormerClass cm = new CommandFormerClass(ConfigClass.startSeq, ConfigClass.deviceAddr); cm.AppendReadFromAddress(headers[currentHeader].headerAddress, ConfigClass.HEADER_LENGTH); var data = cm.GetFinalCommandList(); //Console.WriteLine("Fetching headers from Fetching"); Thread.Sleep(10); // MCU cant handle very fast UART tasks SerialDriver.Send(data, FetchHeaders, FailCallback); }
/// <summary> /// Data is downloaded, extract raw values from data packet /// </summary> /// <param name="raw"></param> public FormMeasurementSingleChannelPresenter(byte[] raw) { InitializeComponent(); ByteArrayDecoderClass dec = new ByteArrayDecoderClass(raw); // Extract data len without header int dataLen = (dec.Get2BytesAsInt() - ConfigClass.HEADER_LENGTH) / 2; // Remove header from data packet selectedHeader = new MeasurementHeaderClass(0); // Dummy address selectedHeader.timestamp = dec.Get6BytesAsTimestamp(); selectedHeader.prescaler = dec.Get4BytesAsInt(); selectedHeader.numOfPoints = dec.Get2BytesAsInt(); selectedHeader.operatingMode = dec.Get1ByteAsInt(); selectedHeader.channel = dec.Get1ByteAsInt(); // Set default gain in textbox from configuration if (selectedHeader.channel == 0) { textBoxGain.Text = ConfigClass.deviceGainCH0.ToString(); } else if (selectedHeader.channel == 1) { textBoxGain.Text = ConfigClass.deviceGainCH1.ToString(); } else { throw new Exception("Invalid channel value in FormMeasurementSingleChannelPresenter"); } // Form timestamp string string time = (selectedHeader.timestamp[0] + 2000).ToString() + "/" + selectedHeader.timestamp[1].ToString() + "/" + selectedHeader.timestamp[2].ToString() + " " + selectedHeader.timestamp[3].ToString() + ":" + selectedHeader.timestamp[4].ToString() + ":" + selectedHeader.timestamp[5].ToString(); string channel = SupercapHelperClass.ConvertChannelToSymbolicString(selectedHeader.channel); // Change name of this form this.Text = channel + " " + time; values = new int[dataLen]; //int value = dec.Get2BytesAsInt16(); for (int i = 0; i < dataLen; i++) { values[i] = dec.Get2BytesAsInt16(); } }
/// <summary> /// Measurement info is received, decode data and send requests to read measurement headers /// </summary> /// <param name="b"></param> private void ProcessGetMeasurementInfo(byte[] b) { ByteArrayDecoderClass decoder = new ByteArrayDecoderClass(b); decoder.Get2BytesAsInt(); // Ignore first 2 values (message length) this.Invoke(new Action(() => { dataGridViewDataDownloadMesHeaders.DataSource = null; dataGridViewDataDownloadMesHeaders.Rows.Clear(); dataGridViewDataDownloadMesHeaders.Refresh(); })); // Get number of measurements and their header starting addresses int numOfMeasurements = decoder.Get2BytesAsInt(); FormCustomConsole.WriteLine("Number of measurements: " + numOfMeasurements); Console.WriteLine("Number of measurements: " + numOfMeasurements); if (numOfMeasurements == 0) { // if no measurements leave it as it is MessageBox.Show("No saved measurements in device"); return; } headers = new List <MeasurementHeaderClass>(); // Reset headers list // For now only header addresses are received, which can be used to fetch headers for (int i = 0; i < numOfMeasurements; i++) { headers.Add(new MeasurementHeaderClass(decoder.Get4BytesAsInt())); } currentHeader = 0; // Reset header index // Bootstrap // Send command to get measurement header CommandFormerClass cm = new CommandFormerClass(ConfigClass.startSeq, ConfigClass.deviceAddr); cm.AppendReadFromAddress(headers[0].headerAddress, ConfigClass.HEADER_LENGTH); var data = cm.GetFinalCommandList(); //Console.WriteLine("Fetching headers from ProcessGetMeasurementInfo"); SerialDriver.Send(data, FetchHeaders, FailCallback); }
public FormMeasurementDualChannelPresenter(byte[] raw) { InitializeComponent(); ByteArrayDecoderClass dec = new ByteArrayDecoderClass(raw); // Extract data len without header (2 measurements are stored in raw thats why / 4) int dataLen = (dec.Get2BytesAsInt() - ConfigClass.HEADER_LENGTH) / 4; // Remove header from data packet selectedHeader = new MeasurementHeaderClass(0); // Dummy address selectedHeader.timestamp = dec.Get6BytesAsTimestamp(); selectedHeader.prescaler = dec.Get4BytesAsInt(); selectedHeader.numOfPoints = dec.Get2BytesAsInt(); selectedHeader.operatingMode = dec.Get1ByteAsInt(); selectedHeader.channel = dec.Get1ByteAsInt(); // Set gain textboxes default values from config class textBoxGainCH0.Text = ConfigClass.deviceGainCH0.ToString(); textBoxGainCH1.Text = ConfigClass.deviceGainCH1.ToString(); // Form timestamp string string time = (selectedHeader.timestamp[0] + 2000).ToString() + "/" + selectedHeader.timestamp[1].ToString() + "/" + selectedHeader.timestamp[2].ToString() + " " + selectedHeader.timestamp[3].ToString() + ":" + selectedHeader.timestamp[4].ToString() + ":" + selectedHeader.timestamp[5].ToString(); string channel = SupercapHelperClass.ConvertChannelToSymbolicString(selectedHeader.channel); // Change name of this form this.Text = channel + " " + time; valuesCH0 = new int[dataLen]; valuesCH1 = new int[dataLen]; for (int i = 0; i < dataLen; i++) { valuesCH0[i] = dec.Get2BytesAsInt16(); valuesCH1[i] = dec.Get2BytesAsInt16(); } }
private void MultiSuccess35A(List <byte[]> list) { Invoke((MethodInvoker) delegate { labelMultiDownload.Text = "Success!"; labelMultiDownload.ForeColor = System.Drawing.Color.Green; const string delimiter = "\r\n"; Console.WriteLine("Success from MULTI"); //string path = AppDomain.CurrentDomain.BaseDirectory; string filenameCH0; string filenameCH1; string midleFix = textBoxDataDownloadCapacitorDescription35A.Text; int[] valuesCH0, valuesCH1; MeasurementHeaderClass selectedHeader; string[] postFixes = { "_R", "_C" }; int postFixIndex = 0; FolderBrowserDialog dialog = new FolderBrowserDialog(); dialog.SelectedPath = defaultPath; if (dialog.ShowDialog() == DialogResult.OK) { defaultPath = dialog.SelectedPath + "\\"; } else { // If no folder is selected just abort everything :( labelMultiDownload.Text = "Canceled!"; labelMultiDownload.ForeColor = System.Drawing.Color.Black; return; } foreach (var item in list) { ByteArrayDecoderClass dec = new ByteArrayDecoderClass(item); // Extract data len without header (2 measurements are stored in raw thats why / 4) int dataLen = (dec.Get2BytesAsInt() - ConfigClass.HEADER_LENGTH) / 4; // Remove header from data packet selectedHeader = new MeasurementHeaderClass(0); // Dummy address selectedHeader.timestamp = dec.Get6BytesAsTimestamp(); selectedHeader.prescaler = dec.Get4BytesAsInt(); selectedHeader.numOfPoints = dec.Get2BytesAsInt(); selectedHeader.operatingMode = dec.Get1ByteAsInt(); selectedHeader.channel = dec.Get1ByteAsInt(); valuesCH0 = new int[dataLen]; valuesCH1 = new int[dataLen]; for (int i = 0; i < dataLen; i++) { valuesCH0[i] = dec.Get2BytesAsInt16(); valuesCH1[i] = dec.Get2BytesAsInt16(); } // Values are extracted so far, now form filename // Form timestamp string string time = (selectedHeader.timestamp[0] + 2000).ToString() + "_" + selectedHeader.timestamp[1].ToString() + "_" + selectedHeader.timestamp[2].ToString() + "__" + selectedHeader.timestamp[3].ToString() + "-" + selectedHeader.timestamp[4].ToString() + "-" + selectedHeader.timestamp[5].ToString(); //string channel = SupercapHelperClass.ConvertChannelToSymbolicString(selectedHeader.channel); filenameCH0 = "dev" + ConfigClass.deviceAddr + "_" + midleFix + "_" + time + "_" + "CH0" + postFixes[postFixIndex]; filenameCH1 = "dev" + ConfigClass.deviceAddr + "_" + midleFix + "_" + time + "_" + "CH1" + postFixes[postFixIndex]; SaveMeasurementsToCSVClass.Save(valuesCH0, 0, defaultPath + filenameCH0 + ".csv", delimiter); SaveMeasurementsToCSVClass.Save(valuesCH1, 1, defaultPath + filenameCH1 + ".csv", delimiter); postFixIndex++; } } ); Console.WriteLine("All Done!!!!"); }