Skip to content

Instantly share code, notes, and snippets.

@nmaupu
Last active October 9, 2020 20:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nmaupu/16f648cbfe8f119de1d80a90b94431f4 to your computer and use it in GitHub Desktop.
Save nmaupu/16f648cbfe8f119de1d80a90b94431f4 to your computer and use it in GitHub Desktop.
trim wheel arduino test
// Using Spad.next serial capabilities
#include <CmdMessenger.h> // CmdMessenger
#include <stdio.h>
#define GUID "{65472db3-e462-4525-9a40-3eb584dd14c8}"
#define CMD_REQUEST 0
#define CMD_COMMAND 1
#define CMD_EVENT 2
#define CMD_DEBUG 3
#define CMD_SIM_COMMAND 4
#define CMD_TRIM_UP 10
#define CMD_TRIM_DN 11
#define ROTARY_PIN_A 2
#define ROTARY_PIN_B 4
#define ROTARY_SWITCH 3
#define ELEV_TRIM_INCREMENT 75
#define MAX_ELEV_TRIM 16384
#define MIN_ELEV_TRIM -16384
CmdMessenger messenger(Serial);
bool isReady = false;
char buf[64];
volatile int elevTrim = 0;
volatile byte flag = 0;
void rotaryProcessing();
void switchProcessing();
void attachCommandCallbacks();
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(ROTARY_PIN_A, INPUT_PULLUP);
pinMode(ROTARY_PIN_B, INPUT);
pinMode(ROTARY_SWITCH, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(ROTARY_PIN_A), rotaryProcessing, FALLING);
attachInterrupt(digitalPinToInterrupt(ROTARY_SWITCH), switchProcessing, FALLING);
attachCommandCallbacks();
// Setting trim to zero
messenger.sendCmdStart(CMD_SIM_COMMAND);
messenger.sendCmdArg("SIMCONNECT:ELEVATOR_TRIM_SET");
messenger.sendCmdArg(elevTrim);
messenger.sendCmdEnd();
}
void loop() {
// Process incoming serial data, and perform callbacks
messenger.feedinSerialData();
if(flag) { // Interrupt occurred
messenger.sendCmdStart(CMD_SIM_COMMAND);
messenger.sendCmdArg("SIMCONNECT:ELEVATOR_TRIM_SET");
messenger.sendCmdArg(elevTrim);
messenger.sendCmdEnd();
flag = 0;
}
}
void rotaryProcessing() {
// pin A is falling to zero
byte bState = digitalRead(ROTARY_PIN_B);
if(bState == 0) {
// CW
elevTrim += ELEV_TRIM_INCREMENT;
} else if(bState == 1) {
// CCW
elevTrim -= ELEV_TRIM_INCREMENT;
}
if(elevTrim >= MAX_ELEV_TRIM) {
elevTrim = MAX_ELEV_TRIM;
} else if(elevTrim <= MIN_ELEV_TRIM) {
elevTrim = MIN_ELEV_TRIM;
}
flag = 1;
}
void switchProcessing() {
sprintf(buf, "Switch clicked");
messenger.sendCmd(CMD_DEBUG, buf);
}
void attachCommandCallbacks() {
messenger.attach(onUnknownCommand);
messenger.attach(CMD_REQUEST, onIdentifyRequest);
messenger.attach(CMD_TRIM_UP, onTrimUp);
messenger.attach(CMD_TRIM_DN, onTrimDn);
}
void onUnknownCommand() {
messenger.sendCmd(CMD_DEBUG, "Unknown command");
}
void onIdentifyRequest() {
char*szReq = messenger.readStringArg();
if(strcmp("INIT", szReq) == 0) {
messenger.sendCmdStart(CMD_REQUEST);
messenger.sendCmdArg("SPAD");
messenger.sendCmdArg(F(GUID));
messenger.sendCmdArg("Arduino trim wheel");
messenger.sendCmdEnd();
return;
}
if(strcmp("PING", szReq) == 0) {
messenger.sendCmdStart(CMD_REQUEST);
messenger.sendCmdArg("PONG");
messenger.sendCmdArg(messenger.readInt32Arg());
messenger.sendCmdEnd();
return;
}
if(strcmp("CONFIG", szReq) == 0) {
messenger.sendCmdStart(CMD_COMMAND);
messenger.sendCmdArg("SUBSCRIBE");
messenger.sendCmdArg(CMD_TRIM_DN);
messenger.sendCmdArg("SIMCONNECT:ELEV_TRIM_DN");
messenger.sendCmdEnd();
messenger.sendCmdStart(CMD_COMMAND);
messenger.sendCmdArg("SUBSCRIBE");
messenger.sendCmdArg(CMD_TRIM_UP);
messenger.sendCmdArg("SIMCONNECT:ELEV_TRIM_UP");
messenger.sendCmdEnd();
// tell SPAD.neXT we are done with config
messenger.sendCmd(CMD_REQUEST, "CONFIG");
isReady = true;
return;
}
}
void onTrimUp() {
int32_t val = messenger.readInt32Arg();
sprintf(buf, "%010d", val);
messenger.sendCmd(CMD_DEBUG, buf);
}
void onTrimDn() {
int32_t val = messenger.readInt32Arg();
sprintf(buf, "%10d", val);
messenger.sendCmd(CMD_DEBUG, buf);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment