diff Discovery/Src/logbook.c @ 416:bcf447646e07

Merged in Ideenmodellierer/ostc4/Improment_NVM (pull request #37) Improment NVM
author heinrichsweikamp <bitbucket@heinrichsweikamp.com>
date Wed, 15 Jan 2020 10:53:15 +0000
parents e908b894f107
children 514e6269256f
line wrap: on
line diff
--- a/Discovery/Src/logbook.c	Wed Jan 08 15:35:15 2020 +0100
+++ b/Discovery/Src/logbook.c	Wed Jan 15 10:53:15 2020 +0000
@@ -64,6 +64,8 @@
 #define LOGBOOK_VERSION (0x30)
 #define LOGBOOK_VERSION_OSTC3 (0x24)
 
+#define DEFAULT_SAMPLES	(100)	/* Number of sample data bytes in case of an broken header information */
+
 typedef struct /* don't forget to adjust void clear_divisor(void) */
 {
 	uint8_t temperature;
@@ -78,7 +80,7 @@
 /* Exported variables --------------------------------------------------------*/
 
 /* Private variables ---------------------------------------------------------*/
-static  SLogbookHeader  header;
+static SLogbookHeader  gheader;
 static SLogbookHeaderOSTC3	headerOSTC3;
 static SLogbookHeaderOSTC3compact headerOSTC3compact;
 static SSmallHeader smallHeader;
@@ -99,7 +101,7 @@
 
 void logbook_EndDive(void)
 {
-	ext_flash_close_new_dive_log((uint8_t*) &header);
+	ext_flash_close_new_dive_log((uint8_t*) &gheader);
 }
 
 
@@ -136,7 +138,7 @@
 */
 SLogbookHeader* logbook_getCurrentHeader(void)
 {
-    return &header;
+    return &gheader;
 }
 
 /**
@@ -198,78 +200,78 @@
 
 	for(int i = 0; i < sizeof(SLogbookHeader); i++)
 	{
-		((uint8_t*)(&header))[i] = 0;
+		((uint8_t*)(&gheader))[i] = 0;
 	}
-	header.diveHeaderStart = 0xFAFA;
-	header.diveHeaderEnd = 0xFBFB;
-	header.samplingRate = 2;
+	gheader.diveHeaderStart = 0xFAFA;
+	gheader.diveHeaderEnd = 0xFBFB;
+	gheader.samplingRate = 2;
 	if(pInfo->diveSettings.diveMode == DIVEMODE_OC)
   {
     for(int i = 0; i < 5; i++)
     {
-      header.gasordil[i].oxygen_percentage = pSettings->gas[i+1].oxygen_percentage;
-      header.gasordil[i].helium_percentage = pSettings->gas[i+1].helium_percentage;
-      header.gasordil[i].note.uw = pSettings->gas[i+1].note.uw;
-      header.gasordil[i].depth_meter = pSettings->gas[i+1].depth_meter;
+      gheader.gasordil[i].oxygen_percentage = pSettings->gas[i+1].oxygen_percentage;
+      gheader.gasordil[i].helium_percentage = pSettings->gas[i+1].helium_percentage;
+      gheader.gasordil[i].note.uw = pSettings->gas[i+1].note.uw;
+      gheader.gasordil[i].depth_meter = pSettings->gas[i+1].depth_meter;
     }
   }
   else
   {
     for(int i = 0; i < 5; i++)
     {
-      header.gasordil[i].oxygen_percentage = pSettings->gas[i+6].oxygen_percentage;
-      header.gasordil[i].helium_percentage = pSettings->gas[i+6].helium_percentage;
-      header.gasordil[i].note.uw = pSettings->gas[i+6].note.uw;
-      header.gasordil[i].depth_meter = pSettings->gas[i+6].depth_meter;
+      gheader.gasordil[i].oxygen_percentage = pSettings->gas[i+6].oxygen_percentage;
+      gheader.gasordil[i].helium_percentage = pSettings->gas[i+6].helium_percentage;
+      gheader.gasordil[i].note.uw = pSettings->gas[i+6].note.uw;
+      gheader.gasordil[i].depth_meter = pSettings->gas[i+6].depth_meter;
     }
 
     for(int i = 0; i < 5; i++)
     {
-      header.setpoint[i].setpoint_cbar = pSettings->setpoint[i+1].setpoint_cbar;
-      header.setpoint[i].depth_meter = pSettings->setpoint[i+1].depth_meter;
+      gheader.setpoint[i].setpoint_cbar = pSettings->setpoint[i+1].setpoint_cbar;
+      gheader.setpoint[i].depth_meter = pSettings->setpoint[i+1].depth_meter;
     }
   }
 //	header.gasordil[pInfo->lifeData.actualGas.GasIdInSettings].depth_meter = 0;
 
 	translateDate(pInfo->lifeData.dateBinaryFormat, &Sdate);
 	translateTime(pInfo->lifeData.timeBinaryFormat, &Stime);
-	header.dateYear = Sdate.Year;
-	header.dateMonth = Sdate.Month;
-	header.dateDay = Sdate.Date;
-	header.timeHour = Stime.Hours;
-	header.timeMinute = Stime.Minutes;
-	header.cnsAtBeginning = (uint16_t)pInfo->lifeData.cns;
-	header.surfacePressure_mbar = (uint16_t)(pInfo->lifeData.pressure_surface_bar * 1000);
-	header.firmwareVersionHigh = firmwareVersion_16bit_high();
-	header.firmwareVersionLow = firmwareVersion_16bit_low();
-	header.logbookProfileVersion = LOGBOOK_VERSION;
-	header.salinity = pSettings->salinity;
-	header.diveNumber = pSettings->totalDiveCounter;
-	header.personalDiveCount = pSettings->personalDiveCount;
+	gheader.dateYear = Sdate.Year;
+	gheader.dateMonth = Sdate.Month;
+	gheader.dateDay = Sdate.Date;
+	gheader.timeHour = Stime.Hours;
+	gheader.timeMinute = Stime.Minutes;
+	gheader.cnsAtBeginning = (uint16_t)pInfo->lifeData.cns;
+	gheader.surfacePressure_mbar = (uint16_t)(pInfo->lifeData.pressure_surface_bar * 1000);
+	gheader.firmwareVersionHigh = firmwareVersion_16bit_high();
+	gheader.firmwareVersionLow = firmwareVersion_16bit_low();
+	gheader.logbookProfileVersion = LOGBOOK_VERSION;
+	gheader.salinity = pSettings->salinity;
+	gheader.diveNumber = pSettings->totalDiveCounter;
+	gheader.personalDiveCount = pSettings->personalDiveCount;
 
-	header.diveMode = pInfo->diveSettings.diveMode;
-	header.CCRmode = pInfo->diveSettings.CCR_Mode;
-	header.lastDecostop_m = pSettings->last_stop_depth_meter;
+	gheader.diveMode = pInfo->diveSettings.diveMode;
+	gheader.CCRmode = pInfo->diveSettings.CCR_Mode;
+	gheader.lastDecostop_m = pSettings->last_stop_depth_meter;
 
 	if(pInfo->diveSettings.deco_type.ub.standard == GF_MODE)
 	{
-		header.decoModel = 1;
-		header.gfLow_or_Vpm_conservatism = pInfo->diveSettings.gf_low;
-		header.gfHigh = pInfo->diveSettings.gf_high;
+		gheader.decoModel = 1;
+		gheader.gfLow_or_Vpm_conservatism = pInfo->diveSettings.gf_low;
+		gheader.gfHigh = pInfo->diveSettings.gf_high;
 	}
 	else
 	{
-		header.decoModel = 2;
-		header.gfLow_or_Vpm_conservatism = pInfo->diveSettings.vpm_conservatism;
-		header.gfHigh = 0;
+		gheader.decoModel = 2;
+		gheader.gfLow_or_Vpm_conservatism = pInfo->diveSettings.vpm_conservatism;
+		gheader.gfHigh = 0;
 	}
 
-	memcpy(header.n2Compartments, pInfo->lifeData.tissue_nitrogen_bar, 64);
-	memcpy(header.heCompartments, pInfo->lifeData.tissue_helium_bar, 64);
+	memcpy(gheader.n2Compartments, pInfo->lifeData.tissue_nitrogen_bar, 64);
+	memcpy(gheader.heCompartments, pInfo->lifeData.tissue_helium_bar, 64);
 
 	logbook_SetCompartmentDesaturation(pInfo);
 
-	ext_flash_start_new_dive_log_and_set_actualPointerSample((uint8_t*)&header);
+	ext_flash_start_new_dive_log_and_set_actualPointerSample((uint8_t*)&gheader);
 
 	smallHeader.profileLength[0] = 0xFF;
 	smallHeader.profileLength[1] = 0xFF;
@@ -1176,7 +1178,7 @@
 			tickstart = lasttick;
 			if((bDiveMode == 1) && (pStateReal->lifeData.dive_time_seconds >= pSettings->divetimeToCreateLogbook))
 			{
-				ext_flash_create_new_dive_log((uint8_t*)&header);
+				ext_flash_create_new_dive_log((uint8_t*)&gheader);
 				/** save settings
 					* with new lastDiveLogId and time and day
 					*/
@@ -1201,7 +1203,7 @@
 		logbook_SetMaxCNS(pStateReal->lifeData.cns);
 		logbook_SetCompartmentDesaturation(pStateReal);
 		logbook_SetLastStop(pStateReal->diveSettings.last_stop_depth_bar);
-		header.batteryVoltage = pStateReal->lifeData.battery_voltage * 1000;
+		gheader.batteryVoltage = pStateReal->lifeData.battery_voltage * 1000;
 		logbook_EndDive();
 		bDiveMode = 0;
 	} else
@@ -1242,49 +1244,49 @@
 	header.timeMinute = Stime.Minutes;
 	*/
 	/// 160315 Quick fix for empty date problem
-	if((!(header.dateYear)) || (!(header.dateMonth)) || (!(header.dateDay)))
+	if((!(gheader.dateYear)) || (!(gheader.dateMonth)) || (!(gheader.dateDay)))
 	{
 		translateDate(pStateReal->lifeData.dateBinaryFormat, &Sdate);
 		translateTime(pStateReal->lifeData.timeBinaryFormat, &Stime);
 
-		header.dateYear = Sdate.Year;
-		header.dateMonth = Sdate.Month;
-		header.dateDay = Sdate.Date;
+		gheader.dateYear = Sdate.Year;
+		gheader.dateMonth = Sdate.Month;
+		gheader.dateDay = Sdate.Date;
 		
-		time1_u32 = (uint32_t)header.timeMinute + (uint32_t)(header.timeHour * 60);
+		time1_u32 = (uint32_t)gheader.timeMinute + (uint32_t)(gheader.timeHour * 60);
 		time2_u32 = (uint32_t)Stime.Minutes + (uint32_t)(Stime.Hours * 60);
 		if(time2_u32 < time1_u32)
 		{
-			if(header.dateDay > 1)
+			if(gheader.dateDay > 1)
 			{
-				header.dateDay -= 1;
+				gheader.dateDay -= 1;
 			}
 			else
 			{
-				header.dateMonth --;
-				if(!header.dateMonth)
+				gheader.dateMonth --;
+				if(!gheader.dateMonth)
 				{
-					header.dateYear--;
-					header.dateMonth = 12;
-					header.dateDay = 31;
+					gheader.dateYear--;
+					gheader.dateMonth = 12;
+					gheader.dateDay = 31;
 				}
 				else
 				{
-					if(header.dateMonth == 2)
-						header.dateDay = 28;
+					if(gheader.dateMonth == 2)
+						gheader.dateDay = 28;
 					else
-					if((header.dateMonth == 4) || (header.dateMonth == 6) || (header.dateMonth == 9) || (header.dateMonth == 11))
-						header.dateDay = 30;
+					if((gheader.dateMonth == 4) || (gheader.dateMonth == 6) || (gheader.dateMonth == 9) || (gheader.dateMonth == 11))
+						gheader.dateDay = 30;
 					else
-						header.dateDay = 31;
+						gheader.dateDay = 31;
 				}
 			}
 		}
 	}
 	
 	/* duration */
-	header.total_diveTime_seconds = pStateReal->lifeData.dive_time_seconds;
-	header.maxDepth = pStateReal->lifeData.max_depth_meter * 100;
+	gheader.total_diveTime_seconds = pStateReal->lifeData.dive_time_seconds;
+	gheader.maxDepth = pStateReal->lifeData.max_depth_meter * 100;
 
 	/* old:
 	
@@ -1295,49 +1297,49 @@
 	header.diveTimeSeconds = header.total_diveTime_seconds - secondsAtShallow - (header.diveTimeMinutes * 60);
 	*/
 	divetimeHelper = pStateReal->lifeData.dive_time_seconds_without_surface_time;
-	header.diveTimeMinutes = (uint16_t)(divetimeHelper/60);
-	divetimeHelper -= 60 * (uint32_t)header.diveTimeMinutes;
-	header.diveTimeSeconds = (uint16_t)divetimeHelper;
+	gheader.diveTimeMinutes = (uint16_t)(divetimeHelper/60);
+	divetimeHelper -= 60 * (uint32_t)gheader.diveTimeMinutes;
+	gheader.diveTimeSeconds = (uint16_t)divetimeHelper;
 	
 	/* deco algorithm (final) */
 	if(pStateReal->diveSettings.deco_type.ub.standard == GF_MODE)
 	{
-		header.decoModel = 1;
-		header.gfLow_or_Vpm_conservatism = pStateReal->diveSettings.gf_low;
-		header.gfHigh = pStateReal->diveSettings.gf_high;
+		gheader.decoModel = 1;
+		gheader.gfLow_or_Vpm_conservatism = pStateReal->diveSettings.gf_low;
+		gheader.gfHigh = pStateReal->diveSettings.gf_high;
 	}
 	else
 	{
-		header.decoModel = 2;
-		header.gfLow_or_Vpm_conservatism = pStateReal->diveSettings.vpm_conservatism;
-		header.gfHigh = 0;
+		gheader.decoModel = 2;
+		gheader.gfLow_or_Vpm_conservatism = pStateReal->diveSettings.vpm_conservatism;
+		gheader.gfHigh = 0;
 	}
 
 	/* tissue load */
-	memcpy(header.n2Compartments, pStateReal->lifeData.tissue_nitrogen_bar, 64);
-	memcpy(header.heCompartments, pStateReal->lifeData.tissue_helium_bar, 64);
+	memcpy(gheader.n2Compartments, pStateReal->lifeData.tissue_nitrogen_bar, 64);
+	memcpy(gheader.heCompartments, pStateReal->lifeData.tissue_helium_bar, 64);
 
 }
 
 
 static void logbook_SetAverageDepth(float average_depth_meter)
 {
-		header.averageDepth_mbar = (uint16_t)(average_depth_meter * 100);
+		gheader.averageDepth_mbar = (uint16_t)(average_depth_meter * 100);
 }
 
 
 static void logbook_SetMinTemperature(float min_temperature_celsius)
 {
-		header.minTemp = (int16_t)((min_temperature_celsius * 10.0f) + 0.5f);
+		gheader.minTemp = (int16_t)((min_temperature_celsius * 10.0f) + 0.5f);
 }
 
 
 static void logbook_SetMaxCNS(float max_cns_percentage)
 {
 	if(max_cns_percentage < 9999)
-		header.maxCNS = (uint16_t)(max_cns_percentage);
+		gheader.maxCNS = (uint16_t)(max_cns_percentage);
 	else
-		header.maxCNS = 9999;
+		gheader.maxCNS = 9999;
 }
 
 
