4c2f6453f1
schematics for the IOP setup.
135 lines
3.1 KiB
C++
135 lines
3.1 KiB
C++
//======================================================================
|
|
// ubitx_iop.ino
|
|
//======================================================================
|
|
|
|
#include "ubitx_iop.h"
|
|
|
|
#include <Bounce2.h>
|
|
#define BOUNCE_WITH_PROMPT_DETECTION
|
|
|
|
RigMode rigMode = MODE_SSB;
|
|
IOPConfig iopConfig;
|
|
|
|
#define MIC_PTT_PIN 21
|
|
#define LINE_PTT_PIN 20
|
|
#define PTT_KEY_OUT_PIN 2
|
|
|
|
Bounce micPTT = Bounce();
|
|
Bounce linePTT = Bounce();
|
|
|
|
bool micPTT_active = false;
|
|
bool linePTT_active = false;
|
|
|
|
void checkPTT()
|
|
{
|
|
// Update the PTT lines. USB/DIGI is not part of this. CW should work, however.
|
|
micPTT.update();
|
|
linePTT.update();
|
|
if (rigMode == MODE_SSB || rigMode == MODE_CW) {
|
|
if (micPTT_active) {
|
|
// ignore line PTT; just wait for release of mic PTT
|
|
if (micPTT.rose()) {
|
|
digitalWrite(PTT_KEY_OUT_PIN, HIGH);
|
|
audioReceive();
|
|
micPTT_active = false;
|
|
}
|
|
} else if (linePTT_active) {
|
|
// ignore mic PTT; just wait for release of line PTT
|
|
if (linePTT.rose()) {
|
|
digitalWrite(PTT_KEY_OUT_PIN, HIGH);
|
|
audioReceive();
|
|
linePTT_active = false;
|
|
}
|
|
} else {
|
|
// Whichever PTT source was last active, will determine the TX audio source.
|
|
if (micPTT.fell()) {
|
|
audioSelectTxInput(TX_MIC_IN);
|
|
micPTT_active = true;
|
|
audioTransmit();
|
|
digitalWrite(PTT_KEY_OUT_PIN, LOW);
|
|
} else if (linePTT.fell()) {
|
|
audioSelectTxInput(TX_LINE_IN);
|
|
linePTT_active = true;
|
|
audioTransmit();
|
|
digitalWrite(PTT_KEY_OUT_PIN, LOW);
|
|
}
|
|
}
|
|
}
|
|
|
|
#if defined(DEBUG)
|
|
if (micPTT.fell()) {
|
|
USBSERIAL.println("Mic PTT pressed!");
|
|
} else if (micPTT.rose()) {
|
|
USBSERIAL.println("Mic PTT released!");
|
|
}
|
|
if (linePTT.fell()) {
|
|
USBSERIAL.println("Line PTT pressed!");
|
|
} else if (linePTT.rose()) {
|
|
USBSERIAL.println("Line PTT released!");
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void setup() {
|
|
// put your setup code here, to run once:
|
|
initCAT(38400, SERIAL_8N1);
|
|
|
|
AudioMemory(12);
|
|
|
|
micPTT.attach(MIC_PTT_PIN, INPUT_PULLUP);
|
|
micPTT.interval(25);
|
|
linePTT.attach(LINE_PTT_PIN, INPUT_PULLUP);
|
|
linePTT.interval(25);
|
|
|
|
pinMode(PTT_KEY_OUT_PIN, OUTPUT);
|
|
digitalWrite(PTT_KEY_OUT_PIN, HIGH);
|
|
|
|
audioInit();
|
|
}
|
|
|
|
//======================================================================
|
|
|
|
void setRigMode(RigMode m)
|
|
{
|
|
rigMode = m;
|
|
switch(rigMode) {
|
|
case MODE_SSB:
|
|
break;
|
|
|
|
case MODE_DIGI:
|
|
break;
|
|
|
|
case MODE_CW:
|
|
break;
|
|
}
|
|
}
|
|
|
|
//======================================================================
|
|
|
|
void loop() {
|
|
elapsedMillis frame_timer = 0;
|
|
|
|
checkPTT();
|
|
serviceCAT();
|
|
/*
|
|
#if defined(DEBUG)
|
|
int frame_skews = 0; // for debugging; see how often we skew frames
|
|
#endif
|
|
|
|
// put your main code here, to run repeatedly:
|
|
|
|
// Run at a nominal 20 Hz frame rate.
|
|
#if defined(DEBUG)
|
|
if (frame_timer > 50) {
|
|
frame_skews += 1;
|
|
}
|
|
#endif
|
|
while (frame_timer < 50) { // this doesn't seem like a good way to do this
|
|
}
|
|
*/
|
|
}
|
|
|
|
//======================================================================
|
|
// EOF
|
|
//======================================================================
|