예제 #1
0
        internal void UpdatePIarea()
        {
            if (m_fileName == "")
            {
                return;
            }
            int checksumAreaOffset = ChecksumT8.GetChecksumAreaOffset(m_fileName);
            int endOfPIArea        = GetEmptySpaceStartFrom(m_fileName, checksumAreaOffset);

            //Console.WriteLine("Area: " + checksumAreaOffset.ToString("X8") + " - " + endOfPIArea.ToString("X8"));
            byte[] piarea = readdatafromfile(m_fileName, checksumAreaOffset, endOfPIArea - checksumAreaOffset + 1);
            //Console.WriteLine("Size: " + piarea.Length.ToString());
            for (int t = 0; t < piarea.Length; t++)
            {
                piarea[t] += 0xD6;
                piarea[t] ^= 0x21;
            }
            int i    = 0;
            int len  = 0;
            int type = 0;

            do
            {
                if (i == piarea.Length)
                {
                    break;
                }
                len  = Convert.ToInt32(piarea[i++]);
                type = Convert.ToInt32(piarea[i++]);
                if (len == 0xF7 && type == 0xF7)
                {
                    break;
                }

                Console.WriteLine("Len: " + len.ToString("X2") + " Type = " + type.ToString("X2"));

                if (type == 0x92 || type == 0x97 || type == 0x0C || type == 0xC1 || type == 0x08 || type == 0x1D || type == 0x10 || type == 0x0A || type == 0x0F || type == 0x16)
                {
                    for (int f = 0; f < len; f++)
                    {
                        switch (type)
                        {
                        case 0x10:
                            piarea[i++] = Convert.ToByte(m_programmerDevice[f]);
                            break;

                        case 0x1D:
                            piarea[i++] = Convert.ToByte(m_programmerName[f]);
                            break;

                        case 0x0A:
                            piarea[i++] = Convert.ToByte(m_releaseDate[f]);
                            break;

                        case 0x08:
                            // Disabled
                            //piarea[i++] = Convert.ToByte(m_SoftwareVersion[f]);
                            i++;
                            break;

                        case 0xC1:
                            piarea[i++] = Convert.ToByte(m_PartNumber[f]);
                            break;

                        case 0x92:
                            piarea[i++] = Convert.ToByte(m_hardwareID[f]);
                            break;

                        case 0x97:
                            piarea[i++] = Convert.ToByte(m_deviceType[f]);
                            break;
                        }
                    }
                }
            } while (i < piarea.Length - 1);

            for (int t = 0; t < piarea.Length; t++)
            {
                piarea[t] ^= 0x21;
                piarea[t] -= 0xD6;
            }

            savedatatobinary(checksumAreaOffset, piarea.Length, piarea, m_fileName);
        }
예제 #2
0
        private void DecodeInfo(string filename)
        {
            if (filename == "")
            {
                return;
            }
            int checksumAreaOffset = ChecksumT8.GetChecksumAreaOffset(filename);
            int endOfPIArea        = GetEmptySpaceStartFrom(filename, checksumAreaOffset);

            //logger.Debug("Area: " + checksumAreaOffset.ToString("X8") + " - " + endOfPIArea.ToString("X8"));
            byte[] piarea = readdatafromfile(filename, checksumAreaOffset, endOfPIArea - checksumAreaOffset + 1);
            //logger.Debug("Size: " + piarea.Length.ToString());
            for (int t = 0; t < piarea.Length; t++)
            {
                piarea[t] += 0xD6;
                piarea[t] ^= 0x21;
            }
            int i    = 0;
            int len  = 0;
            int type = 0;

            do
            {
                if (i == piarea.Length)
                {
                    break;
                }
                len  = Convert.ToInt32(piarea[i++]);
                type = Convert.ToInt32(piarea[i++]);
                if (len == 0xF7 && type == 0xF7)
                {
                    break;
                }
                //printf("\nLENGTH = %02X, TYPE = %02X, text = ", len, type);

                string data = string.Empty;
                try
                {
                    for (int f = 0; f < len; f++)
                    {
                        if (type == 0x92 || type == 0x97 || type == 0x0C || type == 0xC1 || type == 0x08 || type == 0x1D || type == 0x10 || type == 0x0A || type == 0x0F || type == 0x16)
                        {
                            data += Convert.ToChar(piarea[i++]);
                        }
                        else
                        {
                            data += piarea[i++].ToString("X2");
                        }
                    }
                }
                catch (Exception E)
                {
                    logger.Debug(E.Message);
                }
                logger.Debug("Len: " + len.ToString("X2") + " Type = " + type.ToString("X2") + "   " + data);

                /*
                 * Len: 10 Type = 0D   58 C3 25 2D 92 B3 2D 82 95 E5 E4 23 15 E3 A4 55  // layer 1 checksum
                 * Len: 09 Type = 92   GMPT 0100		//Hardware ID
                 * Len: 14 Type = 97   ECM          //Type of device
                 * Len: 02 Type = 9A   01 08        //revision???
                 * Len: 01 Type = 1E   01
                 * Len: 03 Type = 0C   82h			//version extension?
                 * Len: 04 Type = CB   03 4F C5 10
                 * Len: 02 Type = DB   20 20
                 * Len: 08 Type = C1   55559436
                 * Len: 02 Type = D1   20 20
                 * Len: 1E Type = 08   FA5I_C_FME2_65_FIEF_82h       //version?
                 * Len: 02 Type = 95   00 04
                 * Len: 06 Type = 96   2D 20 20 20 20 20
                 * Len: 04 Type = FB   02 70 84 9B  //layer2 checksum
                 * Len: 04 Type = FC   00 0B AF 06  //CHECKSUM LAST ADDRESS
                 * Len: 04 Type = FD   00 02 00 00  //ROM OFFSET
                 * Len: 06 Type = 16   p50660
                 * Len: 13 Type = 0A   2004-08-12 14:13:34		// release date
                 * Len: 1E Type = 0F   FA5I_C_FME2_XX_XXX_XXX.tmp
                 * Len: 0F Type = 1D   Stefan Mossberg	//programmed by name?
                 * Len: 0C Type = 10   EOLStation2		//programmed by device                 * */
                switch (type)
                {
                case 0x10:
                    m_programmerDevice = data;
                    break;

                case 0x1D:
                    m_programmerName = data;
                    break;

                case 0x0A:
                    m_releaseDate = data;
                    break;

                case 0x08:
                    m_SoftwareVersion = data;
                    break;

                case 0xC1:
                    m_PartNumber = data;
                    break;

                case 0x92:
                    m_hardwareID = data;
                    break;

                case 0x97:
                    m_deviceType = data;
                    break;
                }
            } while (i < piarea.Length - 1);

            //TODO: decode vin parts etc
            DecodeExtraInfo(filename);
        }