@@ -1349,19 +1351,19 @@
 	for(int i=0;i<16;i++)
 	{
 		if(secondaryInformation.tissue_nitrogen_desaturation_time_minutes[i] <= (15 * 255))
-			header.n2CompartDesatTime_min[i] = (uint8_t)((secondaryInformation.tissue_nitrogen_desaturation_time_minutes[i] + 14) / 15);
+			gheader.n2CompartDesatTime_min[i] = (uint8_t)((secondaryInformation.tissue_nitrogen_desaturation_time_minutes[i] + 14) / 15);
 		else
-			header.n2CompartDesatTime_min[i] = 255;
+			gheader.n2CompartDesatTime_min[i] = 255;
 		if(secondaryInformation.tissue_helium_desaturation_time_minutes[i] <= (15 * 255))
-			header.heCompartDesatTime_min[i] = (uint8_t)((secondaryInformation.tissue_helium_desaturation_time_minutes[i] + 14 )/ 15);
+			gheader.heCompartDesatTime_min[i] = (uint8_t)((secondaryInformation.tissue_helium_desaturation_time_minutes[i] + 14 )/ 15);
 		else
-			header.heCompartDesatTime_min[i] = 255;
+			gheader.heCompartDesatTime_min[i] = 255;
 	}
 }
 
 static void logbook_SetLastStop(float last_stop_depth_bar)
 {
-	header.lastDecostop_m = (uint8_t)(last_stop_depth_bar / 10.0f);
+	gheader.lastDecostop_m = (uint8_t)(last_stop_depth_bar / 10.0f);
 }
 
 static void logbook_writedata(void * data, int length_byte)
