update Morse
This commit is contained in:
parent
7e509ca0fc
commit
6472b103b4
|
@ -10,6 +10,18 @@
|
||||||
* monitor the status of the beacon. To test, set a HandyTalkie
|
* monitor the status of the beacon. To test, set a HandyTalkie
|
||||||
* to 438MHz. You should hear the message " CALLSIGN HAMSHIELD"
|
* to 438MHz. You should hear the message " CALLSIGN HAMSHIELD"
|
||||||
* in morse code.
|
* in morse code.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Note: only upper case letters, numbers, and a few symbols
|
||||||
|
* are supported.
|
||||||
|
* Supported symbols: &/+(=:?";@`-._),!$
|
||||||
|
*
|
||||||
|
* If you're having trouble accurately decoding, you may want to
|
||||||
|
* tweak the min/max . and - times. You can also uncomment
|
||||||
|
* the Serial.print debug statements that can tell you when tones
|
||||||
|
* are being detected, how long they're detected for, and whether
|
||||||
|
* the tones are decoded as a . or -.
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define DDS_REFCLK_DEFAULT 9600
|
#define DDS_REFCLK_DEFAULT 9600
|
||||||
|
@ -28,10 +40,10 @@
|
||||||
#define CHAR_END_TIME (MORSE_DOT*2.7)
|
#define CHAR_END_TIME (MORSE_DOT*2.7)
|
||||||
#define MESSAGE_END_TIME (MORSE_DOT*8)
|
#define MESSAGE_END_TIME (MORSE_DOT*8)
|
||||||
|
|
||||||
#define MIN_DOT_TIME (MORSE_DOT*0.7)
|
#define MIN_DOT_TIME (MORSE_DOT-30)
|
||||||
#define MAX_DOT_TIME (MORSE_DOT*1.3)
|
#define MAX_DOT_TIME (MORSE_DOT+55)
|
||||||
#define MIN_DASH_TIME (MORSE_DOT*2.7)
|
#define MIN_DASH_TIME (MORSE_DOT*3-30)
|
||||||
#define MAX_DASH_TIME (MORSE_DOT*3.3)
|
#define MAX_DASH_TIME (MORSE_DOT*3+55)
|
||||||
|
|
||||||
|
|
||||||
HamShield radio;
|
HamShield radio;
|
||||||
|
@ -83,7 +95,7 @@ void setup() {
|
||||||
radio.lookForTone(MORSE_FREQ);
|
radio.lookForTone(MORSE_FREQ);
|
||||||
|
|
||||||
// Configure the HamShield to operate on 438.000MHz
|
// Configure the HamShield to operate on 438.000MHz
|
||||||
radio.frequency((uint32_t) 438000);
|
radio.frequency(432000);
|
||||||
radio.setModeReceive();
|
radio.setModeReceive();
|
||||||
|
|
||||||
Serial.println("Radio Configured.");
|
Serial.println("Radio Configured.");
|
||||||
|
@ -95,7 +107,6 @@ void setup() {
|
||||||
rx_morse_bit = 1;
|
rx_morse_bit = 1;
|
||||||
bits_to_process = false;
|
bits_to_process = false;
|
||||||
|
|
||||||
radio.bypassPreDeEmph();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
|
@ -119,6 +130,7 @@ void loop() {
|
||||||
// end the last tone
|
// end the last tone
|
||||||
uint16_t tone_time = millis() - tone_in_progress;
|
uint16_t tone_time = millis() - tone_in_progress;
|
||||||
tone_in_progress = 0;
|
tone_in_progress = 0;
|
||||||
|
//Serial.println(tone_time);
|
||||||
handleTone(tone_time);
|
handleTone(tone_time);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -151,9 +163,11 @@ void loop() {
|
||||||
// We'll wait up to 30 seconds for a clear channel, requiring that the channel is clear for 2 seconds before we transmit
|
// We'll wait up to 30 seconds for a clear channel, requiring that the channel is clear for 2 seconds before we transmit
|
||||||
if (radio.waitForChannel(30000,2000,-5)) {
|
if (radio.waitForChannel(30000,2000,-5)) {
|
||||||
// If we get here, the channel is clear.
|
// If we get here, the channel is clear.
|
||||||
|
Serial.println("sending");
|
||||||
|
|
||||||
// Start transmitting by putting the radio into transmit mode.
|
// Start transmitting by putting the radio into transmit mode.
|
||||||
radio.setModeTransmit();
|
radio.setModeTransmit();
|
||||||
|
Serial.println("tx");
|
||||||
unsigned int MORSE_BUF_SIZE = 128;
|
unsigned int MORSE_BUF_SIZE = 128;
|
||||||
char morse_buf[MORSE_BUF_SIZE];
|
char morse_buf[MORSE_BUF_SIZE];
|
||||||
unsigned int morse_idx;
|
unsigned int morse_idx;
|
||||||
|
|
|
@ -1070,29 +1070,40 @@ void HamShield::setDTMFCode(uint16_t code){
|
||||||
|
|
||||||
|
|
||||||
void HamShield::HStone(uint8_t pin, unsigned int frequency) {
|
void HamShield::HStone(uint8_t pin, unsigned int frequency) {
|
||||||
HSreadWord(devAddr, A1846S_DTMF_ENABLE_REG, radio_i2c_buf);
|
// store old dtmf reg for noTone
|
||||||
old_dtmf_reg = radio_i2c_buf[0];
|
// HSreadWord(devAddr, A1846S_DTMF_ENABLE_REG, radio_i2c_buf);
|
||||||
|
// old_dtmf_reg = radio_i2c_buf[0];
|
||||||
|
|
||||||
|
// set frequency
|
||||||
|
HSwriteWord(devAddr, A1846S_TONE1_FREQ, frequency*10);
|
||||||
|
|
||||||
|
// set 0x79 dtmf control
|
||||||
HSwriteBitsW(devAddr, 0x79, 15, 2, 0x3); // transmit single tone (not dtmf)
|
HSwriteBitsW(devAddr, 0x79, 15, 2, 0x3); // transmit single tone (not dtmf)
|
||||||
HSwriteBitsW(devAddr, A1846S_DTMF_ENABLE_REG, A1846S_DTMF_ENABLE_BIT, 2, 0x2); // transmit single tone (not dtmf)
|
// HSwriteBitsW(devAddr, A1846S_DTMF_ENABLE_REG, A1846S_DTMF_ENABLE_BIT, 2, 0x2); // transmit single tone (not dtmf)
|
||||||
|
|
||||||
// bypass pre/de-emphasis
|
// bypass pre/de-emphasis
|
||||||
HSwriteBitsW(devAddr, A1846S_FILTER_REG, A1846S_EMPH_FILTER_EN, 1, 1);
|
HSwriteBitsW(devAddr, A1846S_FILTER_REG, A1846S_EMPH_FILTER_EN, 1, 1);
|
||||||
|
|
||||||
HSwriteWord(devAddr, A1846S_TONE1_FREQ, frequency*10);
|
// set source for tx
|
||||||
setTxSourceTone1();
|
setTxSourceTone1(); // writes to 3A
|
||||||
|
|
||||||
//tone(pin, frequency);
|
//tone(pin, frequency);
|
||||||
}
|
}
|
||||||
void HamShield::HSnoTone(uint8_t pin) {
|
void HamShield::HSnoTone(uint8_t pin) {
|
||||||
HSwriteWord(devAddr, A1846S_DTMF_ENABLE_REG, old_dtmf_reg); // disable tone and dtmf
|
|
||||||
setTxSourceMic();
|
setTxSourceMic();
|
||||||
|
//HSwriteWord(devAddr, A1846S_DTMF_ENABLE_REG, old_dtmf_reg); // disable tone and dtmf
|
||||||
// noTone(pin);
|
// noTone(pin);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tone detection
|
// Tone detection
|
||||||
void HamShield::lookForTone(uint16_t t_hz) {
|
void HamShield::lookForTone(uint16_t t_hz) {
|
||||||
float tone_hz = (float) t_hz;
|
// set 0x79 dtmf control
|
||||||
|
HSwriteBitsW(devAddr, 0x79, 15, 2, 0x3); // transmit single tone (not dtmf)
|
||||||
|
|
||||||
|
// bypass pre/de-emphasis
|
||||||
|
HSwriteBitsW(devAddr, A1846S_FILTER_REG, A1846S_EMPH_FILTER_EN, 1, 1);
|
||||||
|
|
||||||
|
float tone_hz = (float) t_hz;
|
||||||
float Fs = 6400000/1024;
|
float Fs = 6400000/1024;
|
||||||
float k = floor(tone_hz/Fs*127 + 0.5);
|
float k = floor(tone_hz/Fs*127 + 0.5);
|
||||||
uint16_t t = (uint16_t) (round(2.0*cos(2.0*M_PI*k/127)*1024));
|
uint16_t t = (uint16_t) (round(2.0*cos(2.0*M_PI*k/127)*1024));
|
||||||
|
@ -1100,24 +1111,38 @@ void HamShield::lookForTone(uint16_t t_hz) {
|
||||||
float k2 = floor(2*tone_hz/Fs*127+0.5);
|
float k2 = floor(2*tone_hz/Fs*127+0.5);
|
||||||
uint16_t h = (uint16_t) (round(2.0*cos(2.0*M_PI*k2/127)*1024));
|
uint16_t h = (uint16_t) (round(2.0*cos(2.0*M_PI*k2/127)*1024));
|
||||||
// set tone
|
// set tone
|
||||||
HSwriteWord(devAddr, 0x68, t);
|
HSwriteWord(devAddr, 0x67, t); // looking for tone 1
|
||||||
|
|
||||||
// set second harmonic
|
// set second harmonic
|
||||||
HSwriteWord(devAddr, 0x70, h);
|
HSwriteWord(devAddr, 0x6F, h); // looking for tone
|
||||||
|
|
||||||
// turn on tone detect
|
// turn on tone detect
|
||||||
HSwriteBitW(devAddr, A1846S_DTMF_ENABLE_REG, A1846S_TONE_DETECT, 1);
|
HSwriteBitW(devAddr, A1846S_DTMF_ENABLE_REG, A1846S_TONE_DETECT, 1);
|
||||||
HSwriteBitW(devAddr, A1846S_DTMF_ENABLE_REG, A1846S_DTMF_ENABLE_BIT, 1);
|
HSwriteBitW(devAddr, A1846S_DTMF_ENABLE_REG, A1846S_DTMF_ENABLE_BIT, 1);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool redetect = false;
|
||||||
|
uint8_t last_tone_detected = 0;
|
||||||
uint8_t HamShield::toneDetected() {
|
uint8_t HamShield::toneDetected() {
|
||||||
HSreadBitsW(devAddr, A1846S_DTMF_CODE_REG, A1846S_DTMF_SAMPLE_BIT, 1, radio_i2c_buf);
|
HSreadBitsW(devAddr, A1846S_DTMF_CODE_REG, A1846S_DTMF_SAMPLE_BIT, 1, radio_i2c_buf);
|
||||||
if (radio_i2c_buf[0] != 0) {
|
if (radio_i2c_buf[0] != 0) {
|
||||||
|
if (!redetect) {
|
||||||
|
redetect = true;
|
||||||
HSreadBitsW(devAddr, A1846S_DTMF_CODE_REG, A1846S_DTMF_CODE_BIT, A1846S_DTMF_CODE_LEN, radio_i2c_buf);
|
HSreadBitsW(devAddr, A1846S_DTMF_CODE_REG, A1846S_DTMF_CODE_BIT, A1846S_DTMF_CODE_LEN, radio_i2c_buf);
|
||||||
if (radio_i2c_buf[0] == 1) {
|
last_tone_detected = radio_i2c_buf[0];
|
||||||
return 1;
|
//Serial.print("t: ");
|
||||||
}
|
//Serial.println(last_tone_detected);
|
||||||
}
|
}
|
||||||
|
if (last_tone_detected == 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
} else if (redetect) {
|
||||||
|
// re-enable detect
|
||||||
|
redetect = false;
|
||||||
|
HSwriteBitW(devAddr, A1846S_DTMF_ENABLE_REG, A1846S_TONE_DETECT, 1);
|
||||||
|
HSwriteBitW(devAddr, A1846S_DTMF_ENABLE_REG, A1846S_DTMF_ENABLE_BIT, 1);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1656,7 +1681,7 @@ void HamShield::morseOut(char buffer[HAMSHIELD_MORSE_BUFFER_SIZE]) {
|
||||||
}
|
}
|
||||||
//tone(hs_mic_pin, 6000, morse_dot_millis);
|
//tone(hs_mic_pin, 6000, morse_dot_millis);
|
||||||
HSnoTone(hs_mic_pin);
|
HSnoTone(hs_mic_pin);
|
||||||
HSdelay(morse_dot_millis); // delay between elements
|
HSdelay(morse_dot_millis);
|
||||||
bits >>= 1; // Shift into the next symbol
|
bits >>= 1; // Shift into the next symbol
|
||||||
} while(bits != 1); // Wait for 1 termination to be all we have left
|
} while(bits != 1); // Wait for 1 termination to be all we have left
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue