Esempio n. 1
0
        internal void writeUsb(ClovershellCommand cmd, byte arg, byte[] data = null, int l = -1)
        {
            if (!online)
            {
                throw new ClovershellException("NES Mini is offline");
            }
            var len  = (l >= 0) ? l : ((data != null) ? data.Length : 0);
            var buff = new byte[len + 4];

            buff[0] = (byte)cmd;
            buff[1] = arg;
            buff[2] = (byte)(len & 0xFF);
            buff[3] = (byte)((len >> 8) & 0xFF);
            if (data != null)
            {
                Array.Copy(data, 0, buff, 4, len);
            }
            int tLen = 0;
            int pos  = 0;

            len += 4;
            int repeats = 0;

            while (pos < len)
            {
                var res = epWriter.Write(buff, pos, len, 1000, out tLen);
                pos += tLen;
                len -= tLen;
                if (res != ErrorCode.Ok)
                {
                    if (repeats >= 3)
                    {
                        break;
                    }
                    repeats++;
                    Thread.Sleep(100);
                }
            }
            if (len > 0)
            {
                throw new ClovershellException("write error");
            }
        }
Esempio n. 2
0
        internal void writeUsb(ClovershellCommand cmd, byte arg, byte[] data = null, int pos = 0, int l = -1)
        {
            if (!IsOnline) throw new ClovershellException("NES Mini is offline");
            if (epWriter == null) return;
            lock (epWriter)
            {
                var len = (l >= 0) ? l : ((data != null) ? (data.Length - pos) : 0);
#if VERY_DEBUG
                Debug.WriteLine(string.Format("->[CLV] cmd={0}, arg={1:X2}, len={2}, data={3}", cmd, arg, len, data != null ? BitConverter.ToString(data, pos, len) : ""));
#endif
                var buff = new byte[len + 4];
                buff[0] = (byte)cmd;
                buff[1] = arg;
                buff[2] = (byte)(len & 0xFF);
                buff[3] = (byte)((len >> 8) & 0xFF);
                if (data != null)
                    Array.Copy(data, pos, buff, 4, len);
                int tLen = 0;
                pos = 0;
                len += 4;
                int repeats = 0;
                while (pos < len)
                {
                    var res = epWriter.Write(buff, pos, len, 1000, out tLen);
#if VERY_DEBUG
                    Debug.WriteLine("->[CLV] " + BitConverter.ToString(buff, pos, len));
#endif
                    pos += tLen;
                    len -= tLen;
                    if (res != ErrorCode.Ok)
                    {
                        if (repeats >= 10) break;
                        repeats++;
                        Thread.Sleep(100);
                    }
                }
                if (len > 0)
                    throw new ClovershellException("write error");
            }
        }
Esempio n. 3
0
        void proceedPacket(ClovershellCommand cmd, byte arg, byte[] data, int pos, int len)
        {
            if (len < 0)
                len = data.Length;
#if VERY_DEBUG
            Debug.WriteLine(string.Format("<-[CLV] cmd={0}, arg={1:X2}, len={2}, data={3}", cmd, arg, len, BitConverter.ToString(data, pos, len)));
#endif
            lastAliveTime = DateTime.Now;
            switch (cmd)
            {
                case ClovershellCommand.CMD_PONG:
                    lastPingResponse = new byte[len];
                    Array.Copy(data, pos, lastPingResponse, 0, len);
                    break;
                case ClovershellCommand.CMD_SHELL_NEW_RESP:
                    acceptShellConnection(arg);
                    break;
                case ClovershellCommand.CMD_SHELL_OUT:
                    shellOut(arg, data, pos, len);
                    break;
                case ClovershellCommand.CMD_SHELL_CLOSED:
                    shellClosed(arg);
                    break;
                case ClovershellCommand.CMD_EXEC_NEW_RESP:
                    newExecConnection(arg, Encoding.UTF8.GetString(data, pos, len));
                    break;
                case ClovershellCommand.CMD_EXEC_STDOUT:
                    execOut(arg, data, pos, len);
                    break;
                case ClovershellCommand.CMD_EXEC_STDERR:
                    execErr(arg, data, pos, len);
                    break;
                case ClovershellCommand.CMD_EXEC_RESULT:
                    execResult(arg, data, pos, len);
                    break;
                case ClovershellCommand.CMD_EXEC_STDIN_FLOW_STAT:
                    execStdinStat(arg, data, pos, len);
                    break;
            }
        }