@@ -1369,7 +1371,6 @@
     ext_flash_write_sample(data, length_byte);
 }
 
-
 /********************************************************************************
 	* @brief   logbook_build_ostc3header. /
   * @author  heinrichs weikamp gmbh
@@ -1378,17 +1379,40 @@
 *********************************************************************************/
 SLogbookHeaderOSTC3 * logbook_build_ostc3header(SLogbookHeader* pHead)
 {
-	convert_Type data;
+	convert_Type data,data2;
 
 	memcpy(headerOSTC3.diveHeaderStart,			&pHead->diveHeaderStart,					2);
 	memcpy(headerOSTC3.pBeginProfileData,		&pHead->pBeginProfileData,				3);
 	memcpy(headerOSTC3.pEndProfileData,			&pHead->pEndProfileData,					3);
 
+
 	data.u8bit.byteHigh = 0;
-	data.u8bit.byteLow 			= pHead->profileLength[0];
-	data.u8bit.byteMidLow 	= pHead->profileLength[1];
-	data.u8bit.byteMidHigh 	= pHead->profileLength[2];
+	data.u8bit.byteLow 			= pHead->pBeginProfileData[0];
+	data.u8bit.byteMidLow 	= pHead->pBeginProfileData[1];
+	data.u8bit.byteMidHigh 	= pHead->pBeginProfileData[2];
+
+	data2.u8bit.byteHigh = 0;
+	data2.u8bit.byteLow 			= pHead->pEndProfileData[0];
+	data2.u8bit.byteMidLow 	= pHead->pEndProfileData[1];
+	data2.u8bit.byteMidHigh 	= pHead->pEndProfileData[2];
 
+	/* check if sample address information are corrupted by address range. */
+	/* TODO: Workaround. Better solution would be to check end of ring for 0xFF pattern */
+	if((data.u32bit > data2.u32bit) && (data.u32bit < (SAMPLESTOP - 0x9000)))
+	{
+		data2.u32bit = data.u32bit + DEFAULT_SAMPLES;
+		pHead->pEndProfileData[0] = data2.u8bit.byteLow;
+		pHead->pEndProfileData[1] = data2.u8bit.byteMidLow;
+		pHead->pEndProfileData[2] = data2.u8bit.byteMidHigh;
+		data.u32bit = DEFAULT_SAMPLES;
+	}
+	else
+	{
+		data.u8bit.byteHigh = 0;
+		data.u8bit.byteLow 			= pHead->profileLength[0];
+		data.u8bit.byteMidLow 	= pHead->profileLength[1];
+		data.u8bit.byteMidHigh 	= pHead->profileLength[2];
+	}
 	if(data.u32bit != 0xFFFFFF)
 		data.u32bit += 3;
 
@@ -1502,12 +1526,36 @@
 *********************************************************************************/
 SLogbookHeaderOSTC3compact * logbook_build_ostc3header_compact(SLogbookHeader* pHead)
 {
-	convert_Type data;
+	convert_Type data, data2;
+
 
 	data.u8bit.byteHigh = 0;
-	data.u8bit.byteLow 			= pHead->profileLength[0];
-	data.u8bit.byteMidLow 	= pHead->profileLength[1];
-	data.u8bit.byteMidHigh 	= pHead->profileLength[2];
+	data.u8bit.byteLow 			= pHead->pBeginProfileData[0];
+	data.u8bit.byteMidLow 	= pHead->pBeginProfileData[1];
+	data.u8bit.byteMidHigh 	= pHead->pBeginProfileData[2];
+
+	data2.u8bit.byteHigh = 0;
+	data2.u8bit.byteLow 			= pHead->pEndProfileData[0];
+	data2.u8bit.byteMidLow 	= pHead->pEndProfileData[1];
+	data2.u8bit.byteMidHigh 	= pHead->pEndProfileData[2];
+
+	/* check if sample address information are corrupted by address range. */
+	/* TODO: Workaround. Better solution would be to check end of ring for 0xFF pattern */
+	if((data.u32bit > data2.u32bit) && (data.u32bit < (SAMPLESTOP - 0x9000)))
+	{
+		data2.u32bit = data.u32bit + DEFAULT_SAMPLES;
+		pHead->pEndProfileData[0] = data2.u8bit.byteLow;
+		pHead->pEndProfileData[1] = data2.u8bit.byteMidLow;
+		pHead->pEndProfileData[2] = data2.u8bit.byteMidHigh;
+		data.u32bit = DEFAULT_SAMPLES;
+	}
+	else
+	{
+		data.u8bit.byteHigh = 0;
+		data.u8bit.byteLow 			= pHead->profileLength[0];
+		data.u8bit.byteMidLow 	= pHead->profileLength[1];
+		data.u8bit.byteMidHigh 	= pHead->profileLength[2];
+	}
 
 	if(data.u32bit != 0xFFFFFF)
 	{