kopia lustrzana https://github.com/DL7AD/pecanpico10
				
				
				
			Updates:
- Set config.c example of using POS for DIGI beacon - Collector waits 60S max for GPS fix before giving result - New datapoint with state GPS_TIME is written when RTC is first setpull/4/head
							rodzic
							
								
									28da0ce01b
								
							
						
					
					
						commit
						e20564ae4f
					
				|  | @ -16,43 +16,43 @@ const conf_t conf_flash_default = { | |||
|             .active = false, | ||||
|             .cycle = TIME_S2I(60 * 5), | ||||
|             .init_delay = TIME_S2I(60), | ||||
|             .fixed = false // Add lat, lon alt fields if enabling fixed
 | ||||
|             .fixed = false // Add lat, lon, alt fields when enabling fixed
 | ||||
|         }, | ||||
|         .radio_conf = { | ||||
|             .pwr = 0x1F, | ||||
|             .freq = FREQ_APRS_DYNAMIC, | ||||
|             .mod = MOD_AFSK, | ||||
|             .pwr = 0x7F, | ||||
|             .freq = 144800000, | ||||
|             .mod = MOD_2FSK, | ||||
|             .cca = 0x4F, | ||||
|         }, | ||||
|         // App identity
 | ||||
|         .call = "VK2GJ-12", | ||||
|         .path = "WIDE1-1", | ||||
|         .symbol = SYM_ANTENNA, | ||||
|         .aprs_msg = true, // Enable APRS message reception on this call sign
 | ||||
|         .aprs_msg = true, // Enable APRS message reception on this app
 | ||||
|     }, | ||||
| 
 | ||||
|     // Secondary position app
 | ||||
|     .pos_sec = { | ||||
|         .beacon = { | ||||
|             .active = true, | ||||
|             .cycle = TIME_S2I(60 * 5), | ||||
|             .cycle = TIME_S2I(60 * 30), // Beacon interval
 | ||||
|             .init_delay = TIME_S2I(60), | ||||
|             .fixed = true, // Add lat, lon alt fields if enabling fixed
 | ||||
|             .fixed = true, // Add lat, lon alt fields when enabling fixed
 | ||||
|             .lat = -337331175, // Degrees (expressed in 1e-7 form)
 | ||||
|             .lon = 1511143478, // Degrees (expressed in 1e-7 form)
 | ||||
|             .alt = 144 // Altitude in metres
 | ||||
|         }, | ||||
|         .radio_conf = { | ||||
|             .pwr = 0x7F, | ||||
|             .freq = 144800000, | ||||
|             .mod = MOD_2FSK, | ||||
|             .freq = FREQ_APRS_RECEIVE, | ||||
|             .mod = MOD_AFSK, | ||||
|             .cca = 0x4F | ||||
|         }, | ||||
|         // App identity
 | ||||
|         .call = "VK2GJ-15", | ||||
|         .path = "", | ||||
|         .symbol = SYM_ANTENNA, | ||||
|         .aprs_msg = true, // Enable APRS message reception on this call sign
 | ||||
|         .call = "VK2GJ-5", | ||||
|         .path = "WIDE2-1", | ||||
|         .symbol = SYM_DIGIPEATER, | ||||
|         .aprs_msg = false, // Enable APRS message reception on this app
 | ||||
|     }, | ||||
| 
 | ||||
|     // Primary image app
 | ||||
|  | @ -159,17 +159,9 @@ const conf_t conf_flash_default = { | |||
|            .call = "VK2GJ-5", | ||||
|            .path = "WIDE2-1", | ||||
|            .symbol = SYM_DIGIPEATER, | ||||
|            .beacon = { | ||||
|              // The telemetry beacon service is enabled if true when RX and DIGI are enabled
 | ||||
|              // Receive is resumed after any transmission
 | ||||
|              .active = true, | ||||
|              .init_delay = TIME_S2I(20), | ||||
|              .cycle = TIME_S2I(60 * 30), // Beacon interval
 | ||||
|              .fixed = true, // Use fixed position data if true
 | ||||
|              .lat = -337331175, // Degrees (expressed in 1e-7 form)
 | ||||
|              .lon = 1511143478, // Degrees (expressed in 1e-7 form)
 | ||||
|              .alt = 144 // Altitude in metres
 | ||||
|             }, | ||||
|            // A digipeater beacon can be added using one of the POS apps
 | ||||
|            // Set the POS identity the same as the dipipeater TX call sign
 | ||||
|            // Alternatively the digipeater can have its own .beacon entry here
 | ||||
|        }, | ||||
|     }, | ||||
| 
 | ||||
