Added pips, now outputs full rsid / contestia telemetry

geofence_dev
Richard Meadows 2015-03-06 21:59:23 +00:00
rodzic 67719ea8b5
commit d985c90dfc
4 zmienionych plików z 117 dodań i 14 usunięć

Wyświetl plik

@ -0,0 +1,38 @@
/*
* Definitions for telemetry pips
* Copyright (C) 2015 Richard Meadows <richardeoin>
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef PIPS_H
#define PIPS_H
/**
* 10ms pips, once per second
*/
#define PIPS_RATE 1
#define PIPS_LENGTH_MS 50
#define PIPS_ON_FREQUENCY (1000 / PIPS_LENGTH_MS)
#define PIPS_OFF_FREQUENCY PIPS_RATE
#endif /* PIPS_H */

Wyświetl plik

@ -54,6 +54,7 @@ void telemetry_set_length(int32_t length);
float timer0_tick_init(float frequency); float timer0_tick_init(float frequency);
void timer0_tick_frequency(float frequency);
void timer0_tick_deinit(); void timer0_tick_deinit();
void telemetry_gpio1_pwm_init(void); void telemetry_gpio1_pwm_init(void);
void telemetry_gpio1_pwm_duty(float duty_cycle); void telemetry_gpio1_pwm_duty(float duty_cycle);

Wyświetl plik

