diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Makefile | 3 | ||||
| -rw-r--r-- | src/kernel/ao_config.c | 41 | ||||
| -rw-r--r-- | src/kernel/ao_config.h | 9 | ||||
| -rw-r--r-- | src/kernel/ao_forward.c | 48 | ||||
| -rw-r--r-- | src/kernel/ao_forward.h | 24 | ||||
| -rw-r--r-- | src/telerepeat-v1.0/Makefile | 100 | ||||
| -rw-r--r-- | src/telerepeat-v1.0/ao_pins.h | 111 | ||||
| -rw-r--r-- | src/telerepeat-v1.0/ao_telerepeat.c | 47 | 
8 files changed, 381 insertions, 2 deletions
| diff --git a/src/Makefile b/src/Makefile index 7f09db02..20126de6 100644 --- a/src/Makefile +++ b/src/Makefile @@ -22,7 +22,8 @@ SDCCDIRS=\  	telemini-v1.0 telemini-v2.0 \  	telebt-v1.0 \  	teleterra-v0.2 teleshield-v0.1 \ -	telefire-v0.1 telefire-v0.2 +	telefire-v0.1 telefire-v0.2 \ +	telerepeat-v1.0  ARMM3DIRS=\  	easymega-v1.0 easymega-v1.0/flash-loader \ diff --git a/src/kernel/ao_config.c b/src/kernel/ao_config.c index d1b93122..6b8a1813 100644 --- a/src/kernel/ao_config.c +++ b/src/kernel/ao_config.c @@ -93,10 +93,18 @@ ao_config_put(void)  #endif  #if HAS_RADIO + +#if HAS_RADIO_FORWARD +__xdata uint32_t	ao_send_radio_setting; +#endif +  void  ao_config_set_radio(void)  {  	ao_config.radio_setting = ao_freq_to_set(ao_config.frequency, ao_config.radio_cal); +#if HAS_RADIO_FORWARD +	ao_send_radio_setting = ao_freq_to_set(ao_config.send_frequency, ao_config.radio_cal); +#endif  }  #endif /* HAS_RADIO */ @@ -208,6 +216,10 @@ _ao_config_get(void)  		if (minor < 20)  			ao_config.radio_rate = AO_CONFIG_DEFAULT_RADIO_RATE;  #endif +#if HAS_RADIO_FORWARD +		if (minor < 21) +			ao_config.send_frequency = 434550; +#endif  		ao_config.minor = AO_CONFIG_MINOR;  		ao_config_dirty = 1;  	} @@ -302,6 +314,31 @@ ao_config_frequency_set(void) __reentrant  #endif +#if HAS_RADIO_FORWARD +void +ao_config_send_frequency_show(void) __reentrant +{ +	printf("Send frequency: %ld\n", +	       ao_config.send_frequency); +} + +void +ao_config_send_frequency_set(void) __reentrant +{ +	ao_cmd_decimal(); +	if (ao_cmd_status != ao_cmd_success) +		return; +	_ao_config_edit_start(); +	ao_config.send_frequency = ao_cmd_lex_u32; +	ao_config_set_radio(); +	_ao_config_edit_finish(); +#if HAS_RADIO_RECV +	ao_radio_recv_abort(); +#endif +} + +#endif +  #if HAS_FLIGHT  void @@ -863,6 +900,10 @@ __code struct ao_config_var ao_config_vars[] = {  #if HAS_RADIO  	{ "F <freq>\0Frequency (kHz)",  	  ao_config_frequency_set, ao_config_frequency_show }, +#if HAS_RADIO_FORWARD +	{ "R <freq>\0Repeater output frequency (kHz)", +	  ao_config_send_frequency_set, ao_config_send_frequency_show }, +#endif  	{ "c <call>\0Callsign (8 char max)",  	  ao_config_callsign_set,	ao_config_callsign_show },  	{ "e <0 disable, 1 enable>\0Enable telemetry and RDF", diff --git a/src/kernel/ao_config.h b/src/kernel/ao_config.h index 0be3e14d..164584a5 100644 --- a/src/kernel/ao_config.h +++ b/src/kernel/ao_config.h @@ -57,7 +57,7 @@  #endif  #define AO_CONFIG_MAJOR	1 -#define AO_CONFIG_MINOR	20 +#define AO_CONFIG_MINOR	21  #define AO_AES_LEN 16 @@ -112,8 +112,15 @@ struct ao_config {  #if HAS_RADIO_RATE  	uint8_t		radio_rate;		/* minor version 20 */  #endif +#if HAS_RADIO_FORWARD +	uint32_t	send_frequency;		/* minor version 21 */ +#endif  }; +#if HAS_RADIO_FORWARD +extern __xdata uint32_t	ao_send_radio_setting; +#endif +  #define AO_IGNITE_MODE_DUAL		0  #define AO_IGNITE_MODE_APOGEE		1  #define AO_IGNITE_MODE_MAIN		2 diff --git a/src/kernel/ao_forward.c b/src/kernel/ao_forward.c new file mode 100644 index 00000000..2a937183 --- /dev/null +++ b/src/kernel/ao_forward.c @@ -0,0 +1,48 @@ +/* + * Copyright © 2014 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +#include "ao.h" +#include "ao_telem.h" + +static void +ao_monitor_forward(void) +{ +	uint32_t					recv_radio_setting; +	static __xdata struct ao_telemetry_all_recv	packet; + +	for (;;) { +		while (ao_monitoring) +			ao_sleep(DATA_TO_XDATA(&ao_monitoring)); + +		if (!ao_radio_recv(&packet, sizeof(packet), 0)) +			continue; +		if (!(packet.status & PKT_APPEND_STATUS_1_CRC_OK)) +			continue; +		recv_radio_setting = ao_config.radio_setting; +		ao_config.radio_setting = ao_send_radio_setting; +		ao_radio_send(&packet.telemetry, sizeof (packet.telemetry)); +		ao_config.radio_setting = recv_radio_setting; +	} +} + +static __xdata struct ao_task ao_monitor_forward_task; + +void +ao_monitor_forward_init(void) __reentrant +{ +	ao_add_task(&ao_monitor_forward_task, ao_monitor_forward, "monitor_forward"); +} diff --git a/src/kernel/ao_forward.h b/src/kernel/ao_forward.h new file mode 100644 index 00000000..1897dc08 --- /dev/null +++ b/src/kernel/ao_forward.h @@ -0,0 +1,24 @@ +/* + * Copyright © 2014 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +#ifndef _AO_FORWARD_H_ +#define _AO_FORWARD_H_ + +void +ao_monitor_forward_init(void) __reentrant; + +#endif /* _AO_FORWARD_H_ */ diff --git a/src/telerepeat-v1.0/Makefile b/src/telerepeat-v1.0/Makefile new file mode 100644 index 00000000..17f68377 --- /dev/null +++ b/src/telerepeat-v1.0/Makefile @@ -0,0 +1,100 @@ +# +# TeleRepeat build file +# + +TELEREPEAT_VER=1.0 +TELEREPEAT_DEF=1_0 + +vpath %.c ..:../kernel:../cc1111:../drivers:../product +vpath %.h ..:../kernel:../cc1111:../drivers:../product +vpath ao-make-product.5c ../util + +ifndef VERSION +include ../Version +endif + +INC = \ +	ao.h \ +	ao_pins.h \ +	ao_arch.h \ +	ao_arch_funcs.h \ +	cc1111.h \ +	ao_product.h + +CORE_SRC = \ +	ao_cmd.c \ +	ao_config.c \ +	ao_monitor.c \ +	ao_mutex.c \ +	ao_panic.c \ +	ao_state.c \ +	ao_stdio.c \ +	ao_task.c \ +	ao_forward.c \ +	ao_storage.c \ +	ao_freq.c + +CC1111_SRC = \ +	ao_dbg.c \ +	ao_adc.c \ +	ao_dma.c \ +	ao_led.c \ +	ao_packet.c \ +	ao_intflash.c \ +	ao_packet_master.c \ +	ao_radio.c \ +	ao_romconfig.c \ +	ao_serial.c \ +	ao_string.c \ +	ao_timer.c \ +	ao_usb.c \ +	_bp.c + +DRIVER_SRC = \ +	ao_btm.c + +PRODUCT_SRC = \ +	ao_telerepeat.c + +SRC = \ +	$(CORE_SRC) \ +	$(CC1111_SRC) \ +	$(DRIVER_SRC) \ +	$(PRODUCT_SRC) + +PROGNAME = telerepeat-v$(TELEREPEAT_VER) +PROG = $(PROGNAME)-$(VERSION).ihx +PRODUCT=TeleRepeat-v$(TELEREPEAT_VER) +PRODUCT_DEF=-DTELEREPEAT_V_$(TELEREPEAT_DEF) +IDPRODUCT=0x000e +CODESIZE=0x7800 + +include ../cc1111/Makefile.cc1111 + +NICKLE=nickle +CHECK_STACK=sh ../util/check-stack + +V=0 +# The user has explicitly enabled quiet compilation. +ifeq ($(V),0) +quiet = @printf "  $1 $2 $@\n"; $($1) +endif +# Otherwise, print the full command line. +quiet ?= $($1) + +all: $(PROG) + +$(PROG): $(REL) Makefile +	$(call quiet,CC) $(LDFLAGS) $(CFLAGS) -o $(PROG) $(REL) +	$(call quiet,CHECK_STACK) ../cc1111/ao_arch.h $(PMEM) || rm $@ + +ao_product.h: ao-make-product.5c ../Version +	$(call quiet,NICKLE,$<) $< -m altusmetrum.org -i $(IDPRODUCT) -p $(PRODUCT) -v $(VERSION) > $@ + +distclean:	clean + +clean: clean-cc1111 + +install: + +uninstall: diff --git a/src/telerepeat-v1.0/ao_pins.h b/src/telerepeat-v1.0/ao_pins.h new file mode 100644 index 00000000..2a7dbd3b --- /dev/null +++ b/src/telerepeat-v1.0/ao_pins.h @@ -0,0 +1,111 @@ +/* + * Copyright © 2010 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +#ifndef _AO_PINS_H_ +#define _AO_PINS_H_ + +#define HAS_RADIO		1 +#define HAS_RADIO_FORWARD	1 +#define HAS_FLIGHT		0 +#define HAS_USB			1 +#define HAS_BEEP		0 +#define HAS_SERIAL_1		1 +#define HAS_SERIAL_1_ALT_1	1 +#define HAS_SERIAL_1_ALT_2	0 +#define HAS_SERIAL_1_HW_FLOW	1 +#define USE_SERIAL_1_STDIN	1 +#define DELAY_SERIAL_1_STDIN	1 +#define HAS_DBG			1 +#define HAS_EEPROM		1 +#define HAS_LOG			0 +#define USE_INTERNAL_FLASH	1 +#define HAS_BTM			1 +#define DBG_ON_P1 		1 +#define DBG_ON_P0 		0 +#define PACKET_HAS_MASTER	1 +#define PACKET_HAS_SLAVE	0 +#define AO_LED_RED		1 +#define AO_LED_BLUE		2 +#define LEDS_AVAILABLE		(AO_LED_RED|AO_LED_BLUE) +#define AO_MONITOR_LED		AO_LED_RED +#define AO_BT_LED		AO_LED_BLUE +#define BT_LINK_ON_P2		0 +#define BT_LINK_ON_P1		1 +#define BT_LINK_PIN_INDEX	7 +#define BT_LINK_PIN		P1_7 +#define HAS_MONITOR		1 +#define HAS_MONITOR_PUT		1 +#define LEGACY_MONITOR		0 +#define HAS_TELEMETRY		0 +#define AO_RADIO_REG_TEST	1 + +#define HAS_ADC			1 +#define AO_PAD_ADC_BATT		0 +#define AO_ADC_PINS		(1 << AO_PAD_ADC_BATT) + +struct ao_adc { +	int16_t		batt; +}; + +#define AO_ADC_DUMP(p)							\ +	printf ("tick: %5u batt %5d\n",					\ +		(p)->tick,						\ +		(p)->adc.batt) + +#define FETCH_ADC() do {						\ +		a = (uint8_t __xdata *) (&ao_data_ring[ao_data_head].adc.batt); \ +		a[0] = ADCL;						\ +		a[1] = ADCH;						\ +	} while (0) + +#if DBG_ON_P1 + +	#define DBG_CLOCK	(1 << 4)	/* mi0 */ +	#define DBG_DATA	(1 << 5)	/* mo0 */ +	#define DBG_RESET_N	(1 << 3)	/* c0 */ + +	#define DBG_CLOCK_PIN	(P1_4) +	#define DBG_DATA_PIN	(P1_5) +	#define DBG_RESET_N_PIN	(P1_3) + +	#define DBG_PORT_NUM	1 +	#define DBG_PORT	P1 +	#define DBG_PORT_SEL	P1SEL +	#define DBG_PORT_INP	P1INP +	#define DBG_PORT_DIR	P1DIR + +#endif /* DBG_ON_P1 */ + +#if DBG_ON_P0 + +	#define DBG_CLOCK	(1 << 3) +	#define DBG_DATA	(1 << 4) +	#define DBG_RESET_N	(1 << 5) + +	#define DBG_CLOCK_PIN	(P0_3) +	#define DBG_DATA_PIN	(P0_4) +	#define DBG_RESET_N_PIN	(P0_5) + +	#define DBG_PORT_NUM	0 +	#define DBG_PORT	P0 +	#define DBG_PORT_SEL	P0SEL +	#define DBG_PORT_INP	P0INP +	#define DBG_PORT_DIR	P0DIR + +#endif /* DBG_ON_P0 */ + +#endif /* _AO_PINS_H_ */ diff --git a/src/telerepeat-v1.0/ao_telerepeat.c b/src/telerepeat-v1.0/ao_telerepeat.c new file mode 100644 index 00000000..21bf8a73 --- /dev/null +++ b/src/telerepeat-v1.0/ao_telerepeat.c @@ -0,0 +1,47 @@ +/* + * Copyright © 2011 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +#include "ao.h" +#include "ao_forward.h" + +void +main(void) +{ +	ao_clock_init(); + +	/* Turn on the LED until the system is stable */ +	ao_led_init(LEDS_AVAILABLE); +	ao_led_on(AO_LED_RED); + +	ao_task_init(); + +	ao_timer_init(); +	ao_cmd_init(); +	ao_usb_init(); +	ao_monitor_init(); +	ao_radio_init(); +	ao_packet_master_init(); +	ao_adc_init(); +	ao_btm_init(); +	ao_monitor_forward_init(); +	ao_storage_init(); +#if HAS_DBG +	ao_dbg_init(); +#endif +	ao_config_init(); +	ao_start_scheduler(); +} | 
