private static void SendExecuted(ExecutedInfo info, int?id, int code = 0, string message = null) { // First set status SendMinerStatus(false); // Then executed var data = new ExecutedCall(id ?? -1, code, message).Serialize(); _socket?.SendData(data); // Login if we have to if (info?.LoginNeeded ?? false) { _socket?.StartConnection(info.NewBtc, info.NewWorker, info.NewRig); } }
private static void SendExecuted(ExecutedInfo info, int?id, int code = 0, string message = null) { IsRPC = true; try { // First set status NHM.Common.Logger.Debug("SOCKET", "SendExecuted-SendMinerStatus(false);"); //SendMinerStatus(false); // THIS LINE HERE IS PROBLEMATIC BECAUSE IT DOESN'T WAIT FOR TASK COMPLETION while (SendMinerStatusTasks.TryDequeue(out var t)) { CancelNotifyStateChangedTask(); try { //NHM.Common.Logger.Info("DEBUGDELSOCKET", "SendExecuted-WAIT-START"); t.Wait(); //NHM.Common.Logger.Info("DEBUGDELSOCKET", "SendExecuted-WAIT-END"); } catch { //NHM.Common.Logger.Info("DEBUGDELSOCKET", "SendExecuted-WAIT-EXCEPTION"); } } SendMinerStatus(false); // Then executed var data = new ExecutedCall(id ?? -1, code, message).Serialize(); _socket?.SendData(data); // Login if we have to if (info?.LoginNeeded ?? false) { _socket?.StartConnection(info.NewBtc, info.NewWorker, info.NewRig); } } finally { IsRPC = false; } }
static private async Task HandleRpcMessage(string method, string data) { string btc = null; string worker = null; string group = null; int rpcId = -1; bool executed = false; bool loginNeeded = false; ExecutedCall executedCall = null; try { _isInRPC.Value = true; dynamic message = JsonConvert.DeserializeObject(data); int? rpcIdOption = (int?)message.id; rpcId = rpcIdOption ?? -1; ThrowIfWeCannotHanldeRPC(); switch (method) { case "mining.set.username": btc = (string)message.username; executed = await miningSetUsername(btc); loginNeeded = executed; break; case "mining.set.worker": worker = (string)message.worker; executed = await miningSetWorker(worker); loginNeeded = executed; break; case "mining.set.group": group = (string)message.group; executed = miningSetGroup(group); loginNeeded = executed; break; case "mining.enable": executed = await SetDevicesEnabled((string)message.device, true); break; case "mining.disable": executed = await SetDevicesEnabled((string)message.device, false); break; case "mining.start": executed = await StartMining((string)message.device); break; case "mining.stop": executed = await StopMining((string)message.device); break; case "mining.set.power_mode": // TODO not supported atm SetPowerMode((string)message.device, (TDPSimpleType)message.power_mode); break; default: throw new RpcException($"RpcMessage operation not supported for method '{method}'", ErrorCode.UnableToHandleRpc); } executedCall = new ExecutedCall(rpcId, 0, null); } catch (RpcException rpcEx) { executedCall = new ExecutedCall(rpcId, rpcEx.Code, rpcEx.Message); } finally { _isInRPC.Value = false; if (executedCall != null) { // send miner status and send executed var minerStatusMsg = CreateMinerStatusMessage(); Send(minerStatusMsg); _lastSendMinerStatusTimestamp.Value = DateTime.UtcNow; // Then executed var rpcMessage = executedCall.Serialize(); Send(rpcMessage); // Login if we have to if (loginNeeded) { SetCredentials(btc, worker, group); } } } }