diff --git a/flight/OpenPilot/Modules/AHRSComms/ahrs_comms.c b/flight/OpenPilot/Modules/AHRSComms/ahrs_comms.c index 46d987917..56a5ec555 100644 --- a/flight/OpenPilot/Modules/AHRSComms/ahrs_comms.c +++ b/flight/OpenPilot/Modules/AHRSComms/ahrs_comms.c @@ -100,6 +100,7 @@ static void HomeLocationUpdatedCb(UAVObjEvent * ev) HomeLocationIsUpdatedFlag = true; } +static bool AHRSKnowsHome = FALSE; /** * Initialise the module, called on startup * \returns 0 on success or -1 if initialisation failed @@ -129,6 +130,9 @@ static void ahrscommsTask(void* parameters) AlarmsSet(SYSTEMALARMS_ALARM_AHRSCOMMS, SYSTEMALARMS_ALARM_CRITICAL); + /* Whenever resyncing, assume AHRS doesn't reset and doesn't know home */ + AHRSKnowsHome = FALSE; + /* Spin here until we're in sync */ while (PIOS_OPAHRS_resync() != OPAHRS_RESULT_OK) { vTaskDelay(100 / portTICK_RATE_MS); @@ -175,6 +179,7 @@ static void ahrscommsTask(void* parameters) AltitudeActualIsUpdatedFlag = false; } else { /* Comms error */ + break; } } @@ -186,19 +191,22 @@ static void ahrscommsTask(void* parameters) PositionActualIsUpdatedFlag = false; } else { /* Comms error */ + break; } } - if (HomeLocationIsUpdatedFlag) { + if (HomeLocationIsUpdatedFlag || !AHRSKnowsHome) { struct opahrs_msg_v1 req; load_magnetic_north(&(req.payload.user.v.req.north)); if (PIOS_OPAHRS_SetMagNorth(&req) == OPAHRS_RESULT_OK) { HomeLocationIsUpdatedFlag = false; + AHRSKnowsHome = TRUE; } else { /* Comms error */ + break; } - } + } /* Wait for the next update interval */ vTaskDelay( settings.UpdatePeriod / portTICK_RATE_MS ); diff --git a/flight/OpenPilot/Modules/GPS/GPS.c b/flight/OpenPilot/Modules/GPS/GPS.c index 1cba38cf0..e84d2a54a 100644 --- a/flight/OpenPilot/Modules/GPS/GPS.c +++ b/flight/OpenPilot/Modules/GPS/GPS.c @@ -65,7 +65,7 @@ // Private functions static void gpsTask(void* parameters); -static void setHomeLocation(PositionActualData gpsData); +static void setHomeLocation(PositionActualData * gpsData); // functions char* nmeaGetPacketBuffer(void); @@ -120,6 +120,7 @@ int32_t GPSInitialize(void) return 0; } +static bool homeLocationSet = 0; /** * gps task. Processes input buffer. It does not return. @@ -131,9 +132,9 @@ static void gpsTask(void* parameters) portTickType xDelay = 100 / portTICK_RATE_MS; PositionActualData GpsData; uint32_t timeNowMs; - uint8_t homeLocationSet = 0; - + homeLocationSet = 0; + // Loop forever while(1) { @@ -161,9 +162,9 @@ static void gpsTask(void* parameters) else { // Had an update PositionActualGet(&GpsData); - if(GpsData.Status == POSITIONACTUAL_STATUS_FIX3D && !homeLocationSet ) { - setHomeLocation(GpsData); - homeLocationSet = 1; + if(GpsData.Status == POSITIONACTUAL_STATUS_FIX3D && homeLocationSet == FALSE) { + setHomeLocation(&GpsData); + homeLocationSet = TRUE; } } @@ -172,15 +173,15 @@ static void gpsTask(void* parameters) } } -static void setHomeLocation(PositionActualData gpsData) +static void setHomeLocation(PositionActualData * gpsData) { HomeLocationData home; HomeLocationGet(&home); // Store LLA - home.Latitude = (int32_t) gpsData.Latitude * 10e6; - home.Longitude = (int32_t) gpsData.Longitude * 10e6; - home.Altitude = gpsData.GeoidSeparation; + home.Latitude = (int32_t) (gpsData->Latitude * 10e6); + home.Longitude = (int32_t) (gpsData->Longitude * 10e6); + home.Altitude = gpsData->GeoidSeparation; // Compute home ECEF coordinates and the rotation matrix into NED double LLA[3] = {(double) home.Latitude / 10e6, (double) home.Longitude / 10e6, (double) home.Altitude}; @@ -197,9 +198,9 @@ static void setHomeLocation(PositionActualData gpsData) memcpy(&home.RNE[0], &RNE[0][0], 9 * sizeof(RNE[0][0])); // Compute magnetic flux direction at home location - WMM_Initialize(); // Set default values and constants + //WMM_Initialize(); // Set default values and constants // TODO: Extract time/date from GPS to seed this - WMM_GetMagVector(LLA[0], LLA[1], LLA[2], 8, 17, 2010, home.Be); + //WMM_GetMagVector(LLA[0], LLA[1], LLA[2], 8, 17, 2010, home.Be); HomeLocationSet(&home); }