@ -170,7 +170,6 @@ void output_telemetry_string(void)
while (gps_update_time_pending()) { while (gps_update_time_pending()) {
system_sleep(); system_sleep();
} }
// for (int i = 0; i < 100*1000; i++);
/* Time */ /* Time */
struct ubx_nav_timeutc time = gps_get_nav_timeutc(); struct ubx_nav_timeutc time = gps_get_nav_timeutc();
@ -189,7 +188,18 @@ void output_telemetry_string(void)
/* swap buffers */ /* swap buffers */
ARRAY_DBUFFER_SWAP(&telemetry_dbuffer_string); ARRAY_DBUFFER_SWAP(&telemetry_dbuffer_string);
/* start - SI NOW BELONGS TO TELEMETRY, WE CANNOT ACCESS */
/* RSID */
/* start - SI NOW BELONGS TO TELEMETRY, WE CANNOT ACCESS */
#ifdef CONTESTIA
telemetry_start_rsid(RSID_CONTESTIA_32_1000);
#endif
/* Sleep Wait for RSID to be done */
while (telemetry_active()) {
system_sleep();
}
#ifdef RTTY #ifdef RTTY
telemetry_start(TELEMETRY_RTTY); telemetry_start(TELEMETRY_RTTY);
#endif #endif
@ -210,9 +220,9 @@ void output_telemetry_string(void)
/* Request updates from the gps */ /* Request updates from the gps */
gps_update_position(); gps_update_position();
if (gps_is_locked()) { if (gps_is_locked()) {
led_on(); // led_on();
} else { } else {
led_off(); // led_off();
} }
/* Wait for the gps update. Move on if it's urgent */ /* Wait for the gps update. Move on if it's urgent */
@ -221,9 +231,9 @@ void output_telemetry_string(void)
} }
if (gps_is_locked()) { if (gps_is_locked()) {
led_off(); // led_off();
} else { } else {
led_on(); // led_on();
} }
/* GPS Status */ /* GPS Status */
@ -316,7 +326,7 @@ int main(void)
/* Initialise Si4060 interface */ /* Initialise Si4060 interface */
si_trx_init(); si_trx_init();
led_on(); // led_on();
while (1) { while (1) {
@ -324,9 +334,10 @@ int main(void)
//wdt_reset_count(); //wdt_reset_count();
/* Send the next packet */ /* Send the next packet */
//output_telemetry_string(); output_telemetry_string();
telemetry_start_rsid(RSID_CONTESTIA_32_1000); telemetry_start(TELEMETRY_PIPS);
telemetry_set_length(5);
/* Sleep Wait */ /* Sleep Wait */
while (telemetry_active()) { while (telemetry_active()) {

Wyświetl plik

@ -30,6 +30,7 @@
#include "rtty.h" #include "rtty.h"
#include "contestia.h" #include "contestia.h"
#include "rsid.h" #include "rsid.h"
#include "pips.h"
#include "si_trx.h" #include "si_trx.h"
#include "si_trx_defs.h" #include "si_trx_defs.h"
#include "system/gclk.h" #include "system/gclk.h"
@ -38,6 +39,25 @@
#include "tc/tc_driver.h" #include "tc/tc_driver.h"
#include "hw_config.h" #include "hw_config.h"
#include "system/port.h"
/**
* Turns the status LED on
*/
static inline void led_on(void)
{
port_pin_set_output_level(LED0_PIN, 0); /* LED is active low */
}
/**
* Turns the status lED off
*/
static inline void led_off(void)
{
port_pin_set_output_level(LED0_PIN, 1); /* LED is active low */
}
/** /**
* CYCLIC REDUNDANCY CHECK (CRC) * CYCLIC REDUNDANCY CHECK (CRC)
* ============================================================================= * =============================================================================
@ -136,8 +156,13 @@ int telemetry_start(enum telemetry_t type) {
case TELEMETRY_RTTY: case TELEMETRY_RTTY:
timer0_tick_init(RTTY_BITRATE); timer0_tick_init(RTTY_BITRATE);
break; break;
case TELEMETRY_PIPS:
timer0_tick_init(PIPS_OFF_FREQUENCY);
break;
case TELEMETRY_APRS:
case TELEMETRY_RSID: /* Not used - see function below */
break;
} }
return 0; /* Success */ return 0; /* Success */
} else { } else {
return 1; /* Already active */ return 1; /* Already active */
@ -168,7 +193,6 @@ int telemetry_start_rsid(rsid_code_t rsid) {
} }
} }
/** /**
* Returns the index of the current byte being outputted from the buffer * Returns the index of the current byte being outputted from the buffer
*/ */
@ -272,6 +296,22 @@ void telemetry_tick(void) {
telemetry_gpio1_pwm_deinit(); telemetry_gpio1_pwm_deinit();
return; return;
} }
break;
case TELEMETRY_PIPS: /* ---- ---- A pips mode! */
if (!radio_on) { /* Turn on */
/* Pips: Cw */
si_trx_on(SI_MODEM_MOD_TYPE_CW); radio_on = 1;
timer0_tick_frequency(PIPS_ON_FREQUENCY);
} else { /* Turn off */
si_trx_off(); radio_on = 0;
timer0_tick_frequency(PIPS_OFF_FREQUENCY);
telemetry_index++;
if (is_telemetry_finished()) return;
}
} }
} }
} }
@ -308,6 +348,8 @@ float timer0_tick_init(float frequency)
{ {
//si_gclk_setup(); //si_gclk_setup();
led_on();
/* Calculate the wrap value for the given frequency */ /* Calculate the wrap value for the given frequency */
//float gclk_frequency = SI406X_TCXO_FREQUENCY; //float gclk_frequency = SI406X_TCXO_FREQUENCY;
float gclk_frequency = (float)system_gclk_chan_get_hz(0); float gclk_frequency = (float)system_gclk_chan_get_hz(0);
@ -328,7 +370,7 @@ float timer0_tick_init(float frequency)
false, /* Oneshot */ false, /* Oneshot */
true, /* Run in standby */ true, /* Run in standby */
0x0000, /* Initial value */ 0x0000, /* Initial value */
count, /* Top value */ 0x0000, /* Top value */
t0_capture_channel_enables, /* Capture Channel Enables */ t0_capture_channel_enables, /* Capture Channel Enables */
t0_compare_channel_values); /* Compare Channels Values */ t0_compare_channel_values); /* Compare Channels Values */
@ -350,6 +392,19 @@ float timer0_tick_init(float frequency)
/* Return the frequency we actually initialised */ /* Return the frequency we actually initialised */
return gclk_frequency / (float)count; return gclk_frequency / (float)count;
} }
/**
* Changes the timer0 frequency
*/
void timer0_tick_frequency(float frequency)
{
float gclk_frequency = (float)system_gclk_chan_get_hz(0);
uint32_t count = (uint32_t)(gclk_frequency / frequency);
tc_set_compare_value(TC0,
TC_COMPARE_CAPTURE_CHANNEL_0,
count);
tc_set_count_value(TC0, 0);
}
/** /**
* Disables the timer * Disables the timer
*/ */
@ -358,8 +413,6 @@ void timer0_tick_deinit()
tc_stop_counter(TC0); tc_stop_counter(TC0);
tc_disable(TC0); tc_disable(TC0);
} }
/** /**
* Called at the symbol rate * Called at the symbol rate
*/ */