2016-08-13 21:05:19 +00:00
/* Hamshield
* Example : AFSK Packet Tester
* This example sends AFSK test data . You will need a seperate
* AFSK receiver to test the output of this example .
* Connect the HamShield to your Arduino . Screw the antenna
* into the HamShield RF jack . Connect the Arduino to wall
* power and then to your computer via USB . After uploading
* this program to your adruino , open the Serial Monitor to
* monitor the process of the HamShield . Check for output on
* AFSK receiver .
* Note : add message receive code
2015-07-15 03:05:20 +00:00
*/
# define DDS_REFCLK_DEFAULT 9600
# include <HamShield.h>
2016-08-17 21:17:56 +00:00
# include <DDS.h>
# include <AFSK.h>
2015-07-15 03:05:20 +00:00
# include <avr/wdt.h>
2015-11-23 16:54:10 +00:00
# define PWM_PIN 3
# define RESET_PIN A3
# define SWITCH_PIN 2
2015-07-15 03:05:20 +00:00
HamShield radio ;
DDS dds ;
2016-08-17 21:17:56 +00:00
AFSK afsk ;
2015-07-15 03:05:20 +00:00
String messagebuff = " " ;
String origin_call = " " ;
String destination_call = " " ;
String textmessage = " " ;
int msgptr = 0 ;
void setup ( ) {
2015-11-23 16:54:10 +00:00
// NOTE: if not using PWM out, it should be held low to avoid tx noise
pinMode ( PWM_PIN , OUTPUT ) ;
digitalWrite ( PWM_PIN , LOW ) ;
// prep the switch
pinMode ( SWITCH_PIN , INPUT_PULLUP ) ;
// set up the reset control pin
pinMode ( RESET_PIN , OUTPUT ) ;
// turn on pwr to the radio
digitalWrite ( RESET_PIN , HIGH ) ;
2016-08-19 02:14:08 +00:00
Serial . begin ( 9600 ) ;
2015-11-23 16:54:10 +00:00
2015-07-15 03:05:20 +00:00
radio . initialize ( ) ;
radio . frequency ( 144390 ) ;
2016-01-05 03:36:37 +00:00
radio . setRfPower ( 0 ) ;
2015-07-15 03:05:20 +00:00
dds . start ( ) ;
2016-08-17 21:17:56 +00:00
afsk . start ( & dds ) ;
2015-07-15 03:05:20 +00:00
delay ( 100 ) ;
Serial . println ( " HELLO " ) ;
}
void loop ( ) {
messagebuff = " KC7IBT,KC7IBT,:HAMSHIELD TEST " ;
prepMessage ( ) ;
delay ( 10000 ) ;
2016-06-05 18:53:49 +00:00
}
2015-07-15 03:05:20 +00:00
void prepMessage ( ) {
2016-06-05 18:53:49 +00:00
radio . setModeTransmit ( ) ;
delay ( 500 ) ;
origin_call = messagebuff . substring ( 0 , messagebuff . indexOf ( ' , ' ) ) ; // get originating callsign
destination_call = messagebuff . substring ( messagebuff . indexOf ( ' , ' ) + 1 , messagebuff . indexOf ( ' , ' , messagebuff . indexOf ( ' , ' ) + 1 ) ) ; // get the destination call
textmessage = messagebuff . substring ( messagebuff . indexOf ( " : " ) + 1 ) ;
Serial . print ( " From: " ) ; Serial . print ( origin_call ) ; Serial . print ( " To: " ) ; Serial . println ( destination_call ) ; Serial . println ( " Text: " ) ; Serial . println ( textmessage ) ;
AFSK : : Packet * packet = AFSK : : PacketBuffer : : makePacket ( 22 + 32 ) ;
packet - > start ( ) ;
packet - > appendCallsign ( origin_call . c_str ( ) , 0 ) ;
packet - > appendCallsign ( destination_call . c_str ( ) , 15 , true ) ;
packet - > appendFCS ( 0x03 ) ;
packet - > appendFCS ( 0xf0 ) ;
packet - > print ( textmessage ) ;
packet - > finish ( ) ;
2016-08-17 21:17:56 +00:00
bool ret = afsk . putTXPacket ( packet ) ;
2016-06-05 18:53:49 +00:00
2016-08-17 21:17:56 +00:00
if ( afsk . txReady ( ) ) {
2016-06-05 18:53:49 +00:00
Serial . println ( F ( " txReady " ) ) ;
radio . setModeTransmit ( ) ;
//delay(100);
2016-08-17 21:17:56 +00:00
if ( afsk . txStart ( ) ) {
2016-06-05 18:53:49 +00:00
Serial . println ( F ( " txStart " ) ) ;
} else {
radio . setModeReceive ( ) ;
2015-07-15 03:05:20 +00:00
}
2016-06-05 18:53:49 +00:00
}
// Wait 2 seconds before we send our beacon again.
Serial . println ( " tick " ) ;
// Wait up to 2.5 seconds to finish sending, and stop transmitter.
// TODO: This is hackery.
for ( int i = 0 ; i < 500 ; i + + ) {
2016-08-17 21:17:56 +00:00
if ( afsk . encoder . isDone ( ) )
2016-06-05 18:53:49 +00:00
break ;
delay ( 50 ) ;
}
Serial . println ( " Done sending " ) ;
radio . setModeReceive ( ) ;
}
2015-07-15 03:05:20 +00:00
ISR ( TIMER2_OVF_vect ) {
TIFR2 = _BV ( TOV2 ) ;
static uint8_t tcnt = 0 ;
if ( + + tcnt = = 8 ) {
2016-06-05 18:53:49 +00:00
dds . clockTick ( ) ;
2015-07-15 03:05:20 +00:00
tcnt = 0 ;
}
}
ISR ( ADC_vect ) {
static uint8_t tcnt = 0 ;
TIFR1 = _BV ( ICF1 ) ; // Clear the timer flag
dds . clockTick ( ) ;
if ( + + tcnt = = 1 ) {
2016-08-17 21:17:56 +00:00
if ( afsk . encoder . isSending ( ) ) {
afsk . timer ( ) ;
2015-07-15 03:05:20 +00:00
}
tcnt = 0 ;
}
}