[Dashboard\Ford\Tranzit\Tranzit 24c16]

Size(280,270);	// ширина и высота

Form 
{
	Group("Пробег",12,10,120,60)
	{
		Digit(Distance," ",5,18,70);
		Label(lbkm,"КМ",90,20);
		Label(lbcon,"403",65,42);
		Label(lbc,"Constant -",15,42);
	}
	Group("Информация",5,80,270,45) 
	{
		Label(message," ",0,18);
	}    
	Group("Описание",5,130,270,90) 
	{
        Label(lb1,"Калькулятор пробега для Ford Tranzit.",0,20);
		Label(lb2,"Eeprom 24c16.",0,35);
		Label(lb3,"Введите нужное значение в окне <Пробег>.",0,50);
		Label(lb4,"Нажмите кнопку <Применить>.",0,65);
	}
	Picture(Logo,"Ford.bmp",160,25,0,0);
}

OnShow 
{
	Var0 = 250;		// константа счета по умолчанию 
	Var1 = 0x1F9; 	// начальный адрес для 32 групп пробега
	Var5 = 0;		// индикатор ошибки
	Var13 = 0;		// счетчик в цикле
	Var43 = 0;		// Наибольший пробег в дампе
			
	// Проверяем область пробега на "вшивость", одновременно ищем наибольший пробег
	while(Var13 < 5) 
	{
		Var23 = 0; 
		Var2 = @(Var1 + 1) << 4;			// первые два байта пробега
		Var3 = (@(Var1) >> 4) & 0x0F;		// третий байт пробега
		Var3 = Var3 | Var2;					// пробег деленный на коэфиициент - нужен для проверки CRC
		Var4 = @(Var1 + 3); //				// "малый" круг
		Var4 = (Var4 * 160934) / 100000;	// преобразование малого круга из мл в км, для авто у которых пробег хранится в мл, а показывается в км.
		Var33 = (((Var3 * Var0) * 160934) / 100000) + Var4; 		// точное значение пробега
		if(Var43 < Var33) {Var43 = Var33;} 	// здесь будет наибольший пробег

		// проверка корректности дампа (вычисление CRC и сравнение ее со значением в дампе)
		Var12 = @(Var1) & 0x0F;			// CRC лежаций в дампе
		Var14 = Var3;
		Var10 = 0;							// CRC который должен соответствовать пробегу
		Var10 = (Var14 & 0x0F) ^ 5;
		while(Var23 < 3)
		{
			// это вместо таблицы;
			if(Var10 =  1) {Var10 = 0x1D;}
			if(Var10 =  2) {Var10 = 0x17;}
			if(Var10 =  3) {Var10 = 0x1A;}
			if(Var10 =  4) {Var10 = 0x1E;}
			if(Var10 =  5) {Var10 = 0x13;}
			if(Var10 =  6) {Var10 = 0x19;}
			if(Var10 =  7) {Var10 = 0x14;}
			if(Var10 =  8) {Var10 = 0x11;}
			if(Var10 =  9) {Var10 = 0x1C;}
			if(Var10 = 10) {Var10 = 0x16;}
			if(Var10 = 11) {Var10 = 0x1B;}
			if(Var10 = 12) {Var10 = 0x1F;}
			if(Var10 = 13) {Var10 = 0x12;}
			if(Var10 = 14) {Var10 = 0x18;}
			if(Var10 = 15) {Var10 = 0x15;}	
			Var10 = Var10 & 0x0F;
			Var10 =((Var14 >> 4) & 0x0F) ^ Var10;
			Var14 = Var14 >> 4;	
			Var23 = Var23 + 1;	
		}
		Var1 = Var1 + 4;	
		Var13 = Var13 + 1;	
		Var10 = Var10 & 0x0F;
		if (Var10 != Var12) {Var5 = 1;}
	}
	if(Var5 != 0) 
	{
		message.Color = 0x0000FF; 
		message.Bold = 1;
		message = "Неверный дамп!"; 
		Distance = 0;
	}
	else
	{
		lbcon.Bold = 1;
		message.Color = 0xFF0000;
		message.Bold = 1;
		message = "Введите пробег";
		Distance = Var43;
	}
}

