/// <summary> /// Обработка запросов на запись /// </summary> private void ProceedWriteItems(AbstractChannel channel) { for (int i = 0; i < this.writeItems.Count; i++) { RequestItem item = this.writeItems[i]; // Определяем, сколько можно записать за один запрос int packetSize = channel.GetPacketSize(item.MemoryType); // Разбиваем буфер по запросам и записываем их в контроллер for (int j = 0; j < item.Data.Length; j += packetSize) { int c = Math.Min(packetSize, item.Data.Length - j); byte[] buffer = new byte[c]; Array.Copy(item.Data, j, buffer, 0, c); try { channel.WriteToMemory(item.MemoryType, item.Address + j, buffer); this.WritedRequestsCount++; } catch { this.ErrorWritedRequestsCount++; item.Error = true; } // В случае необходимости, информируем о процессе записи if (item.ProgressChangedCallback != null) { // Устанавливаем параметры для выполнения события object[] Params = new object[4]; Params[0] = item.ProgressChangedCallback; Params[1] = item.Sender; Params[2] = (double)(j + c) / (item.Data.Length); Params[3] = null; // Выплняем Callback в главном потоке this.asyncOp.Post(this.exProgressChangedDelegate, Params); } } if (item.ProceedingCompletedCallback != null) { // Нужно проинформировать элемент о завершении получения данных // Устанавливаем параметры для выполнения события object[] Params = new object[4]; Params[0] = item.ProceedingCompletedCallback; Params[1] = item.Sender; Params[2] = null; Params[3] = item.Error; // Выполняем Callback в главном потоке this.asyncOp.Post(this.exProceedingCompleetedDelegate, Params); } this.writeItems.Remove(item); i--; } }
public void Connect(string host, int port) { this.channel = new TChannel(host, port); this.channel.Start(); channel.ReadCallback += OnRead; this.channel.ErrorCallback += OnError; //this.scheduled.Start(); //this.scheduled.ScheduleAtFixedRate(CheckConnect, 1000, 1000); }
void INativeUnsafe.FinishWrite(WriteRequest writeRequest) { AbstractChannel ch = this.channel; if (ch.EventLoop.InEventLoop) { this.FinishWrite(writeRequest); } else { ch.EventLoop.Execute(WriteCallbackAction, this, writeRequest); } }
void IServerNativeUnsafe.Accept(RemoteConnection connection) { AbstractChannel ch = this.channel; if (ch.EventLoop.InEventLoop) { this.Accept(connection); } else { ch.EventLoop.Execute(AcceptCallbackAction, this, connection); } }
void _searcher_DoWork(object sender, DoWorkEventArgs e) { _currentPort = new SerialportChannel((string)e.Argument, 19200, ProtocolType.RC51BIN); string pattern = "relkon"; string bootPattern = "boot"; byte[] request = new byte[] { 0x00, 0xA0 }; bool searchingStopped = false; int[] baudRates = new int[] { 19200, 115200, 57600, 38400, 9600, 4800 }; ProtocolType[] protocols = new ProtocolType[] { ProtocolType.RC51BIN, ProtocolType.RC51ASCII }; int totalProgress = baudRates.Length * protocols.Length; for (int i = 0; i < protocols.Length && !searchingStopped; i++) { _currentPort.RelkonProtocolType = protocols[i]; for (int j = 0; j < baudRates.Length && !searchingStopped; j++) { ((SerialportChannel)_currentPort).BaudRate = baudRates[j]; if (_searcher.CancellationPending) { e.Cancel = true; return; } try { _currentPort.Open(); byte[] res = _currentPort.SendRequest(request, pattern.Length); ((SerialportChannel)_currentPort).DiscardInBuffer(); if (res != null && Encoding.ASCII.GetString(res).ToLower().Contains(pattern.ToLower()) || Encoding.ASCII.GetString(res).ToLower().Contains(bootPattern.ToLower())) { return; } } catch { } finally { _currentPort.Close(); } _searcher.ReportProgress((int)((100 / totalProgress) * (i * j + j)), "Поиск параметров контроллера..."); } } _currentPort = null; }
/// <summary> /// Запускает процесс загрузки данных /// </summary> public void StartUploading() { lock (this.userStateToLifeTime) { if (this.userStateToLifeTime.Count != 0) { throw new Exception("Процесс загрузки уже запущен"); } } this.devicePort = null; this.canceled = false; //this.UpdateSeacherParams(); this.deviceSearcher_ProgressChanged(this, new ProgressChangedEventArgs(0, null)); // чтобы при создании Message ProgressForm было непустым this.deviceSearcher.StartSearch(); }
protected override void run() { while (true) { if (isTask == true) { runAllTasks(); Thread.Sleep(1); } else { WindowsSelectorImpl windowsSelector = (WindowsSelectorImpl)_unwrappedSelector; SelectionKeyImpl[] selectionKeys = windowsSelector.getChannels(); foreach (SelectionKeyImpl selectionKey in selectionKeys) { if (selectionKey == null) { continue; } Object a = selectionKey.attachment(); if (!(a is AbstractChannel)) { continue; } AbstractChannel ch = (AbstractChannel)a; ch.getUnsafe().close(); runAllTasks(); } break; } } }
/// <summary> /// Запуск отладчика /// </summary> public void Start() { if (this.EngineStatus != DebuggerEngineStatus.Stopped) { throw new Exception("Отладчик уже запущен"); } AbstractChannel port = null; if (this.Parameters.ComConection) { port = new SerialportChannel(this.Parameters.PortName, this.Parameters.BaudRate, this.Parameters.ProtocolType); } else { port = new EthernetChannel(this.Parameters.PortIP, 12144, this.Parameters.ProtocolType); } port.ControllerAddress = this.Parameters.ControllerNumber; this.asyncOp = AsyncOperationManager.CreateOperation(port); WorkingDelegateCOM worker = new WorkingDelegateCOM(this.ProceedRequests); worker.BeginInvoke(port, null, null); }
private void deviceSearcher_DeviceSearchCompleted(object sender, DeviceSearchCompletedEventArgs e) { if (e.Cancelled || e.Error != null) { this.RaiseUploadingCompletedEvent(new AsyncCompletedEventArgs(e.Error, e.Cancelled, null)); } else { if (Encoding.ASCII.GetString(e.DeviceResponse).ToLower().Contains(this.deviceSearcher.Pattern.ToLower())) { bootLoaderMode = false; } AbstractChannel port = new SerialportChannel(e.Port); port.ControllerAddress = e.DeviceResponse[0]; this.devicePort = this.solution.LastWorkedPort = port; AsyncOperation asyncOp = AsyncOperationManager.CreateOperation(Guid.NewGuid()); this.userStateToLifeTime.Add(asyncOp); WorkerEventHandler workerDelegate = new WorkerEventHandler(this.Upload); workerDelegate.BeginInvoke(port, null, null); } }
private void Upload(AbstractChannel port) { Exception error = null; port = (SerialportChannel)port; try { int oldBaudRate = ((SerialportChannel)port).BaudRate; ProtocolType oldProtocol = port.RelkonProtocolType; long programSize = 0; port.Open(); byte[] req; req = port.SendRequest(new byte[] { 0x00, 0xA2 }, 16); if (req != null) { string s = Encoding.ASCII.GetString(req); if (s.Substring(9, 4) != "PROG") { throw new Exception("Данный порт не предназначен для программирования!"); } } req = port.SendRequest(this.deviceSearcher.Request, this.deviceSearcher.Pattern.Length); if (req != null) { string s = Encoding.ASCII.GetString(req); bootLoaderMode = s.ToLower().Contains(this.deviceSearcher.Pattern.ToLower()) ? false : true; } if (uploadOnlyProgram) { if (!bootLoaderMode) { if (this.canceled) { throw new StopUploadinException(); } port.Open(); this.ChangeProgressMethod("Сброс контроллера...", 0); //Перетераем первый символ слова для загрузчика port.WriteByteToMemory(MemoryType.FRAM, 0x7FF5, 0x00); port.ResetController(); port.Close(); this.ChangeProgressMethod("Сброс контроллера...", 100); if (this.canceled) { throw new StopUploadinException(); } Thread.Sleep(1000); } ((SerialportChannel)port).BaudRate = 115200; port.RelkonProtocolType = ProtocolType.RC51BIN; port.Open(); ((SerialportChannel)port).DirectPort.Write("1"); waitfor(((SerialportChannel)port).DirectPort, 'C'); Stream fs = new FileStream(solution.DirectoryName + "\\" + solution.Name + ".bin", FileMode.Open); BinaryReader br = new BinaryReader(fs); MemoryStream ms = new MemoryStream(); BinaryWriter bw = new BinaryWriter(ms); byte[] bytes = new byte[br.BaseStream.Length]; while (br.BaseStream.Position != br.BaseStream.Length) { bw.Write(br.ReadBytes(1024)); bw.Flush(); } fs.Close(); br.Close(); bytes = ms.ToArray(); programSize = bytes.Length; ms.Close(); bw.Flush(); bw.Close(); //waitforack(port.DirectPort); //waitfor(port.DirectPort, 'C'); ushort packetnum = 0; YModemPacket initpacket = new YModemPacket(); initpacket.isinit = true; initpacket.packetnum = packetnum; initpacket.filename = solution.Name + ".bin"; initpacket.filelength = bytes.Length; if ((solution.Name + ".bin").Length > 125) { initpacket.longpacket = true; } else { initpacket.longpacket = false; } initpacket.createPacket(); ((SerialportChannel)port).DiscardInBuffer(); SendPacket(((SerialportChannel)port).DirectPort, initpacket); waitfor(((SerialportChannel)port).DirectPort, 'C'); //port.DiscardInBuffer(); MemoryStream ms2 = new MemoryStream(bytes); byte[] temparr = new byte[1024]; YModemPacket sendPacket; long numpack = Math.Abs(((long)ms2.Length) / ((long)1024)); BinaryReader br2 = new BinaryReader(ms2); this.ChangeProgressMethod("Загрузка программы в контроллер...", 0); while (ms2.Position != ms2.Length) { if (this.canceled) { throw new StopUploadinException(); } int pers = (int)((float)100 / (float)ms2.Length * ms2.Position); this.ChangeProgressMethod("Загрузка программы в контроллер...", pers); Application.DoEvents(); //_waitforack = false; packetnum++; temparr = br2.ReadBytes(1024); sendPacket = new YModemPacket(); sendPacket.packetnum = packetnum; sendPacket.longpacket = true; sendPacket.isinit = false; sendPacket.data = temparr; sendPacket.createPacket(); SendPacket(((SerialportChannel)port).DirectPort, sendPacket); } ((SerialportChannel)port).DirectPort.Write(new byte[] { (byte)0x04 }, 0, 1); YModemPacket endpacket = new YModemPacket(); endpacket.isend = true; endpacket.longpacket = false; endpacket.packetnum = 0; endpacket.data = new byte[128]; endpacket.createPacket(); SendPacket(((SerialportChannel)port).DirectPort, endpacket); Thread.Sleep(2000); ((SerialportChannel)port).DiscardInBuffer(); } if (!bootLoaderMode) { ((SerialportChannel)port).BaudRate = oldBaudRate; port.RelkonProtocolType = oldProtocol; } else { this.ChangeProgressMethod("Поиск параметров контроллера...", 0); string pattern = "relkon 6.0"; byte[] request = new byte[] { 0x00, 0xA0 }; bool searchingStopped = false; int[] baudRates = new int[] { 115200, 19200, 57600, 38400, 9600, 4800 }; ProtocolType[] protocols = new ProtocolType[] { ProtocolType.RC51BIN, ProtocolType.RC51ASCII }; int totalProgress = baudRates.Length * protocols.Length; for (int i = 0; i < protocols.Length && !searchingStopped; i++) { port.RelkonProtocolType = protocols[i]; for (int j = 0; j < baudRates.Length && !searchingStopped; j++) { ((SerialportChannel)port).BaudRate = baudRates[j]; try { if (this.canceled) { throw new StopUploadinException(); } port.Open(); byte[] res = port.SendRequest(request, pattern.Length); ((SerialportChannel)port).DiscardInBuffer(); if (res != null && Encoding.ASCII.GetString(res).ToLower().Contains(pattern)) { searchingStopped = true; break; } } catch { } finally { port.Close(); } this.ChangeProgressMethod("Поиск параметров контроллера...", (int)((100 / totalProgress) * (i * j + j))); } } } if (uploadOnlyParams) { port.Open(); this.ChangeProgressMethod("Загрузка настроек...", 1); if (uploadOnlyParams) { byte[] b = port.ReadFRAM(0x7F06, 4); programSize = (long)BitConverter.ToUInt32(b, 0); } byte[] ParamsBuffer = this.CreateParamsBuffer((uint)programSize); this.ChangeProgressMethod("Загрузка настроек...", 50); port.WriteToMemory(MemoryType.FRAM, 0x7F00, ParamsBuffer); this.ChangeProgressMethod("Загрузка настроек...", 100); this.ChangeProgressMethod("Загрузка заводских уставок...", 0); int adr = 0x7B00; for (int i = 0; i < 8; i++) { byte[] buf = new byte[128]; for (int j = 0; j < 128; j++) { if (this.canceled) { throw new StopUploadinException(); } buf[j] = (byte)this.solution.Vars.GetEmbeddedVar("EE" + (i * 128 + j).ToString()).Value; } port.WriteToMemory(MemoryType.FRAM, adr, buf); adr += 128; this.ChangeProgressMethod("Загрузка заводских уставок...", (int)(i * ((double)100 / (double)8))); } //this.ChangeProgressMethod("Загрузка настроек...", 75); //port.WriteToMemory(MemoryType.FRAM, 0x7B00, EmbeddedVarsBuffer); this.ChangeProgressMethod("Загрузка настроек...", 100); this.ChangeProgressMethod("Сброс контроллера...", -1); } if (_readEmbVars && !bootLoaderMode) { this.ChangeProgressMethod("Чтение заводских уставок...", 0); int adr = 0x7B00; for (int i = 0; i < 8; i++) { byte[] buf = port.ReadFromMemory(MemoryType.FRAM, adr, 128); for (int j = 0; j < 128; j++) { this.solution.Vars.GetEmbeddedVar("EE" + (i * 128 + j).ToString()).Value = buf[j]; } adr += 128; this.ChangeProgressMethod("Чтение заводских уставок...", (int)(i * ((double)100 / (double)8))); } } try { port.ResetController(); } catch { Utils.WarningMessage("Системе не удалось перезагрузить контроллер. Чтобы настройки вступили в силу, пересбросьте питание вручную."); } } catch (Exception ex) { if (!(ex is StopUploadinException)) { error = ex; } //throw ex; } finally { port.Close(); } lock (this.userStateToLifeTime) { this.CompletionMethod(error, this.canceled); this.userStateToLifeTime.Clear(); } }
public AsyncServerSocketChannelUnsafe(AbstractChannel channel) : base(channel) { }
protected AbstractNioUnsafe(AbstractChannel channel) : base(channel) { }
public SerialCommChannelUnsafe(AbstractChannel channel) : base(channel) { }
public AsyncTcpChannelUnsafe(AbstractChannel channel) : base(channel) { }
public WebSocketChannelUnsafe(AbstractChannel channel) : base(channel) { }
/// <summary> /// Initializes a new instance of the <see cref="CallSubscripter"/> class. /// </summary> /// <param name="chnl">The CHNL.</param> public CallSubscripter(AbstractChannel chnl) { name = "Call Subscripter"; channel = chnl; }
/// <summary> /// Основной метод движка; выполняет обработку запросов пользователя /// </summary> /// <param name="port">Порт, через который происходит отсылка запросов</param> private void ProceedRequests(AbstractChannel channel) { Exception error = null; // используется в событии DebuggerEngineStatusChanged при остановке отладчика // Открытие порта try { channel.Open(); } catch (Exception ex) { error = new Exception("Ошибка окрытия канала: " + ex.Message); goto end; } this.EngineStatus = DebuggerEngineStatus.Started; this.RaiseEngineStatusChangedEvent(new DebuggerEngineStatusChangedEventArgs(DebuggerEngineStatus.Started, null)); // Получение типа подключенного контроллера string ControllerType = channel.ReadControllerType();; if (ControllerType == null) { // Контроллер либо вообще не найден, либо не соответствует настройкам отладчика error = new Exception("Контроллер не найден"); goto end; } this.maxRequestSize = 128; channel.BufferSize = this.maxRequestSize; this.RebuildRequests(); // Выполнение запросов Stopwatch watch = new Stopwatch(); // отслеживает время выполнения очереди запросов while (true) { bool requestsProceeded = false; watch.Start(); try { // Если требуется остановить отладчик, то выходим из цикла if (this.EngineStatus == DebuggerEngineStatus.Stopping) { goto end; } // Если есть запросы на запись, то обрабатываем их if (this.writeItems.Count != 0) { this.ProceedWriteItems(channel); } // Цикл по всем типам памяти, которые присутствуют в очереди foreach (List <ReadRequest> requests in this.requestsByMemory.Values) { // Если требуется остановить отладчик, то выходим из цикла if (this.EngineStatus == DebuggerEngineStatus.Stopping) { goto end; } // Цикл по всем запросам в текущей области памяти for (int i = 0; i < requests.Count; i++) { //Console.WriteLine("/---------------" + DateTime.Now.Millisecond.ToString()); // Если есть запросы на запись, то обрабатываем их if (this.writeItems.Count != 0) { this.ProceedWriteItems(channel); } // Обрабатываем запрос на чтение ReadRequest request = requests[i]; if (this.lockingActive && request.MemoryType == this.lockingMemoryType && request.Address <= this.lockingAddress && request.EndByteOffset >= this.lockingAddress + this.lockingLength - 1) { continue; } requestsProceeded = true; // Если требуется остановить отладчик, то выходим из цикла if (this.EngineStatus == DebuggerEngineStatus.Stopping) { goto end; } byte[] response = channel.ReadFromMemory(request.MemoryType, request.Address, request.BytesToRead);; // Учтснавливаем число прочитанных пакетов if (response == null) { Console.WriteLine("-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-"); this.NearErrors = (this.NearErrors % 3) + 1; if (this.NearErrors == 3) { this.ErrorReadedRequestsCount++; } } else { this.NearErrors = 0; this.ReadedRequestsCount++; } // Обработка всех элементов запроса foreach (RequestItem item in request.Items) { int itemStart = Math.Max(item.Address, request.Address); // индекс первого байта элемента в даных запроса int itemEnd = Math.Min(item.EndByteOffset, request.EndByteOffset); // индекс последнего байта элемента в данных запроса if (response != null) { // Добавляем в элемент считанные данные try { Array.Copy(response, itemStart - request.Address, item.Data, itemStart - item.Address, itemEnd - itemStart + 1); } catch { ; } } else { item.Error = true; } if (item.ProgressChangedCallback != null) { // Элемент надо информировать о процессе получения данных byte[] buffer = null; if (response != null) { // Получаем данные элемента, считанные за текущий запрос buffer = new byte[itemEnd - itemStart + 1]; Array.Copy(response, itemStart - request.Address, buffer, 0, itemEnd - itemStart + 1); } // Устанавливаем параметры для выполнения события object[] Params = new object[4]; Params[0] = item.ProgressChangedCallback; Params[1] = item.Sender; Params[2] = (double)(itemEnd - item.Address + 1) / (item.Data.Length); Params[3] = buffer; // Выплняем Callback в главном потоке this.asyncOp.Post(this.exProgressChangedDelegate, Params); } if (item.ProceedingCompletedCallback != null && item.EndByteOffset <= request.EndByteOffset) { // Нужно проинформировать элемент о завершении получения данных // Устанавливаем параметры для выполнения события object[] Params = new object[4]; Params[0] = item.ProceedingCompletedCallback; Params[1] = item.Sender; Params[2] = item.Data; Params[3] = item.Error; // Выполняем Callback в главном потоке this.asyncOp.Post(this.exProceedingCompleetedDelegate, Params); item.Error = false; } } //Console.WriteLine("\\---------------" + DateTime.Now.Millisecond.ToString()); } } } catch { } watch.Stop(); if (!requestsProceeded) { // Движок работает "в холостую" this.RaiseRequestTimeChangedEvent(new EventArgs <int>(0)); Thread.Sleep(500); } else { // Возвращаем новое значение времени обработки всех запросов this.RaiseRequestTimeChangedEvent(new EventArgs <int>((int)watch.ElapsedMilliseconds)); } watch.Reset(); } end: // Завершение работы отладчика this.RaiseRequestTimeChangedEvent(new EventArgs <int>(0)); channel.Close(); this.EngineStatus = DebuggerEngineStatus.Stopped; this.RaiseEngineStatusChangedEvent(new DebuggerEngineStatusChangedEventArgs(DebuggerEngineStatus.Stopped, error)); this.asyncOp.OperationCompleted(); }
/// <summary> /// Initializes a new instance of the <see cref="CallSubscripter"/> class. /// </summary> /// <param name="chnl">The CHNL.</param> public CallSubscripter(AbstractChannel chnl) { name = "Call Subscripter"; channel = chnl; }
public static void TestChannel(this AbstractChannel ind, string filename, int length) { Quantum q = Quantum.ExcelToQuantum(filename, "symbol", 0); var dz = new DenseMatrix(4 + 3, q.Data.Count); List <string> names = new List <string>(); names.Add("symbol"); names.Add("HIGH"); names.Add(ind.ToString()); names.Add("LOW"); //chartoptions ChartOption[] chartOptions = new ChartOption[names.Count]; chartOptions[0] = new ChartOption() { Height = 500, YPosition = 0 }; chartOptions[1] = new ChartOption() { Height = 0, YPosition = 0, Layover = true }; chartOptions[2] = new ChartOption() { Height = 0, YPosition = 0, Layover = true }; chartOptions[3] = new ChartOption() { Height = 0, YPosition = 0, Layover = true }; int counter = 0; foreach (Tick tick in q) { ind.HandleNextTick(tick); dz[0, counter] = tick.BidOpen; dz[1, counter] = tick.BidHigh; dz[2, counter] = tick.BidLow; dz[3, counter] = tick.BidClose; dz[4, counter] = ind.HI(0); dz[5, counter] = ind.MID(0); dz[6, counter] = ind.LOW(0); counter++; } Visualize.GenerateMultiPaneGraph(new[] { "data", "high", ind.ToString(), "low" }, q.Data.Keys.ToArray(), dz, QSConstants.DEFAULT_DATA_FILEPATH + @"results.html" , new ChartOption[] { new ChartOption() { Height = 500 }, new ChartOption() { Height = 0, Layover = true, YPosition = 0 }, new ChartOption() { Height = 0, Layover = true, YPosition = 0 }, new ChartOption() { Height = 0, Layover = true, YPosition = 0 } }); Console.WriteLine("Done Generating Graph for " + ind.ToString()); }
public StreamSocketChannelUnsafe(AbstractChannel channel) : base(channel) { }
public static void TestChannelLive(this AbstractChannel ind, string symbol, string timeframe, int length) { //------------grab data FXSession session = new FXSession(); session.InitializeSession(); while (!session.LoggedIn) { Thread.Sleep(100); } HistoricPriceEngine h = new HistoricPriceEngine(session); h.GetLongHistoricPrices(symbol, timeframe, length); while (!h.Complete) { Thread.Sleep(100); } //----------------------- var highList = new List <double>(); var medList = new List <double>(); var lowList = new List <double>(); var dataList = new List <double>(); var dateTimeList = new SortedList <DateTime, int>(); Quantum q = h.Data; int count = 0; foreach (Tick t in q) { try{ ind.HandleNextTick(t); highList.Add(ind.HI(0)); medList.Add(ind.MID(0)); lowList.Add(ind.LOW(0)); dataList.Add(t.BidClose); dateTimeList.Add(t.Time, 1); } catch (Exception e) { e.printStackTrace(); } if (count++ > length) { break; } } var dz = new DenseMatrix(4, medList.Count); dz.SetRow(0, new DenseVector(dataList.ToArray())); dz.SetRow(1, new DenseVector(highList.ToArray())); dz.SetRow(2, new DenseVector(medList.ToArray())); dz.SetRow(3, new DenseVector(lowList.ToArray())); Visualize.GenerateMultiPaneGraph(new[] { "data", "high", ind.ToString(), "low" }, dateTimeList.Keys.ToArray(), dz, QSConstants.DEFAULT_DATA_FILEPATH + @"results.html" , new ChartOption[] { new ChartOption() { Height = 500 }, new ChartOption() { Height = 0, Layover = true, YPosition = 0 }, new ChartOption() { Height = 0, Layover = true, YPosition = 0 }, new ChartOption() { Height = 0, Layover = true, YPosition = 0 } }); Console.WriteLine("Done Generating Graph for " + ind.ToString()); }
public DefaultUnsafe(AbstractChannel channel) : base(channel) { }
public void Start(AbstractChannel port, LoaderMode mode) { _port = port; _mode = mode; this.RunWorkerAsync(); }
public TcpChannelInvoker(AbstractChannel parent) : base(parent) { }
protected void AttachChannel(string indicatorName, AbstractChannel i) { channelList.Add(indicatorName, i); }