Example #1
0
        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);
            }
        }
Example #2
0
 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;
     }
 }
Example #3
0
        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);
                    }
                }
            }
        }