OnApply 
{
	Var0 = (Distance * 100000) / 160934;
	Var1 = 250;
	Var2 = 0;
	Var3 = 0;
	Var4 = 0;
	Var5 = 0x1F9;	// начальный адрес для 5 групп пробега
	Var12 = 0;
	if(Var0 > 843570)	
	{
		message.Color = 0x0000FF; 
		message.Bold = 1;
		message = "Пробег должен быть от 1 до 843570 км"; // 843570 для константы 206 и 524160 - для 128
	}
	else
    {
		Var3 = 0;
		Var6 = Var0 / Var1;
		Var4 = Var6;

		// ----------------- вычисление контрольной суммы
		Var10 = 0;	// это будет контрольная сумма
		Var10 = (Var4 & 0x0f) ^ 5;

		while(Var3 < 3)
		{
			// это вместо таблицы;
			if(Var10 =  1) {Var10 = 0x1D;}
			if(Var10 =  2) {Var10 = 0x17;}
			if(Var10 =  3) {Var10 = 0x1A;}
			if(Var10 =  4) {Var10 = 0x1E;}
			if(Var10 =  5) {Var10 = 0x13;}
			if(Var10 =  6) {Var10 = 0x19;}
			if(Var10 =  7) {Var10 = 0x14;}
			if(Var10 =  8) {Var10 = 0x11;}
			if(Var10 =  9) {Var10 = 0x1C;}
			if(Var10 = 10) {Var10 = 0x16;}
			if(Var10 = 11) {Var10 = 0x1B;}
			if(Var10 = 12) {Var10 = 0x1F;}
			if(Var10 = 13) {Var10 = 0x12;}
			if(Var10 = 14) {Var10 = 0x18;}
			if(Var10 = 15) {Var10 = 0x15;}	
			Var10 = Var10 & 0x0f;

			Var10 = ((Var4 >> 4) & 0x0f) ^ Var10;
			Var4 = Var4 >> 4;	
			Var3 = Var3 + 1;	
		}
		// ----------------- вычисление контрольной суммы

		Var15 = (Var6 >> 4) & 0xFF; 					// Старшие 2 байта пробега
		Var14 = ((Var6 << 4) & 0xF0) | (Var10 & 0x0F);	// Младший байт пробега + контролька

		Var13 = (Var0 % Var1) + 1;
		Var1 = 0;		// инидикатор ошибки
		if(Var13 < 5) {Var1 = 1;}
		if(Var0 < 5) {Var1 = 1;}
		if(Var1 = 1)
		{
			Var23 = (Var13 % 5) + 1;
			Var13 = 0;
			while(Var12 < Var23)
			{
				@Var5 = Var14; Var5 = Var5 + 1; // Старшие 2 байта пробега
				@Var5 = Var15; Var5 = Var5 + 2; // Младший байт пробега + контролька
				@Var5 = Var13; Var5 = Var5 + 1; // Малый круг
				
				Var13 = Var13 + 1;
				Var12 = Var12 + 1;
			}
			while(Var23 < 5) 
			{ // Заполняем дамп, когда значение малого круга является "незначащим"
				@Var5 = Var14; Var5 = Var5 + 1; // Старшие 2 байта пробега
				@Var5 = Var15; Var5 = Var5 + 2; // Младший байт пробега + контролька
				@Var5 = 0x00;					// Это "0" для панели
				Var5 = Var5 + 1;
				Var23 = Var23 + 1;
			}
		}
		else 
		{
			Var23 = (Var13 / 5) * 5;
			Var13 = Var13 + 1;
			while(Var12 < 5)
			{ // Заполнение дампа если пробег больше 32км.
				@Var5 = Var14; Var5 = Var5 + 1; // Два старших байта пробега
				@Var5 = Var15; Var5 = Var5 + 2; // Младщий байт пробега + контролька
				@Var5 = Var23; Var5 = Var5 + 1; // Малый круг
				Var23 = Var23 + 1;
				Var12 = Var12 + 1;

				if(Var23 = Var13) {Var23 = Var13 - 5;}
			}
		}
		message.Color = 0xff0000;
        message = "Дамп OK. Новый пробег записан.";
	}
}
