(function(exports){
	'use strict'
	
	// Положение секций в прошивке
	var CONFIG_AT = 0xF000;
	var LAST_VALUE_AT = 0x08;
	var LAST_VALUE_COPY_AT = 0x50;
	
	
	exports.burn = function(firmware, fw_rev) {
		
		ui.progress(0);
		
		// Запрашиваем серийный номер
		var serial = ui.askNumber("Введите серийный номер:", 0, 999999999999999999);
		if (serial === undefined) return "Отменено";
		
		// Запрашиваем начальное значение счётчика
		var initial_value = ui.askNumber("Введите начальное показание (л):", 0, 999999999);
		if (initial_value === undefined) return "Отменено";
		
		// Читаем файл с прошивкой
		var bin=require("scripts/IntelHex").load(firmware, [ { address: 0x08000000, size: 65536 } ])[0].data;
		
		// Делаем размер прошивки 64кб, чтобы стереть старый архив
		if (bin.length < 65536)
			bin[65535]=0;
		
		
		// Создаем конфигурацию
		pack.u64(serial, bin, CONFIG_AT+0);
		pack.u32(initial_value, bin, CONFIG_AT+8);
		pack.u16(200, bin, CONFIG_AT+12);	// counter ration x100
		pack.u16(1, bin, CONFIG_AT+14)		// version
		pack.u32(crc.crc32(bin, CONFIG_AT, 16), bin, CONFIG_AT+16);
		
		
		// Сохраняем файл для прошивки
		fs.writeBinary("tmp/rm_ax.bin", bin);
		
		// Запускаем программирование
		ui.progress(-1);
		var result=stm32.write("tmp/rm_ax.bin", true);
		erp.meter("RWCS-3915A", "PM-AX", fw_rev, serial, initial_value, result);
		if (! result) return "Ошибка записи в чип";
		
		// Удаляем временный файл
		fs.remove("tmp/rm_ax.bin");
		
		// Стираем EEPROM
		stm32.write("firmware/zero1k.bin", true, "0x08080000");
		
		// Успешно
		return "";
	};
	
	
	exports.read = function() {
		
		var result="";
		
		// Читаем FLASH
		ui.progress(0);
		if (! stm32.read("tmp/rm_ax_flash.bin", "0x08000000", 0x100, true)) return "Ошибка чтения из чипа";
		var flash=fs.readBinary("tmp/rm_ax_flash.bin");
		
		// Читаем EEPROM
		ui.progress(50);
		if (! stm32.read("tmp/rm_ax_eeprom.bin", "0x08080000", 0x100, true)) return "Ошибка чтения из чипа";
		var eeprom=fs.readBinary("tmp/rm_ax_eeprom.bin");
		
		// Проверяем контрольку конфигурации
		if (crc.crc32(flash, 0, 20) == 0)
		{
			var serial=unpack.u64(flash, 0);
			var initial_value=unpack.u32(flash, 8);
			
			result+="Серийный номер: "+serial+"<br/>";
			result+="Начальное показание: "+initial_value+" л<br/>";
		} else
		{
			result+="Конфигурация отсутствует<br/>";
		}
		
		// Получаем последнее показание
		if (crc.crc32(eeprom, LAST_VALUE_AT, 8) == 0)
		{
			result+="Показание: "+unpack.u32(eeprom, LAST_VALUE_AT+0)+" л<br/>";
		} else
		if (crc.crc32(eeprom, LAST_VALUE_COPY_AT, 8) == 0)
		{
			result+="Показание: "+unpack.u32(eeprom, LAST_VALUE_COPY_AT+0)+" л<br/>";
		} else
		{
			result+="Последнее показание отсутствует<br/>";
		}
		
		// Удаляем временный файл
		fs.remove("tmp/rm_ax_flash.bin");
		fs.remove("tmp/rm_ax_eeprom.bin");
		
		// Выводим инфу
		ui.progress(100);
		ui.message(result);
		
		// Успешно
		return "";
	};
	
})(typeof exports === 'undefined' ? this['_rm_ax_js']={} : exports);
