From 84d18864690ac832a050b6dcab979958c957b437 Mon Sep 17 00:00:00 2001 From: Loren Moore Date: Sat, 4 Sep 2021 20:51:31 -0400 Subject: [PATCH] Initialization Alpha --- README.md | 8 ++- alpha/init-alpha.ino | 164 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 alpha/init-alpha.ino diff --git a/README.md b/README.md index 1d56958..f14c09e 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,8 @@ By: Jay Moore/NQ4T - nq4tango@gmail.com ``` 8-Feb-2020: Repository Creation, Intitial Commit, Alpha Versions -31-Aug-2020: Name Change, More Alpha Code, Actually Control Radio +31-Aug-2021: Name Change, More Alpha Code, Actually Control Radio +04-Sep-2021: Initialization Routine Alpha ```` @@ -109,6 +110,11 @@ of actually controlling a radio and displaying it's frequency. [Video Showing Current Protptype] (https://youtu.be/GGRZIbIPLOM) +CI-V communication is being chipped away on. I now have an initalization routine going that gets the starting vfo, +switches between the vfos, reads the frequency data of each, updates the appropiate variables, and resets the starting +VFO. Echo and ACK responses are handled in getdata(). Support for activating 731 Mode is in code. This outputs some +information to the serial monitor. Debugging routines also left in code but disabled. + # License diff --git a/alpha/init-alpha.ino b/alpha/init-alpha.ino new file mode 100644 index 0000000..57fc550 --- /dev/null +++ b/alpha/init-alpha.ino @@ -0,0 +1,164 @@ +/* +HamHead CI-V Alpha Module - Initialization + +This is a test of multiple things, an initialization routine +as well as working with pointers. Pointers was easy; getting +communication working boiled down to catching all my forgotten +variables and such. Pointers are used so that we can just work +on one VFO variable that's mapped to whatever the current one +is. + +Echo and ACK data are simply dropped right now. I have some +plans of maybe using echos to keep VFO in sync. But I will +determine this as I actually build functions. + +We now automatically drop the Echo and ACK ($FB), but you +MUST call getdata() to do so. + +*/ +#define DEBUG 0 +#if DEBUG == 1 +#define debug(x) Serial.print(x) +#define debug2(x,y) Serial.print(x,y) +#define debugln(x) Serial.println(x) +#else +#define debug(x) +#define debug2(x,y) +#define debugln(x) +#endif + + +//#define MODE731 1 // Uncoment for 731/735 mode. + +const byte numBytes = 32; +long dec[6]; +byte rxbytes[numBytes]; +unsigned long vfoa; +unsigned long vfob; +unsigned long vfos; +//byte civ[9]; +byte civ[9] = {0xFE, 0xFE, 0x88, 0xE0, 0xFF, 0xFF}; +byte endbyte = 0xFD; +unsigned long *v; +boolean newdata = false; +int bc; +long bcd[6]; + +void setup() { +Serial1.begin(19200); +Serial.begin(9600); +Serial.println("Initalizing VFO Variables."); +debugln(); +debugln("Getting Starting VFO..."); +v = &vfos; +getvfo(); +v = &vfoa; +setvfo(0x00); +getvfo(); +//debugln(); +v = &vfob; +setvfo(0x01); +getvfo(); +Serial.print("VFO A: "); +Serial.print(vfoa, DEC); +Serial.println(); +Serial.print("VFO B: "); +Serial.print(vfob, DEC); +debugln(); +debugln("Reverting to initial VFO."); +setstartvfo(); +debugln("Done."); +} + +void loop() { + +} + +void getdata() { + byte rb; + debug("RX Bytes: "); + while (Serial1.available() > 0 && newdata == false) { + rb = Serial1.read(); + if (rb == 0xFE) { // if it's a start byte we don't need it. + newdata = false; // make sure we keep looping + bc = 0; // i don't trust myself + } else if (rb == 0xFD) { // end of the frame + rxbytes[bc] = '\0'; // terminate the string + if (rxbytes[0]==0x88 || rxbytes[2] == 0xFB) { + newdata = false; // auto-echo ditch&ack + bc = 0; + } + else newdata = true;} // indicate there's new data} + else { + rxbytes[bc] = rb; // write the byte to the array + bc++; // increment byte counter + debug2(rb, HEX); + debug(" "); } + } + debugln(); + } + +long gogovfo() { + int i = 0; + long ggv; + #ifdef MODE731 + bc--; + #else + bc -=2; + #endif + for (int x = bc; x > 2; x--) { + bcd[i] = (((rxbytes[x] >> 4) *10) + (rxbytes[x]&0xF)); + i++; } + ggv = ((bcd[0]*1000000)+(bcd[1]*10000)+(bcd[2]*100)+(bcd[3])); + newdata = false; + return ggv; + } + +void setvfo(byte vfo) { + //byte zz; + if (vfo == 0x00) debugln ("Setting VFO A"); + else debugln("Setting VFO B"); + send7(0x07, vfo); + Serial1.flush(); + delay(50); + getdata(); // drop the echo + // newdata=false; +// getdata(); // drop the ack +// newdata=false; +} + +void send6(byte cmd) { + civ[4]=cmd; + Serial1.write(civ,5); + Serial1.write(endbyte); + Serial1.flush(); + delay(50); +} + +void send7(byte cmd, byte data) { + civ[4] = cmd; + civ[5] = data; + Serial1.write(civ,6); + Serial1.write(endbyte); + Serial1.flush(); + delay(50); + } + +void getvfo() { + debugln("Sending VFO Read"); + send6(0x03); + Serial1.flush(); + delay(50); + // getdata(); // drop the echo + // newdata=false; + getdata(); // preload the vfo + *v = gogovfo(); // process and update + } + +void setstartvfo() { + Serial.println(); + if (vfos == vfoa) { + Serial.println("Started on A"); + setvfo(0x00);} + else Serial.println("Staying on B"); +}