Refactoring FLVSS - only one sensor for now

This commit is contained in:
bsongis
2014-07-08 11:02:00 +02:00
parent 87a4f3526b
commit cf546a2341
3 changed files with 83 additions and 27 deletions
+52 -17
View File
@@ -428,7 +428,7 @@ void telemetryWakeup()
void telemetryInterrupt10ms()
{
uint16_t voltage = 0; /* unit: 1/10 volts */
uint16_t voltage = frskyData.hub.cellsSum; /* unit: 1/10 volts */
#if defined(FRSKY_HUB)
for (uint8_t i=0; i<frskyData.hub.cellsCount; i++)
@@ -609,19 +609,55 @@ void telemetryInit(void)
// we don't reset the telemetry here as we would also reset the consumption after model load
}
#if defined(CPUARM) || defined(FRSKY_HUB)
void frskySetCellsCount(uint8_t cellscount)
{
if (cellscount <= DIM(frskyData.hub.cellVolts)) {
frskyData.hub.cellsCount = cellscount;
frskyData.hub.cellsState = 0;
frskyData.hub.minCells = 0;
frskyData.hub.minCell = 0;
}
}
void frskySetCellVoltage(uint8_t battnumber, frskyCellVoltage_t cellVolts)
{
frskyData.hub.cellVolts[battnumber] = cellVolts;
if (!frskyData.hub.minCellVolts || cellVolts<frskyData.hub.minCellVolts || battnumber==frskyData.hub.minCellIdx) {
//update minimum cell voltage (Cell) and its cell number
frskyData.hub.minCellIdx = battnumber;
frskyData.hub.minCellVolts = cellVolts;
#if defined(CPUARM)
if (!frskyData.hub.minCell || frskyData.hub.minCellVolts<frskyData.hub.minCell) {
//update all time minimum cell voltage (Cell-)
frskyData.hub.minCell = frskyData.hub.minCellVolts;
// TRACE("frskySetCellVoltage() %d, %d", battnumber, cellVolts);
if (battnumber < frskyData.hub.cellsCount) {
// set cell voltage
frskyData.hub.cellVolts[battnumber] = cellVolts;
frskyData.hub.cellsState |= (1 << battnumber);
if (frskyData.hub.cellsState == (1<<frskyData.hub.cellsCount)-1) {
// we received voltage of all cells
frskyData.hub.cellsState = 0;
// calculate Cells, Cells-, Cell and Cell-
uint16_t cellsSum = 0; /* unit: 1/10 volts */
frskyCellVoltage_t minCellVolts = -1;
for (uint8_t i=0; i<frskyData.hub.cellsCount; i++) {
frskyCellVoltage_t tmpCellVolts = frskyData.hub.cellVolts[i];
cellsSum += tmpCellVolts;
if (tmpCellVolts < minCellVolts) {
// update minimum cell voltage (Cell)
minCellVolts = tmpCellVolts;
}
}
frskyData.hub.minCellVolts = minCellVolts;
frskyData.hub.cellsSum = cellsSum / (10 / TELEMETRY_CELL_VOLTAGE_MUTLIPLIER);
// update cells sum minimum (Cells-)
if (!frskyData.hub.minCells || frskyData.hub.cellsSum < frskyData.hub.minCells) {
frskyData.hub.minCells = frskyData.hub.cellsSum;
}
// update minimum cell voltage (Cell-)
if (!frskyData.hub.minCell || frskyData.hub.minCellVolts < frskyData.hub.minCell) {
frskyData.hub.minCell = frskyData.hub.minCellVolts;
}
}
#endif
}
}
@@ -629,11 +665,10 @@ void frskyUpdateCells(void)
{
// Voltage => Cell number + Cell voltage
uint8_t battnumber = ((frskyData.hub.volts & 0x00F0) >> 4);
if (battnumber < 12) {
if (frskyData.hub.cellsCount < battnumber+1) {
frskyData.hub.cellsCount = battnumber+1;
}
frskyCellVoltage_t cellVolts = (frskyCellVoltage_t) (((((frskyData.hub.volts & 0xFF00) >> 8) + ((frskyData.hub.volts & 0x000F) << 8))) / (5*TELEMETRY_CELL_VOLTAGE_MUTLIPLIER));
frskySetCellVoltage(battnumber, cellVolts);
if (battnumber >= frskyData.hub.cellsCount) {
frskySetCellsCount(battnumber+1);
}
frskyCellVoltage_t cellVolts = (frskyCellVoltage_t) (((((frskyData.hub.volts & 0xFF00) >> 8) + ((frskyData.hub.volts & 0x000F) << 8))) / (5*TELEMETRY_CELL_VOLTAGE_MUTLIPLIER));
frskySetCellVoltage(battnumber, cellVolts);
}
#endif
+5 -2
View File
@@ -175,7 +175,7 @@ PACK(struct FrskySerialData {
uint16_t cellVolts[12];
int16_t cellsSum;
uint8_t minCellIdx;
uint8_t cellsState;
uint16_t minCellVolts;
bool varioHighPrecision;
@@ -232,7 +232,7 @@ PACK(struct FrskySerialData {
uint16_t gpsDistance;
int16_t gpsAltitudeOffset;
uint8_t varioAltitudeQueuePointer; // circular-buffer pointer
uint8_t minCellIdx;
uint8_t cellsState;
int16_t cellsSum;
uint16_t currentConsumption; // 0x35 openXsensor only! Otherwise calculated by the Tx from current
uint16_t currentPrescale;
@@ -467,8 +467,11 @@ void telemetryInterrupt10ms(void);
typedef uint8_t frskyCellVoltage_t;
#endif
#if defined(CPUARM) || defined(FRSKY_HUB)
void frskySetCellsCount(uint8_t cellscount);
void frskySetCellVoltage(uint8_t battnumber, frskyCellVoltage_t cellVolts);
void frskyUpdateCells(void);
#endif
#if defined(PCBTARANIS)
#define MODEL_TELEMETRY_PROTOCOL ((g_model.moduleData[INTERNAL_MODULE].rfProtocol == RF_PROTO_OFF && g_model.externalModule == MODULE_TYPE_PPM) ? g_model.telemetryProtocol : PROTOCOL_FRSKY_SPORT)
+26 -8
View File
@@ -120,6 +120,15 @@
#define BATT_ID 0xf104
#define SWR_ID 0xf105
// Default sensor data IDs (Physical IDs + CRC)
#define DATA_ID_VARIO 0x00 // 0
#define DATA_ID_FLVSS 0xA1 // 1
#define DATA_ID_FAS 0x22 // 2
#define DATA_ID_GPS 0x83 // 3
#define DATA_ID_RPM 0xE4 // 4
#define DATA_ID_SP2UH 0x45 // 5
#define DATA_ID_SP2UR 0xC6 // 6
void setBaroAltitude(int32_t baroAltitude)
{
// First received barometer altitude => Altitude offset
@@ -236,10 +245,8 @@ void processHubPacket(uint8_t id, uint16_t value)
break;
case VOLTS_ID:
{
frskyUpdateCells();
break;
}
case GPS_HOUR_MIN_ID:
frskyData.hub.hour = ((uint8_t)(frskyData.hub.hour + g_eeGeneral.timezone + 24)) % 24;
@@ -274,7 +281,7 @@ bool checkSportPacket(uint8_t *packet)
void frskySportProcessPacket(uint8_t *packet)
{
/* uint8_t dataId = packet[0]; */
uint8_t dataId = packet[0];
uint8_t prim = packet[1];
uint16_t appId = *((uint16_t *)(packet+2));
@@ -405,7 +412,7 @@ void frskySportProcessPacket(uint8_t *packet)
if (frskyData.hub.gpsFix > 0) {
if (!frskyData.hub.pilotLatitude && !frskyData.hub.pilotLongitude) {
// First received GPS position => Pilot GPS position
getGpsPilotPosition();
getGpsPilotPosition();
}
else if (frskyData.hub.gpsDistNeeded || g_menuStack[g_menuStackPtr] == menuTelemetryFrsky) {
getGpsDistance();
@@ -453,10 +460,21 @@ void frskySportProcessPacket(uint8_t *packet)
frskyData.analog[TELEM_ANA_A4].set(SPORT_DATA_U32(packet), UNIT_VOLTS);
}
else if (appId >= CELLS_FIRST_ID && appId <= CELLS_LAST_ID) {
uint32_t cells = SPORT_DATA_U32(packet);
uint8_t battnumber = cells & 0xF;
frskySetCellVoltage(battnumber, (frskyCellVoltage_t) ((cells & 0x000FFF00) >> 8) / 5);
frskySetCellVoltage(battnumber+1, (frskyCellVoltage_t) ((cells & 0xFFF00000) >> 20) / 5);
uint32_t data = SPORT_DATA_U32(packet);
uint8_t battnumber = data & 0xF;
uint8_t cells = (data & 0xF0) >> 4;
if (dataId != DATA_ID_FLVSS) {
// TODO
// break;
}
if (cells != frskyData.hub.cellsCount) {
frskySetCellsCount(cells);
}
frskySetCellVoltage(battnumber, (frskyCellVoltage_t) ((data & 0x000FFF00) >> 8) / 5);
frskySetCellVoltage(battnumber+1, (frskyCellVoltage_t) ((data & 0xFFF00000) >> 20) / 5);
}
break;
}