public override string interpret(FullBinaryReader reader)
        {
            StringBuilder logentry = new StringBuilder();

            J2534_0404func f = (J2534_0404func)reader.ReadByte();

            checkEnum(typeof(J2534_0404func), f);

            logentry.Append(f + "(");

            //Loop over params
            bool firstparam = true;

            wiredatatype datatype = (wiredatatype)reader.ReadByte();

            while (datatype != wiredatatype.END)
            {
                if (!firstparam)
                {
                    logentry.Append(", ");
                }
                parseDataField(reader, logentry, datatype);
                firstparam = false;
                datatype   = (wiredatatype)reader.ReadByte();
            }

            logentry.Append(") -> ");
            J2534_errorCodes retcode = (J2534_errorCodes)reader.ReadInt32();

            checkEnum(typeof(J2534_errorCodes), retcode);
            logentry.Append(retcode);

            return(logentry.ToString());
        }
コード例 #2
0
        private void recvThreadFunc()
        {
            bool is_mid_msg = false;

            try
            {
                UInt16 wireProtoVersion = streamreader.ReadUInt16();
                if (wireProtoVersion != 0x0000)
                {
                    state = CONNSTATE.Unsupported;
                    form.updateConnectionListEntry(this);
                    return;
                }
                UInt16 J2534ProtoVersion = streamreader.ReadUInt16();
                switch (J2534ProtoVersion)
                {
                case 0x0404:
                    interpreter = new J2534ProtocolInterpreter_0404();
                    break;

                default:
                    state = CONNSTATE.Unsupported;
                    form.updateConnectionListEntry(this);
                    return;
                }

                state = CONNSTATE.Connected;
                form.updateConnectionListEntry(this);

                //Setup complete, Loop forever processing messages.
                while (state == CONNSTATE.Connected)
                {
                    msgtype mtype = (msgtype)streamreader.ReadByte();
                    checkEnum(typeof(msgtype), mtype);
                    is_mid_msg = true;

                    switch (mtype)
                    {
                    case msgtype.reportParam:
                        StringBuilder logentry = new StringBuilder();
                        param         p        = (param)streamreader.ReadByte();
                        checkEnum(typeof(param), p);

                        switch (p)
                        {
                        case param.client:
                            Client = streamreader.ReadString();
                            form.updateConnectionListEntry(this);
                            logentry.Append("Client: " + Client);
                            //logWriter.WriteLine("Client: " + Client);
                            break;

                        case param.driver:
                            Driver = streamreader.ReadString();
                            logentry.Append("Driver: " + Driver);
                            //logWriter.WriteLine("Driver: " + Driver);
                            int driverstatus = streamreader.ReadInt32();
                            if (driverstatus != 0)
                            {
                                close();
                                state = CONNSTATE.Error;
                                if (driverstatus > 0)
                                {
                                    state = CONNSTATE.BadDriver;
                                }
                                else if (driverstatus == -1)
                                {
                                    state = CONNSTATE.MissingDriver;
                                }
                            }
                            form.updateConnectionListEntry(this);
                            break;
                        }

                        saveLogEntry(logentry.ToString());
                        break;

                    case msgtype.J2534Msg:
                        saveLogEntry(interpreter.interpret(streamreader));
                        EventCount++;
                        form.updateConnectionListEntry(this);
                        break;
                    }
                    is_mid_msg = false;
                }
            }
            catch (System.ObjectDisposedException)
            {
                Console.WriteLine("Connectionclosed, unable to do stuff.");
                state = CONNSTATE.Disconnected;
                form.updateConnectionListEntry(this);
            }
            catch (System.Net.Sockets.SocketException e)
            {
                catchSocketException(e);
            }
            catch (System.IO.IOException e)
            {
                if (e.InnerException is System.Net.Sockets.SocketException)
                {
                    catchSocketException((System.Net.Sockets.SocketException)e.InnerException);
                }
                else if (!is_mid_msg)
                {
                    state = CONNSTATE.Disconnected;
                    form.updateConnectionListEntry(this);
                    socket.Close();
                }
                else
                {
                    die();
                }
            }
            catch (InvalidEnumException e)
            {
                Console.WriteLine(e.ToString());
                die();
            }
        }
        private void parseDataField(FullBinaryReader reader, StringBuilder logentry, wiredatatype datatype)
        {
            checkEnum(typeof(wiredatatype), datatype);

            switch (datatype)
            {
            case wiredatatype.INT:
                logentry.Append(reader.ReadUInt32().ToString());
                break;

            case wiredatatype.STRING:
                logentry.Append(ToLiteral(reader.ReadString()));
                break;

            case wiredatatype.POINTER:
                pointernulltype isvalid = (pointernulltype)reader.ReadByte();
                checkEnum(typeof(pointernulltype), isvalid);
                switch (isvalid)
                {
                case pointernulltype.NULL:
                    logentry.Append("NULL");
                    break;

                case pointernulltype.NOTNULL:
                    datatype = (wiredatatype)reader.ReadByte();
                    parseDataField(reader, logentry, datatype);
                    break;
                }
                break;

            case wiredatatype.MSG:
            {
                logentry.Append("{");

                parseDataField(reader, logentry, wiredatatype.J2534_PROTOCOL_ID);        //ProtocolID
                logentry.Append("; ");

                logentry.Append("RxStatus: ");
                parseDataField(reader, logentry, wiredatatype.J2534_RXSTATUS);        //RxStatus
                logentry.Append("; ");

                logentry.Append("TxFlags: ");
                parseDataField(reader, logentry, wiredatatype.J2534_TXFLAGS);        //TxFlags
                logentry.Append("; ");

                var ts = reader.Read7BitEncodedInt();
                logentry.Append("TS: " + TimeSpan.FromMilliseconds(ts / 1000).ToString() + "; ");      //Timestamp

                uint   extradata = (uint)reader.Read7BitEncodedInt();
                int    datasize  = reader.Read7BitEncodedInt();
                byte[] data      = reader.ReadBytes(datasize);
                logentry.Append("LEN: " + data.Length + "; ");                  //DataSize
                logentry.Append("ExtraIndex: " + extradata + "; ");             //ExtraDataIndex
                logentry.Append("Data: " + System.BitConverter.ToString(data)); //data

                logentry.Append("}");
            }
            break;

            case wiredatatype.DATAARRAY:
            {
                int    datasize = reader.Read7BitEncodedInt();
                byte[] data     = reader.ReadBytes(datasize);
                logentry.Append(System.BitConverter.ToString(data));
            }
            break;

            case wiredatatype.ARRAY:
            {
                logentry.Append("[");
                UInt32 len = (UInt32)reader.Read7BitEncodedInt();
                for (UInt32 i = 0; i < len; i++)
                {
                    if (i != 0)
                    {
                        logentry.Append(", ");
                    }
                    datatype = (wiredatatype)reader.ReadByte();
                    parseDataField(reader, logentry, datatype);
                }
                logentry.Append("]");
            }
            break;

            case wiredatatype.INOUT_INT:
            {
                logentry.Append((UInt32)reader.Read7BitEncodedInt());
                logentry.Append("=>");
                logentry.Append((UInt32)reader.Read7BitEncodedInt());
            }
            break;

            case wiredatatype.J2534_PROTOCOL_ID:
                processJ2534Enum(reader, logentry, typeof(J2534_protocolValues));
                break;

            case wiredatatype.J2534_FILTER_TYPE:
                processJ2534Enum(reader, logentry, typeof(J2534_filterTypes));
                break;

            case wiredatatype.J2534_PROG_VOLTAGE_PIN_NUMBER:
                processJ2534Enum(reader, logentry, typeof(J2534_progVoltagePinNumbers));
                break;

            case wiredatatype.J2534_PROG_VOLTAGE:
                processJ2534Enum(reader, logentry, typeof(J2534_programmingVolgate));
                break;

            case wiredatatype.J2534_IOCTL:
                processJ2534Enum(reader, logentry, typeof(J2534_IOCTLIDs));
                break;

            case wiredatatype.J2534_CONFIG_PARAMS:
                processJ2534Enum(reader, logentry, typeof(J2534_configParams));
                break;

            case wiredatatype.J2534_CONNECT_FLAGS:
                processBitfield(reader, logentry, typeof(J2534_connectFlags));
                break;

            case wiredatatype.J2534_TXFLAGS:
                processBitfield(reader, logentry, typeof(J2534_txFlags));
                break;

            case wiredatatype.J2534_RXSTATUS:
                processBitfield(reader, logentry, typeof(J2534_rxStatus));
                break;
            }
        }