public override IOBuffer Pack() { var buffer = new IOBufferReadPageRx(); buffer[0] = Header; buffer[1] = Confirmation; buffer[2] = (byte)Regim; buffer[3] = (byte)(PageNumber & 0x7F); buffer[4] = (byte)((PageNumber >> 7) & 0x7F); buffer[5] = (byte)((PageNumber >> 14) & 0x7F); buffer[6] = (byte)((PageNumber >> 21) & 0x07); buffer[7] = (byte)(PageLineNumber & 0x7F); for (int i = 0; i < PageLine.Size; i++) { buffer[8 + i] = (byte)(Line[i] & 0x7F); } for (int k = 0; k < 7; k++) { buffer[24] |= (byte)((Line[k] >> (7 - k)) & (0x01 << k)); buffer[25] |= (byte)((Line[7 + k] >> (7 - k)) & (0x01 << k)); } buffer[24] &= 0x7F; buffer[25] &= 0x7F; buffer[26] |= (byte)((Line[14] >> 7) & 0x01); buffer[26] |= (byte)((Line[15] >> 6) & 0x02); buffer[26] &= 0x03; checkSumManager.Calculate(buffer); return(buffer); }
public override IMemory Run(IInTaskManager <double> taskManager) { Mode mode = (memoryType == MemoryType.FLASH) ? Mode.ReadFlashPage : Mode.ReadEepromPage; var txProtocol = new ProtocolReadPageTx(serialPortSettings.HeaderTX, mode); var rxProtocol = new ProtocolReadPageRx(serialPortSettings.HeaderRX, mode); var bufferRx = new IOBufferReadPageRx(); using (var sp = new SerialPortManager(portName, (int)serialPortSettings.BaudRate, serialPortSettings.Parity, serialPortSettings.StopBits, 50, SerialPort.InfiniteTimeout)) { IMemory memory = new Memory((memoryType == MemoryType.FLASH) ? processor.FlashSize : processor.EepromSize); Stopwatch stopWatch = new Stopwatch(); int pageCounter = 0; foreach (var pageNumber in numberOfPages) { Page page = new Page(); txProtocol.PageNumber = pageNumber; for (int pageLineNumber = 0; pageLineNumber < Page.NumberOfLines; pageLineNumber++) { txProtocol.PageLineNumber = pageLineNumber; for (;;) { Transmit(sp, txProtocol, taskManager.SynchronizationContext); RestartReceiv(); stopWatch.Restart(); while (stopWatch.Elapsed < TimeSpan.FromMilliseconds(100)) { taskManager.IfCancellation(); if (IfReceived(sp, rxProtocol, bufferRx, taskManager.SynchronizationContext)) { if (rxProtocol.PageNumber == pageNumber) { if (rxProtocol.PageLineNumber == pageLineNumber) { goto label1; } else { RestartReceiv(); } } else { RestartReceiv(); } } } } label1: page.SetLine(pageLineNumber, rxProtocol.Line); } memory.SetPage(pageNumber, page); pageCounter++; taskManager.OnProgress((double)pageCounter / numberOfPages.Count * 100.00); } Thread.Sleep(1000); return(memory); } }