101 lines
1.6 KiB
C++
101 lines
1.6 KiB
C++
/* Copywrite M0ZAH - simple morse ID */
|
|
|
|
/* IO */
|
|
#define IDTIME 10000
|
|
#define COS 0
|
|
#define PTT 1
|
|
#define PIP 3
|
|
|
|
/* CW ID SETTINGS */
|
|
#define ID "MB5NN"
|
|
#define CW_SPEED 22
|
|
#define CW_PITCH 1000
|
|
|
|
typedef enum {
|
|
STBY,
|
|
HANG,
|
|
IN_USE,
|
|
CW,
|
|
}state;
|
|
|
|
typedef struct {
|
|
char* callsign;
|
|
int cw_pitch;
|
|
int cw_speed;
|
|
unsigned long id;
|
|
bool is_id;
|
|
state state;
|
|
}rpt;
|
|
|
|
rpt *myrpt;
|
|
unsigned long tick;
|
|
|
|
void setup() {
|
|
pinMode(COS, INPUT_PULLUP);
|
|
pinMode(PIP, OUTPUT);
|
|
pinMode(PTT, OUTPUT);
|
|
static rpt repeater = {
|
|
.callsign = ID,
|
|
.cw_pitch = CW_PITCH,
|
|
.cw_speed = 1200 / CW_SPEED,
|
|
.id = 0,
|
|
.is_id = false,
|
|
.state = STBY,
|
|
};
|
|
myrpt = &repeater;
|
|
}
|
|
|
|
void loop() {
|
|
tick = millis();
|
|
|
|
switch (myrpt->state) {
|
|
case STBY:
|
|
if (!digitalRead(COS)) {
|
|
digitalWrite(PTT, LOW);
|
|
myrpt->state = IN_USE;
|
|
}
|
|
|
|
if (!digitalRead(PTT))
|
|
digitalWrite(PTT, HIGH);
|
|
break;
|
|
|
|
case HANG:
|
|
delay(250);
|
|
tone(PIP, 875, 75);
|
|
|
|
unsigned long hang = tick;
|
|
for(;;) {
|
|
if (!digitalRead(COS)) {
|
|
myrpt->state = IN_USE;
|
|
break;
|
|
}
|
|
if (millis() - hang >= 1000) {
|
|
myrpt->state = STBY;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IN_USE:
|
|
if (digitalRead(COS)) {
|
|
delay(250);
|
|
if (!digitalRead(COS))
|
|
break;
|
|
myrpt->state = HANG;
|
|
}
|
|
break;
|
|
|
|
case CW:
|
|
/* This is not used at this time */
|
|
break;
|
|
}
|
|
|
|
/* Is it time to ID? */
|
|
if (tick - myrpt->id > IDTIME) {
|
|
if (myrpt->state > STBY) {
|
|
myrpt->is_id = true;
|
|
sendID(myrpt);
|
|
}
|
|
}
|
|
}
|