[Dashboard\Peugeot\308\BSI 308 95128 Var3]

Size(280,300); 

Form 
{
    Group("Пробег",15,10,120,50)
    {
        Digit(Distance," ",5,18,70);
        Label(lbkm,"КМ",90,20);
    }
    Group("Идентификация",5,70,270,65)
    {
        Label(pn," ",0,15);
        Label(Login," ",0,32);
    }
    Group("Информация",5,115,270,45) 
    {
        Label(msg," ",0,18);
    }    
    Group("Описание",5,160,270,90) 
    {
        Label(lb1,"Калькулятор пробега для Peugeot 308 BSI.",0,20);
        Label(lb2,"EEPROM 95128.",0,35);
        Label(lb3,"Введите нужное значение в окне <Пробег>.",0,50);
        Label(lb4,"Нажмите кнопку <Применить>.",0,65);
    }
    Picture(Logo,"Peugeot.bmp",180,8,0,0);
}

Var Counter, CRC, TempCRC, FlagVIN, TempDist, MaxDist, Error;
Var AddrVIN, AddrPIN, Address, StartAddr, EndAddr, TempAddr;

CheckCRC
{
	Counter = 0;
	TempAddr = StartAddr;
	while(Counter < 8)
	{
		TempCRC = @TempAddr + @(TempAddr + 1) + @(TempAddr + 2) + @(TempAddr + 3);
		TempCRC = (TempCRC & 0xFF) ^ 0xFF;
		CRC = @(TempAddr + 4) & 0xFF;
		if(TempCRC != CRC)
		{ 
			Error = 1; 
			Counter = 8;
			MaxDist = 0;
		}
		else
		{ 
			Error = 0;
			TempDist = (@(TempAddr + 1) << 16) | (@(TempAddr + 2) << 8) | @(TempAddr + 3); // Текущий пробег
	        TempDist = TempDist  ^ 0xFFFFFF;
			if(MaxDist < TempDist) {MaxDist = TempDist;} // Ищем максимальный пробег
			Counter = Counter + 1;
			TempAddr = TempAddr + 6; // Начальный адрес следующей копии пробега
		}
	}
}

SetAddress
{
	if(Address = 0x210) {AddrVIN = 0x94; AddrPIN = 0xA18;}
}

OnShow 
{
    StartAddr = 0x200; // Начальный адрес
	EndAddr = StartAddr + 0x40; // Все попадавшиеся варианты лежали в этих строках
	Counter = 0;
	FlagVIN = 0;
//	ClearHistory = 1;

    while(StartAddr < EndAddr)
    {
        CheckCRC;
		if(Error = 0)
		{
			Address = StartAddr;
			StartAddr = EndAddr; // Выходим из цикла - пробег найден.
		}
		else
		{
			StartAddr = StartAddr + 1; // Начальный адрес следующей копии пробега
		} 
	}

//    Error = 1;
    if(Error = 1)
    {
        msg.Color = 0xFF;
        msg.Bold = 1;
        msg = "Неверный дамп!";
        Distance = Address;
    }
    else
    {
		SetAddress;
		Var99 = AddrVIN;
        Var1 = @(Var99) ^ 0xFF; Var2 = @(Var99 + 1) ^ 0xFF; Var3 = @(Var99 + 2) ^ 0xFF; Var4 = @(Var99 + 3) ^ 0xFF; Var5 = @(Var99 + 4) ^ 0xFF; Var6 = @(Var99 + 5) ^ 0xFF; Var7 = @(Var99 + 6) ^ 0xFF;
        Var8 = @(Var99 + 7) ^ 0xFF; Var9 = @(Var99 + 8) ^ 0xFF; Var10 = @(Var99 + 9) ^ 0xFF; Var11 = @(Var99 + 10) ^ 0xFF; Var12 = @(Var99 + 11) ^ 0xFF; Var13 = @(Var99 + 12) ^ 0xFF; Var14 = @(Var99 + 13) ^ 0xFF;
		Var15 = @(Var99 + 14) ^ 0xFF; Var16 = @(Var99 + 15) ^ 0xFF; Var17 = @(Var99 + 16) ^ 0xFF;
        pn = "VIN: " + #c.Var1 + #c.Var2 + #c.Var3 + #c.Var4 + #c.Var5 + #c.Var6 + #c.Var7 + #c.Var8 + #c.Var9 + #c.Var10 +
			 #c.Var11 + #c.Var12 + #c.Var13 + #c.Var14 + #c.Var15 + #c.Var16 + #c.Var17; 

		Var99 = AddrPIN;
        Var1 = @(Var99) ^ 0xFF; Var2 = @(Var99 + 1) ^ 0xFF; Var3 = @(Var99 + 2) ^ 0xFF; Var4 = @(Var99 + 3) ^ 0xFF;
        Login = "LOGIN: " + #c.Var4 + #c.Var3 + #c.Var2 + #c.Var1;
        msg.Color = 0x00;
        msg.Bold = 1;
        msg = "      Дамп OK!";
        Distance = MaxDist / 10;
    }
}

OnApply 
{
    Var10 = Distance;
    Var0 = 0;
    if(Var10 < 100)     {Var0 = 1;}
    if(Var10 > 999900)  {Var0 = 1;}

    if(Var0 = 1)
    {
        msg.Color = 0xFF;
        msg.Bold = 1;
        msg = "Пробег должен быть от 0 до 999900 км";        
    }
    else
    {
        Var5 = Address; // Начальный адрес
        Var11 = 0;
        Var10 = Var10 * 10;    
          
        Var1 = (Var10 & 0xFF) ^ 0xFF; 
        Var2 = ((Var10 >> 8) & 0xFF) ^ 0xFF; 
        Var3 = ((Var10 >> 16) & 0xFF) ^ 0xFF; 
        Var4 = ((Var10 >> 24) & 0xFF)  ^ 0xFF; 
		CRC = ((Var1 + Var2 + Var3 + Var4) & 0xFF) ^ 0xFF;
		
        // заполняем дамп
        while (Var11 < 8)
		{
			@Var5 = Var4; Var5 = Var5 + 1;
			@Var5 = Var3; Var5 = Var5 + 1;
			@Var5 = Var2; Var5 = Var5 + 1;
			@Var5 = Var1; Var5 = Var5 + 1;
			@Var5 = CRC; Var5 = Var5 + 2;
			Var11 = Var11 + 1;
        } 

		Var5 = 0x1000;
		While(Var5 != 0x4000)
        {
			Var1 = @Var5;
			if(Var1 != 0xFF) { @Var5 = 0xFF; }
			Var5 = Var5 + 1;
        }

        msg.Color = 0x00;
        msg.Bold = 1;
        msg = "Дамп OK!";
    }
}


