comparison Discovery/Src/logbook.c @ 470:dd0d0952ef35

Merged in Ideenmodellierer/ostc4/Improve_Logtansfer (pull request #42) Improve Logtansfer
author heinrichsweikamp <bitbucket@heinrichsweikamp.com>
date Wed, 15 Apr 2020 07:01:11 +0000
parents 2c2df051e554
children 73da921869d9
comparison
equal deleted inserted replaced
462:dddfe7917131 470:dd0d0952ef35
89 static SDivisor divisorBackup; 89 static SDivisor divisorBackup;
90 90
91 static SSmallHeader smallDummyHeader; 91 static SSmallHeader smallDummyHeader;
92 static uint16_t dummyWriteIdx; 92 static uint16_t dummyWriteIdx;
93 static uint16_t dummyReadIdx; 93 static uint16_t dummyReadIdx;
94 static uint8_t dummyMemoryBuffer[1000*4]; 94 static uint8_t dummyMemoryBuffer[5000];
95 95
96 96
97 /* Private function prototypes -----------------------------------------------*/ 97 /* Private function prototypes -----------------------------------------------*/
98 static void clear_divisor(void); 98 static void clear_divisor(void);
99 static void logbook_SetAverageDepth(float average_depth_meter); 99 static void logbook_SetAverageDepth(float average_depth_meter);
979 int32_t temperatureFirst = 0; 979 int32_t temperatureFirst = 0;
980 int32_t cnsLast = 0; 980 int32_t cnsLast = 0;
981 int16_t decostepDepthVal = 0; 981 int16_t decostepDepthVal = 0;
982 int16_t decostepDepthLast = 0; 982 int16_t decostepDepthLast = 0;
983 uint16_t tankVal = 0; 983 uint16_t tankVal = 0;
984 uint32_t small_profileLength = 0;
984 985
985 SManualGas manualGasVal; 986 SManualGas manualGasVal;
986 SManualGas manualGasLast; 987 SManualGas manualGasLast;
987 manualGasLast.percentageO2 = 0; 988 manualGasLast.percentageO2 = 0;
988 manualGasLast.percentageHe = 0; 989 manualGasLast.percentageHe = 0;
1038 //We start with fist gasid 1039 //We start with fist gasid
1039 gasidLast = firstgasid; 1040 gasidLast = firstgasid;
1040 1041
1041 1042
1042 //uint16_t* ppo2, uint16_t* cns# 1043 //uint16_t* ppo2, uint16_t* cns#
1043 uint32_t totalNumberOfBytes = 0; 1044 uint32_t totalNumberOfBytes = 0;
1044 uint32_t bytesRead = 0; 1045 uint32_t bytesRead = 0;
1045 ext_flash_open_read_sample( StepBackwards,&totalNumberOfBytes); 1046 ext_flash_open_read_sample( StepBackwards,&totalNumberOfBytes);
1046 ext_flash_read_next_sample_part((uint8_t*)&smallHeader, sizeof(SSmallHeader)); 1047 ext_flash_read_next_sample_part((uint8_t*)&smallHeader, sizeof(SSmallHeader));
1047 bytesRead += sizeof(SSmallHeader); 1048 bytesRead += sizeof(SSmallHeader);
1048 1049
1049 clear_divisor(); 1050 clear_divisor();
1050 1051
1051 iNum = 0; 1052 iNum = 0;
1052 int counter = 0; 1053 int counter = 0;
1053 temperatureLast = -1000; 1054 temperatureLast = -1000;
1054 if(totalNumberOfBytes > 2) /* read real data */ 1055
1056 small_profileLength = (smallHeader.profileLength[2] << 16) + (smallHeader.profileLength[1] << 8) + smallHeader.profileLength[0];
1057
1058 if(totalNumberOfBytes == small_profileLength) /* sizes provided by header and small header are the same => real data */
1055 { 1059 {
1056 while ((bytesRead < totalNumberOfBytes) && (iNum < length)) 1060 while ((bytesRead < totalNumberOfBytes) && (iNum < length))
1057 { 1061 {
1058 ext_flash_set_entry_point(); 1062 ext_flash_set_entry_point();
1059 divisorBackup = divisor; 1063 divisorBackup = divisor;
1458 *********************************************************************************/ 1462 *********************************************************************************/
1459 SLogbookHeaderOSTC3 * logbook_build_ostc3header(SLogbookHeader* pHead) 1463 SLogbookHeaderOSTC3 * logbook_build_ostc3header(SLogbookHeader* pHead)
1460 { 1464 {
1461 convert_Type data,data2; 1465 convert_Type data,data2;
1462 uint16_t dummyLength = 0; 1466 uint16_t dummyLength = 0;
1463 1467 uint8_t returnEmptyHeader = 0;
1464 memcpy(headerOSTC3.diveHeaderStart, &pHead->diveHeaderStart, 2); 1468
1465 memcpy(headerOSTC3.pBeginProfileData, &pHead->pBeginProfileData, 3); 1469 uint32_t headerProfileLength, sampleProfileLength, sampleProfileStart;
1466 memcpy(headerOSTC3.pEndProfileData, &pHead->pEndProfileData, 3); 1470
1467 1471
1468 1472 if(pHead->diveHeaderStart != 0xFAFA)
1469 data.u8bit.byteHigh = 0; 1473 {
1470 data.u8bit.byteLow = pHead->pBeginProfileData[0]; 1474 returnEmptyHeader = 1;
1471 data.u8bit.byteMidLow = pHead->pBeginProfileData[1];
1472 data.u8bit.byteMidHigh = pHead->pBeginProfileData[2];
1473
1474 data2.u8bit.byteHigh = 0;
1475 data2.u8bit.byteLow = pHead->pEndProfileData[0];
1476 data2.u8bit.byteMidLow = pHead->pEndProfileData[1];
1477 data2.u8bit.byteMidHigh = pHead->pEndProfileData[2];
1478
1479 if( (pHead->pBeginProfileData[0] == 0) /* no sample data available => use dummy */
1480 &&(pHead->pBeginProfileData[1] == 0)
1481 &&(pHead->pBeginProfileData[2] == 0))
1482 {
1483 dummyLength = logbook_fillDummySampleBuffer(pHead);
1484
1485 data2.u32bit = data.u32bit + dummyLength; /* calc new end address (which is equal to dummyLength) */
1486 data.u32bit = data2.u32bit; /* data is used below to represent the length */
1487 } 1475 }
1488 else 1476 else
1489 { 1477 {
1490 /* check if sample address information are corrupted by address range. */ 1478 memcpy(headerOSTC3.diveHeaderStart, &pHead->diveHeaderStart, 2);
1491 /* TODO: Workaround. Better solution would be to check end of ring for 0xFF pattern */ 1479 memcpy(headerOSTC3.pBeginProfileData, &pHead->pBeginProfileData, 3);
1492 if((data.u32bit > data2.u32bit) && (data.u32bit < (SAMPLESTOP - 0x9000))) 1480 memcpy(headerOSTC3.pEndProfileData, &pHead->pEndProfileData, 3);
1481
1482 data.u8bit.byteHigh = 0;
1483 data.u8bit.byteLow = pHead->pBeginProfileData[0];
1484 data.u8bit.byteMidLow = pHead->pBeginProfileData[1];
1485 data.u8bit.byteMidHigh = pHead->pBeginProfileData[2];
1486
1487 sampleProfileStart = data.u32bit;
1488
1489 data2.u8bit.byteHigh = 0;
1490 data2.u8bit.byteLow = pHead->pEndProfileData[0];
1491 data2.u8bit.byteMidLow = pHead->pEndProfileData[1];
1492 data2.u8bit.byteMidHigh = pHead->pEndProfileData[2];
1493
1494 data.u8bit.byteHigh = 0;
1495 data.u8bit.byteLow = pHead->profileLength[0];
1496 data.u8bit.byteMidLow = pHead->profileLength[1];
1497 data.u8bit.byteMidHigh = pHead->profileLength[2];
1498
1499 if(data.u32bit != 0xFFFFFF) /* if the profile in use ? */
1493 { 1500 {
1494 data2.u32bit = data.u32bit + DEFAULT_SAMPLES; 1501 if(data2.u32bit < sampleProfileStart) /* Wrap around of sample ring detected */
1495 pHead->pEndProfileData[0] = data2.u8bit.byteLow; 1502 {
1496 pHead->pEndProfileData[1] = data2.u8bit.byteMidLow; 1503 if(ext_flash_SampleOverrunValid() == 0) /* Wrap around does not seem to be valid => fallback */
1497 pHead->pEndProfileData[2] = data2.u8bit.byteMidHigh; 1504 {
1498 data.u32bit = DEFAULT_SAMPLES; 1505 sampleProfileStart = 0;
1506 }
1507 }
1508 if( sampleProfileStart == 0) /* should never happen unless OSTC with older debug version is in use (or invalid overrun) */
1509 {
1510 sampleProfileLength = 1;
1511 headerProfileLength = 2;
1512 }
1513 else
1514 {
1515 headerProfileLength = (pHead->profileLength[2] << 16) + (pHead->profileLength[1] << 8) + pHead->profileLength[0];
1516 sampleProfileLength = ext_flash_read_profilelength_small_header(sampleProfileStart);
1517 }
1518
1519 if(sampleProfileLength != headerProfileLength)
1520 {
1521 dummyLength = logbook_fillDummySampleBuffer(pHead);
1522
1523 data2.u32bit = sampleProfileStart + dummyLength; /* calc new end address (which is equal to dummyLength) */
1524 data.u32bit = dummyLength; /* data is used below to represent the length */
1525 }
1526
1527 data.u32bit += 3;
1528 headerOSTC3.profileLength[0] = data.u8bit.byteLow;
1529 headerOSTC3.profileLength[1] = data.u8bit.byteMidLow;
1530 headerOSTC3.profileLength[2] = data.u8bit.byteMidHigh;
1531
1532 memcpy(headerOSTC3.gasordil, pHead->gasordil, 20);
1533
1534 if(pHead->logbookProfileVersion == LOGBOOK_VERSION)
1535 {
1536 headerOSTC3.logbookProfileVersion = LOGBOOK_VERSION_OSTC3;
1537 memcpy(headerOSTC3.personalDiveCount, &pHead->personalDiveCount, 2);
1538 headerOSTC3.safetyDistance_10cm = 0;
1539
1540 for(int i=0;i<5;i++)
1541 {
1542 if(!pHead->gasordil[i].note.ub.active)
1543 headerOSTC3.gasordil[3 + (i*4)] = 0;
1544 else if(pHead->gasordil[i].note.ub.first)
1545 {
1546 /* depth = 0, note = 1 */
1547 headerOSTC3.gasordil[2 + (i*4)] = 0;
1548 headerOSTC3.gasordil[3 + (i*4)] = 1;
1549 }
1550 else if( pHead->gasordil[i].depth_meter)
1551 {
1552 /* note = 3 */
1553 headerOSTC3.gasordil[3 + (i*4)] = 3;
1554 }
1555 }
1556 }
1557 else
1558 {
1559 headerOSTC3.logbookProfileVersion = 0xFF;
1560 headerOSTC3.personalDiveCount[0] = 0xFF;
1561 headerOSTC3.personalDiveCount[1] = 0xFF;
1562 headerOSTC3.safetyDistance_10cm = 0xFF;
1563 }
1564
1565 headerOSTC3.dateYear = pHead->dateYear;
1566 headerOSTC3.dateMonth = pHead->dateMonth;
1567 headerOSTC3.dateDay = pHead->dateDay;
1568 headerOSTC3.timeHour = pHead->timeHour;
1569 headerOSTC3.timeMinute = pHead->timeMinute;
1570
1571 memcpy(headerOSTC3.maxDepth, &pHead->maxDepth, 2);
1572 memcpy(headerOSTC3.diveTimeMinutes, &pHead->diveTimeMinutes, 2);
1573
1574 headerOSTC3.diveTimeSeconds = pHead->diveTimeSeconds;
1575
1576 memcpy(headerOSTC3.minTemp, &pHead->minTemp, 2);
1577 memcpy(headerOSTC3.surfacePressure_mbar,&pHead->surfacePressure_mbar, 2);
1578 memcpy(headerOSTC3.desaturationTime, &pHead->desaturationTime, 2);
1579
1580 headerOSTC3.firmwareVersionHigh = pHead->firmwareVersionHigh;
1581 headerOSTC3.firmwareVersionLow = pHead->firmwareVersionLow;
1582
1583 memcpy(headerOSTC3.batteryVoltage, &pHead->batteryVoltage, 2);
1584
1585 headerOSTC3.samplingRate = pHead->samplingRate;
1586
1587 memcpy(headerOSTC3.cnsAtBeginning, &pHead->cnsAtBeginning, 2);
1588
1589 headerOSTC3.gfAtBeginning = pHead->gfAtBeginning;
1590 headerOSTC3.gfAtEnd = pHead->gfAtEnd;
1591
1592 memcpy(headerOSTC3.setpoint, pHead->setpoint, 10);
1593
1594 headerOSTC3.salinity = pHead->salinity;
1595
1596 memcpy(headerOSTC3.maxCNS, &pHead->maxCNS, 2);
1597 memcpy(headerOSTC3.averageDepth_mbar, &pHead->averageDepth_mbar, 2);
1598 memcpy(headerOSTC3.total_diveTime_seconds, &pHead->total_diveTime_seconds, 2);
1599
1600 headerOSTC3.gfLow_or_Vpm_conservatism = pHead->gfLow_or_Vpm_conservatism;
1601 headerOSTC3.gfHigh = pHead->gfHigh;
1602 headerOSTC3.decoModel = pHead->decoModel;
1603
1604 memcpy(headerOSTC3.diveNumber, &pHead->diveNumber, 2);
1605
1606 headerOSTC3.diveMode = pHead->diveMode;
1607 headerOSTC3.CCRmode = pHead->CCRmode;
1608
1609 memcpy(headerOSTC3.n2CompartDesatTime_min,pHead->n2CompartDesatTime_min, 16);
1610 memcpy(headerOSTC3.n2Compartments, pHead->n2Compartments, 64);
1611 memcpy(headerOSTC3.heCompartDesatTime_min,pHead->heCompartDesatTime_min, 16);
1612 memcpy(headerOSTC3.heCompartments, pHead->heCompartments, 64);
1613
1614 headerOSTC3.lastDecostop_m = pHead->lastDecostop_m;
1615
1616 memcpy(headerOSTC3.hwHudBattery_mV, &pHead->hwHudBattery_mV, 2);
1617
1618 headerOSTC3.hwHudLastStatus = pHead->hwHudLastStatus;
1619
1620 memcpy(headerOSTC3.batteryGaugeRegisters,&pHead->batteryGaugeRegisters, 6);
1621
1622
1623 memcpy(headerOSTC3.diveHeaderEnd, &pHead->diveHeaderEnd, 2);
1499 } 1624 }
1500 else 1625 else
1501 { 1626 {
1502 data.u8bit.byteHigh = 0; 1627 returnEmptyHeader = 1;
1503 data.u8bit.byteLow = pHead->profileLength[0];
1504 data.u8bit.byteMidLow = pHead->profileLength[1];
1505 data.u8bit.byteMidHigh = pHead->profileLength[2];
1506 } 1628 }
1507 } 1629 }
1508 if(data.u32bit != 0xFFFFFF) 1630 if(returnEmptyHeader) /* profile not in use => return array full of 0xFF */
1509 data.u32bit += 3; 1631 {
1510 1632 memset(&headerOSTC3, 0xFF, sizeof(headerOSTC3));
1511 headerOSTC3.profileLength[0] = data.u8bit.byteLow; 1633 }
1512 headerOSTC3.profileLength[1] = data.u8bit.byteMidLow;
1513 headerOSTC3.profileLength[2] = data.u8bit.byteMidHigh;
1514
1515 memcpy(headerOSTC3.gasordil, pHead->gasordil, 20);
1516
1517 if(pHead->logbookProfileVersion == LOGBOOK_VERSION)
1518 {
1519 headerOSTC3.logbookProfileVersion = LOGBOOK_VERSION_OSTC3;
1520 memcpy(headerOSTC3.personalDiveCount, &pHead->personalDiveCount, 2);
1521 headerOSTC3.safetyDistance_10cm = 0;
1522
1523 for(int i=0;i<5;i++)
1524 {
1525 if(!pHead->gasordil[i].note.ub.active)
1526 headerOSTC3.gasordil[3 + (i*4)] = 0;
1527 else if(pHead->gasordil[i].note.ub.first)
1528 {
1529 /* depth = 0, note = 1 */
1530 headerOSTC3.gasordil[2 + (i*4)] = 0;
1531 headerOSTC3.gasordil[3 + (i*4)] = 1;
1532 }
1533 else if( pHead->gasordil[i].depth_meter)
1534 {
1535 /* note = 3 */
1536 headerOSTC3.gasordil[3 + (i*4)] = 3;
1537 }
1538 }
1539 }
1540 else
1541 {
1542 headerOSTC3.logbookProfileVersion = 0xFF;
1543 headerOSTC3.personalDiveCount[0] = 0xFF;
1544 headerOSTC3.personalDiveCount[1] = 0xFF;
1545 headerOSTC3.safetyDistance_10cm = 0xFF;
1546 }
1547
1548 headerOSTC3.dateYear = pHead->dateYear;
1549 headerOSTC3.dateMonth = pHead->dateMonth;
1550 headerOSTC3.dateDay = pHead->dateDay;
1551 headerOSTC3.timeHour = pHead->timeHour;
1552 headerOSTC3.timeMinute = pHead->timeMinute;
1553
1554
1555 memcpy(headerOSTC3.maxDepth, &pHead->maxDepth, 2);
1556 memcpy(headerOSTC3.diveTimeMinutes, &pHead->diveTimeMinutes, 2);
1557
1558 headerOSTC3.diveTimeSeconds = pHead->diveTimeSeconds;
1559
1560 memcpy(headerOSTC3.minTemp, &pHead->minTemp, 2);
1561 memcpy(headerOSTC3.surfacePressure_mbar,&pHead->surfacePressure_mbar, 2);
1562 memcpy(headerOSTC3.desaturationTime, &pHead->desaturationTime, 2);
1563
1564 headerOSTC3.firmwareVersionHigh = pHead->firmwareVersionHigh;
1565 headerOSTC3.firmwareVersionLow = pHead->firmwareVersionLow;
1566
1567 memcpy(headerOSTC3.batteryVoltage, &pHead->batteryVoltage, 2);
1568
1569 headerOSTC3.samplingRate = pHead->samplingRate;
1570
1571 memcpy(headerOSTC3.cnsAtBeginning, &pHead->cnsAtBeginning, 2);
1572
1573 headerOSTC3.gfAtBeginning = pHead->gfAtBeginning;
1574 headerOSTC3.gfAtEnd = pHead->gfAtEnd;
1575
1576 memcpy(headerOSTC3.setpoint, pHead->setpoint, 10);
1577
1578 headerOSTC3.salinity = pHead->salinity;
1579
1580 memcpy(headerOSTC3.maxCNS, &pHead->maxCNS, 2);
1581 memcpy(headerOSTC3.averageDepth_mbar, &pHead->averageDepth_mbar, 2);
1582 memcpy(headerOSTC3.total_diveTime_seconds,&pHead->total_diveTime_seconds, 2);
1583
1584 headerOSTC3.gfLow_or_Vpm_conservatism = pHead->gfLow_or_Vpm_conservatism;
1585 headerOSTC3.gfHigh = pHead->gfHigh;
1586 headerOSTC3.decoModel = pHead->decoModel;
1587
1588 memcpy(headerOSTC3.diveNumber, &pHead->diveNumber, 2);
1589
1590 headerOSTC3.diveMode = pHead->diveMode;
1591 headerOSTC3.CCRmode = pHead->CCRmode;
1592
1593 memcpy(headerOSTC3.n2CompartDesatTime_min,pHead->n2CompartDesatTime_min, 16);
1594 memcpy(headerOSTC3.n2Compartments, pHead->n2Compartments, 64);
1595 memcpy(headerOSTC3.heCompartDesatTime_min,pHead->heCompartDesatTime_min, 16);
1596 memcpy(headerOSTC3.heCompartments, pHead->heCompartments, 64);
1597
1598 headerOSTC3.lastDecostop_m = pHead->lastDecostop_m;
1599
1600 memcpy(headerOSTC3.hwHudBattery_mV, &pHead->hwHudBattery_mV, 2);
1601
1602 headerOSTC3.hwHudLastStatus = pHead->hwHudLastStatus;
1603
1604 memcpy(headerOSTC3.batteryGaugeRegisters,&pHead->batteryGaugeRegisters, 6);
1605
1606
1607 memcpy(headerOSTC3.diveHeaderEnd, &pHead->diveHeaderEnd, 2);
1608 1634
1609 return &headerOSTC3; 1635 return &headerOSTC3;
1610 } 1636 }
1611 1637
1612 1638
1616 * @version V0.0.1 1642 * @version V0.0.1
1617 * @date 31-Juli-2015 1643 * @date 31-Juli-2015
1618 *********************************************************************************/ 1644 *********************************************************************************/
1619 SLogbookHeaderOSTC3compact * logbook_build_ostc3header_compact(SLogbookHeader* pHead) 1645 SLogbookHeaderOSTC3compact * logbook_build_ostc3header_compact(SLogbookHeader* pHead)
1620 { 1646 {
1647 uint8_t returnEmptyHeader = 0;
1621 convert_Type data, data2; 1648 convert_Type data, data2;
1622 uint32_t dummyLength = 0; 1649 uint32_t dummyLength = 0;
1623 1650 uint32_t headerProfileLength, sampleProfileLength, sampleProfileStart;
1624 1651
1625 data.u8bit.byteHigh = 0; 1652 if(pHead->diveHeaderStart != 0xFAFA)
1626 data.u8bit.byteLow = pHead->pBeginProfileData[0]; 1653 {
1627 data.u8bit.byteMidLow = pHead->pBeginProfileData[1]; 1654 returnEmptyHeader = 1;
1628 data.u8bit.byteMidHigh = pHead->pBeginProfileData[2];
1629
1630 data2.u8bit.byteHigh = 0;
1631 data2.u8bit.byteLow = pHead->pEndProfileData[0];
1632 data2.u8bit.byteMidLow = pHead->pEndProfileData[1];
1633 data2.u8bit.byteMidHigh = pHead->pEndProfileData[2];
1634
1635 if( (pHead->pBeginProfileData[0] == 0) /* no sample data available => use dummy */
1636 &&(pHead->pBeginProfileData[1] == 0)
1637 &&(pHead->pBeginProfileData[2] == 0))
1638 {
1639 dummyLength = logbook_fillDummySampleBuffer(pHead);
1640
1641 data2.u32bit = data.u32bit + dummyLength; /* calc new end address (which is equal to dummyLength) */
1642 data.u32bit = data2.u32bit; /* data is used below to represent the length */
1643 } 1655 }
1644 else 1656 else
1645 { 1657 {
1646 /* check if sample address information are corrupted by address range. */ 1658 data.u8bit.byteHigh = 0;
1647 /* TODO: Workaround. Better solution would be to check end of ring for 0xFF pattern */ 1659 data.u8bit.byteLow = pHead->pBeginProfileData[0];
1648 if((data.u32bit > data2.u32bit) && (data.u32bit < (SAMPLESTOP - 0x9000))) 1660 data.u8bit.byteMidLow = pHead->pBeginProfileData[1];
1661 data.u8bit.byteMidHigh = pHead->pBeginProfileData[2];
1662
1663 sampleProfileStart = data.u32bit;
1664
1665 data2.u8bit.byteHigh = 0;
1666 data2.u8bit.byteLow = pHead->pEndProfileData[0];
1667 data2.u8bit.byteMidLow = pHead->pEndProfileData[1];
1668 data2.u8bit.byteMidHigh = pHead->pEndProfileData[2];
1669
1670 data.u8bit.byteHigh = 0;
1671 data.u8bit.byteLow = pHead->profileLength[0];
1672 data.u8bit.byteMidLow = pHead->profileLength[1];
1673 data.u8bit.byteMidHigh = pHead->profileLength[2];
1674
1675 if(data.u32bit != 0xFFFFFF)
1649 { 1676 {
1650 data2.u32bit = data.u32bit + DEFAULT_SAMPLES; 1677 if(data2.u32bit < sampleProfileStart) /* Wrap around of sample ring detected */
1651 pHead->pEndProfileData[0] = data2.u8bit.byteLow; 1678 {
1652 pHead->pEndProfileData[1] = data2.u8bit.byteMidLow; 1679 if(ext_flash_SampleOverrunValid() == 0) /* Wrap around does not seem to be valid => fallback */
1653 pHead->pEndProfileData[2] = data2.u8bit.byteMidHigh; 1680 {
1654 data.u32bit = DEFAULT_SAMPLES; 1681 sampleProfileStart = 0;
1682 }
1683 }
1684
1685 if( sampleProfileStart == 0) /* no sample data available => use dummy */
1686 {
1687 sampleProfileLength = 1;
1688 headerProfileLength = 2;
1689 }
1690 else
1691 {
1692 headerProfileLength = (pHead->profileLength[2] << 16) + (pHead->profileLength[1] << 8) + pHead->profileLength[0];
1693 sampleProfileLength = ext_flash_read_profilelength_small_header(sampleProfileStart);
1694 }
1695 if(sampleProfileLength != headerProfileLength)
1696 {
1697 dummyLength = logbook_fillDummySampleBuffer(pHead);
1698
1699 data2.u32bit = sampleProfileStart + dummyLength; /* calc new end address (which is equal to dummyLength) */
1700 data.u32bit = dummyLength; /* data is used below to represent the length */
1701 }
1702 data.u32bit += 3;
1703 headerOSTC3compact.profileLength[0] = data.u8bit.byteLow;
1704 headerOSTC3compact.profileLength[1] = data.u8bit.byteMidLow;
1705 headerOSTC3compact.profileLength[2] = data.u8bit.byteMidHigh;
1706
1707 headerOSTC3compact.dateYear = pHead->dateYear;
1708 headerOSTC3compact.dateMonth = pHead->dateMonth;
1709 headerOSTC3compact.dateDay = pHead->dateDay;
1710 headerOSTC3compact.timeHour = pHead->timeHour;
1711 headerOSTC3compact.timeMinute = pHead->timeMinute;
1712
1713 memcpy(headerOSTC3compact.maxDepth, &pHead->maxDepth, 2);
1714 memcpy(headerOSTC3compact.diveTimeMinutes, &pHead->diveTimeMinutes, 2);
1715
1716 headerOSTC3compact.diveTimeSeconds = pHead->diveTimeSeconds;
1717 headerOSTC3compact.totalDiveNumberLow = pHead->diveNumber & 0xFF;
1718 headerOSTC3compact.totalDiveNumberHigh = (uint8_t)(pHead->diveNumber/256);
1719 headerOSTC3compact.profileVersion = 0x24; // Logbook-Profile version, 0x24 = date and time is start not end
1655 } 1720 }
1656 else 1721 else
1657 { 1722 {
1658 data.u8bit.byteHigh = 0; 1723 returnEmptyHeader = 1;
1659 data.u8bit.byteLow = pHead->profileLength[0];
1660 data.u8bit.byteMidLow = pHead->profileLength[1];
1661 data.u8bit.byteMidHigh = pHead->profileLength[2];
1662 } 1724 }
1663 } 1725 }
1664 if(data.u32bit != 0xFFFFFF) 1726 if(returnEmptyHeader)
1665 {
1666 data.u32bit += 3;
1667
1668 headerOSTC3compact.profileLength[0] = data.u8bit.byteLow;
1669 headerOSTC3compact.profileLength[1] = data.u8bit.byteMidLow;
1670 headerOSTC3compact.profileLength[2] = data.u8bit.byteMidHigh;
1671
1672 headerOSTC3compact.dateYear = pHead->dateYear;
1673 headerOSTC3compact.dateMonth = pHead->dateMonth;
1674 headerOSTC3compact.dateDay = pHead->dateDay;
1675 headerOSTC3compact.timeHour = pHead->timeHour;
1676 headerOSTC3compact.timeMinute = pHead->timeMinute;
1677
1678 memcpy(headerOSTC3compact.maxDepth, &pHead->maxDepth, 2);
1679 memcpy(headerOSTC3compact.diveTimeMinutes, &pHead->diveTimeMinutes, 2);
1680
1681 headerOSTC3compact.diveTimeSeconds = pHead->diveTimeSeconds;
1682
1683
1684 headerOSTC3compact.totalDiveNumberLow = pHead->diveNumber & 0xFF;
1685 headerOSTC3compact.totalDiveNumberHigh = (uint8_t)(pHead->diveNumber/256);
1686 headerOSTC3compact.profileVersion = 0x24; // Logbook-Profile version, 0x24 = date and time is start not end
1687 }
1688 else
1689 { 1727 {
1690 memset(&headerOSTC3compact, 0xFF, sizeof(SLogbookHeaderOSTC3compact)); 1728 memset(&headerOSTC3compact, 0xFF, sizeof(SLogbookHeaderOSTC3compact));
1691 } 1729 }
1692 return &headerOSTC3compact; 1730 return &headerOSTC3compact;
1693 } 1731 }
1908 else 1946 else
1909 { 1947 {
1910 divisor.temperature--; 1948 divisor.temperature--;
1911 } 1949 }
1912 1950
1913 logbook_writeDummy((void *) &smallDummyHeader,sizeof(smallDummyHeader)); 1951 logbook_writeDummy((void *) sample,length);
1914 } 1952 }
1915 1953
1916 1954
1917 uint16_t logbook_fillDummySampleBuffer(SLogbookHeader* pHeader) 1955 uint16_t logbook_fillDummySampleBuffer(SLogbookHeader* pHeader)
1918 { 1956 {