void task(void) { // Return if task is not active. if (!isActive()) return; double slat, slon, dx, dy, dz; slat = m_last_state.lat; slon = m_last_state.lon; // get absolute (simulated) position WGS84::displace(m_last_state.x, m_last_state.y, &slat, &slon); // compute offset from plume peak WGS84::displacement(slat, slon, 0, m_args.peak_lat, m_args.peak_lon, 0, &dx, &dy, &dz); // calculate value based on 2d gaussian function double expn = exp(-1 * ((dx * dx + dy * dy) /(2 * m_args.peak_width * m_args.peak_width))); double val = m_args.away_val + (m_args.peak_val - m_args.away_val) * expn; val += m_prng->gaussian() * m_args.std_dev; m_msg->setValueFP(val); dispatch(m_msg); }