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