|  |  | |||
|  | @ -499,17 +499,18 @@ static bool Si446x_init(const radio_unit_t radio) { | |||
| 
 | ||||
|   /* RSSI value compensation. */ | ||||
|   if(is_part_Si4463(handler->radio_part)) | ||||
|     Si446x_setProperty8(radio, Si446x_MODEM_RSSI_COMP, 0x48); | ||||
|     Si446x_setProperty8(radio, Si446x_MODEM_RSSI_COMP, 0x44); | ||||
|   else | ||||
|     Si446x_setProperty8(radio, Si446x_MODEM_RSSI_COMP, 0x40); | ||||
| 
 | ||||
|   /*
 | ||||
|    * TODO: Preamble control should be set in each mode. | ||||
|    * TODO: Preamble configuration should be set in each mode. | ||||
|    * Will be needed for RX FSK mode. | ||||
|    * For now it is not relevant since: | ||||
|    * - we don't have RX FSK implemented yet. | ||||
|    * - RX AFSK preamble is decoded in the MCU DSP chain. | ||||
|    * - TX AFSK encodes its own preamble and then upsamples the entire packet. | ||||
|    * - TX 2FSK also encodes its own preamble which is sent as data by the PH. | ||||
|    */ | ||||
|   Si446x_setProperty8(radio, Si446x_PREAMBLE_CONFIG, 0x21); | ||||
| 
 | ||||
|  |  | |||
|  | @ -176,6 +176,9 @@ static bool aquirePosition(dataPoint_t* tp, dataPoint_t* ltp, | |||
| 
 | ||||
|     TRACE_WARN("COLL > GPS acquisition stopped due low battery"); | ||||
|     getPositionFallback(tp, ltp, GPS_LOWBATT2); | ||||
|     tp->gps_sats = 0; | ||||
|     tp->gps_ttff = 0; | ||||
|     tp->gps_pdop = 0; | ||||
|     GPS_Deinit(); | ||||
|     return false; | ||||
| 
 | ||||
|  | @ -232,6 +235,14 @@ static bool aquirePosition(dataPoint_t* tp, dataPoint_t* ltp, | |||
|   // Debug
 | ||||
|   TRACE_INFO("COLL > GPS sampling finished GPS LOCK"); | ||||
| 
 | ||||
|   // Read time from RTC
 | ||||
|   ptime_t time; | ||||
|   getTime(&time); | ||||
|   if(time.year == RTC_BASE_YEAR) { | ||||
|     /* Snapshot the RTC time. Old time entries can be adjusted using this data. */ | ||||
|     ltp->gps_state = GPS_TIME; | ||||
|     ltp->gps_time = date2UnixTimestamp(&time); | ||||
|   } | ||||
|   // Calibrate RTC
 | ||||
|   setTime(&gpsFix.time); | ||||
| 
 | ||||
|  | @ -478,11 +489,8 @@ THD_FUNCTION(collectorThread, arg) { | |||
|   } | ||||
|   /* Now check if the controller has been reset (RTC not set). */ | ||||
|   getTime(&time); | ||||
|   if(time.year == RTC_BASE_YEAR) | ||||
|     /* Let initializer know this is a cold start (power loss). */ | ||||
|     (void)chMsgSend(caller, MSG_RESET); | ||||
|   else | ||||
|     (void)chMsgSend(caller, MSG_OK); | ||||
|   /* Let initializer know if this is a normal or cold start (power loss). */ | ||||
|   (void)chMsgSend(caller, time.year == RTC_BASE_YEAR ? MSG_RESET : MSG_OK); | ||||
| 
 | ||||
|   /*
 | ||||
|    * Done with initialization now. | ||||
|  | @ -506,22 +514,28 @@ THD_FUNCTION(collectorThread, arg) { | |||
|     getGPIO(tp); | ||||
|     setSystemStatus(tp); | ||||
| 
 | ||||
|     getTime(&time); | ||||
|     /* Set timeout based on cycle or minimum 1 minute. */ | ||||
|     sysinterval_t gps_wait_time; | ||||
|     if(config->beacon.cycle < TIME_S2I(60)) | ||||
|       gps_wait_time = TIME_S2I(60); | ||||
|     else | ||||
|       gps_wait_time = config->beacon.cycle; | ||||
|     sysinterval_t gps_wait_time = | ||||
|                                    config->beacon.cycle > TIME_S2I(60) | ||||
|                                    ? TIME_S2I(60) : config->beacon.cycle; | ||||
| 
 | ||||
|     getTime(&time); | ||||
|     if(time.year == RTC_BASE_YEAR) { | ||||
|       /*
 | ||||
|       *  The RTC is not set. | ||||
|       *  Enable the GPS and attempt a lock which results in setting the RTC. | ||||
|       */ | ||||
|       TRACE_INFO("COLL > Acquire time using GPS"); | ||||
|       TRACE_INFO("COLL > Attempt time acquisition using GPS for 60 seconds"); | ||||
| 
 | ||||
|       if(aquirePosition(tp, ltp, gps_wait_time)) { | ||||
|         /* Acquisition succeeded. */ | ||||
|         if(ltp->gps_state == GPS_TIME) { | ||||
|           /* Write the timestamp where RTC was calibrated. */ | ||||
|           ltp->gps_sats = 0; | ||||
|           ltp->gps_ttff = 0; | ||||
|           ltp->gps_pdop = 0; | ||||
|           flash_writeLogDataPoint(ltp); | ||||
|         } | ||||
|         TRACE_INFO("COLL > Time update acquired from GPS"); | ||||
|       } else { | ||||
|         /* Time is stale record. */ | ||||
|  |  | |||
|  | @ -34,7 +34,7 @@ | |||
|  */ | ||||
| #define GPS_STATE_NAMES                                                     \ | ||||
|   "LOCKED1", "LOCKED2", "LOSS", "LOWBATT1", "LOWBATT2", "LOG", "OFF",       \ | ||||
|   "ERROR", "FIXED" | ||||
|   "ERROR", "FIXED", "TIME" | ||||
| 
 | ||||
| typedef enum { | ||||
| 	GPS_LOCKED1,	// The GPS is locked, the GPS has been switched off
 | ||||
|  | @ -45,10 +45,11 @@ typedef enum { | |||
| 	GPS_LOG,		// The tracker has just been switched on and the position has been taken from the log
 | ||||
| 	GPS_OFF,		// There was no prior acquisition by GPS
 | ||||
| 	GPS_ERROR,		// The GPS has a communication error
 | ||||
|     GPS_FIXED       // Fixed location data used from APRS location
 | ||||
|     GPS_FIXED,      // Fixed location data used from APRS location
 | ||||
|     GPS_TIME        // Time stamp of RTC on first getting GPS time
 | ||||
| } gpsState_t; | ||||
| 
 | ||||
| #define GPS_STATE_MAX   GPS_FIXED | ||||
| #define GPS_STATE_MAX   GPS_TIME | ||||
| 
 | ||||
| typedef struct { | ||||
| 	// Voltage and current measurement
 | ||||
|  |  | |||
|  | @ -62,24 +62,6 @@ THD_FUNCTION(bcnThread, arg) { | |||
| 
 | ||||
|     /* Continue here when collector responds. */ | ||||
|     if(!p_sleep(&conf->beacon.sleep_conf)) { | ||||
|       //if(!isPositionValid(dataPoint) || dataPoint == NULL) {
 | ||||
| /*        TRACE_INFO("BCN  > Waiting for position data for"
 | ||||
|             " %s (GPS state=%d)", conf->call, dataPoint->gps_state);*/ | ||||
|         //if(conf->run_once) {
 | ||||
|           /* If this is run once so don't retry. */ | ||||
|           //chHeapFree(conf);
 | ||||
|           //pktThdTerminateSelf();
 | ||||
|         //}
 | ||||
|         //if(isGPSbatteryOperable(dataPoint)) {
 | ||||
|           /* If the battery is good retry quickly.
 | ||||
|            * TODO: Rework and involve the p_sleep setting? | ||||
|            * Limit to a number of retries? */ | ||||
|           //chThdSleep(TIME_S2I(60));
 | ||||
|           //continue;
 | ||||
|         //}
 | ||||
|         /* Else battery weak so beacon fallback data (TX may fail). */ | ||||
|       //}
 | ||||
| 
 | ||||
|       // Telemetry encoding parameter transmissions
 | ||||
|       if(conf_sram.tel_enc_cycle != 0 | ||||
|     		  && chVTTimeElapsedSinceX(last_conf_transmission) | ||||
|  |  | |||
|  | @ -103,7 +103,7 @@ void start_aprs_threads(radio_unit_t radio, radio_freq_t base_freq, | |||
|  * | ||||
|  */ | ||||
| bool transmitOnRadio(packet_t pp, const radio_freq_t base_freq, | ||||
|                      const channel_hz_t step, const radio_ch_t chan, | ||||
|                      const channel_hz_t step, radio_ch_t chan, | ||||
|                      const radio_pwr_t pwr, const mod_t mod, | ||||
|                      const radio_squelch_t cca) { | ||||
|   /* Select a radio by frequency. */ | ||||
|  | @ -140,6 +140,11 @@ bool transmitOnRadio(packet_t pp, const radio_freq_t base_freq, | |||
|       return false; | ||||
|   } | ||||
| 
 | ||||
|   /* Channel is only used with absolute base frequencies. */ | ||||
|   if(base_freq < FREQ_CODES_END) { | ||||
|     chan = 0; | ||||
|   } | ||||
| 
 | ||||
|   uint16_t len = ax25_get_info(pp, NULL); | ||||
| 
 | ||||
|   /* Check information size. */ | ||||
|  | @ -166,7 +171,7 @@ bool transmitOnRadio(packet_t pp, const radio_freq_t base_freq, | |||
|     rt.handler = handler; | ||||
|     rt.command = PKT_RADIO_TX_SEND; | ||||
|     rt.type = mod; | ||||
|     rt.base_frequency = base_freq; | ||||
|     rt.base_frequency = op_freq; | ||||
|     rt.step_hz = step; | ||||
|     rt.channel = chan; | ||||
|     rt.tx_power = pwr; | ||||
|  |  | |||
		Ładowanie…
	
		Reference in New Issue
	
	 bob
						bob