Scary commit. I've taken baby steps toward passing rig status between the Raduino and the TeensyDSP using I2C. Compiles, but has not been tested. Need to create a branch.
This commit is contained in:
parent
e62e3ef548
commit
4186fdcdd4
|
@ -1,4 +1,4 @@
|
||||||
//Firmware Version
|
//Firmware Version
|
||||||
//+ : This symbol identifies the firmware.
|
//+ : This symbol identifies the firmware.
|
||||||
// It was originally called 'CEC V1.072' but it is too long to waste the LCD window.
|
// It was originally called 'CEC V1.072' but it is too long to waste the LCD window.
|
||||||
// I do not want to make this Firmware users's uBITX messy with my callsign.
|
// I do not want to make this Firmware users's uBITX messy with my callsign.
|
||||||
|
@ -122,7 +122,9 @@ char vfoActive = VFO_A;
|
||||||
int8_t meter_reading = 0; // a -1 on meter makes it invisible
|
int8_t meter_reading = 0; // a -1 on meter makes it invisible
|
||||||
unsigned long vfoA=7150000L, vfoB=14200000L, sideTone=800, usbCarrier, cwmCarrier;
|
unsigned long vfoA=7150000L, vfoB=14200000L, sideTone=800, usbCarrier, cwmCarrier;
|
||||||
unsigned long vfoA_eeprom, vfoB_eeprom; //for protect eeprom life
|
unsigned long vfoA_eeprom, vfoB_eeprom; //for protect eeprom life
|
||||||
unsigned long frequency, ritRxFrequency, ritTxFrequency; //frequency is the current frequency on the dial
|
unsigned long frequency;
|
||||||
|
unsigned long ritRxFrequency, ritTxFrequency; //frequency is the current frequency on the dial
|
||||||
|
|
||||||
|
|
||||||
unsigned int cwSpeed = 100; //this is actuall the dot period in milliseconds
|
unsigned int cwSpeed = 100; //this is actuall the dot period in milliseconds
|
||||||
extern int32_t calibration;
|
extern int32_t calibration;
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
../TeensyDSP/RigState.h
|
|
@ -19,6 +19,8 @@
|
||||||
|
|
||||||
#include <Arduino.h> //for Linux, On Linux it is case sensitive.
|
#include <Arduino.h> //for Linux, On Linux it is case sensitive.
|
||||||
|
|
||||||
|
#include "RigState.h"
|
||||||
|
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
// Compile Option
|
// Compile Option
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
|
@ -253,6 +255,12 @@ extern byte I2C_LCD_SECOND_ADDRESS; //only using Dual LCD Mode
|
||||||
#define I2CMETER_CALCR 0x55 //Calculated SWR Meter
|
#define I2CMETER_CALCR 0x55 //Calculated SWR Meter
|
||||||
#define I2CMETER_UNCALCR 0x54 //Uncalculated SWR Meter
|
#define I2CMETER_UNCALCR 0x54 //Uncalculated SWR Meter
|
||||||
|
|
||||||
|
// Raduino provides updated data to TeensyDSP
|
||||||
|
#define I2CMETER_RIGINF 0x50
|
||||||
|
|
||||||
|
// Raduino requests any CAT updates from TeensyDSP
|
||||||
|
#define I2CMETER_REQCAT 0x51
|
||||||
|
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
// for public, Variable, functions
|
// for public, Variable, functions
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
|
@ -332,4 +340,6 @@ extern void DisplayVersionInfo(const char* fwVersionInfo);
|
||||||
//I2C Signal Meter, Version 1.097
|
//I2C Signal Meter, Version 1.097
|
||||||
extern int GetI2CSmeterValue(int valueType); //ubitx_ui.ino
|
extern int GetI2CSmeterValue(int valueType); //ubitx_ui.ino
|
||||||
|
|
||||||
|
extern void doRaduinoToTeensy(UBitxRigState* r);
|
||||||
|
|
||||||
#endif //end of if header define
|
#endif //end of if header define
|
||||||
|
|
|
@ -990,9 +990,18 @@ void SWS_Process(void)
|
||||||
char checkCount = 0;
|
char checkCount = 0;
|
||||||
char checkCountSMeter = 0;
|
char checkCountSMeter = 0;
|
||||||
|
|
||||||
|
UBitxRigState rigState;
|
||||||
|
UBitxRigState catState;
|
||||||
|
|
||||||
//execute interval : 0.25sec
|
//execute interval : 0.25sec
|
||||||
void idle_process()
|
void idle_process()
|
||||||
{
|
{
|
||||||
|
// KC4UPR 2021-02-05 added update process for Raduino-TeensyDSP coordination
|
||||||
|
// Note, need to not have to copy this every time...
|
||||||
|
rigState.vfo[0] = vfoA;
|
||||||
|
rigState.vfo[1] = vfoB;
|
||||||
|
doRaduinoToTeensy(&rigState);
|
||||||
|
|
||||||
//S-Meter Display
|
//S-Meter Display
|
||||||
if (((displayOption1 & 0x08) == 0x08 && (sdrModeOn == 0)) && (++checkCountSMeter > SMeterLatency))
|
if (((displayOption1 & 0x08) == 0x08 && (sdrModeOn == 0)) && (++checkCountSMeter > SMeterLatency))
|
||||||
{
|
{
|
||||||
|
|
|
@ -18,6 +18,8 @@ const PROGMEM uint8_t meters_bitmap[] = {
|
||||||
};
|
};
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "RigState.h"
|
||||||
|
|
||||||
//SWR GRAPH, DrawMeter and drawingMeter Logic function by VK2ETA
|
//SWR GRAPH, DrawMeter and drawingMeter Logic function by VK2ETA
|
||||||
|
|
||||||
#ifdef OPTION_SKINNYBARS //We want skninny bars with more text
|
#ifdef OPTION_SKINNYBARS //We want skninny bars with more text
|
||||||
|
@ -296,4 +298,27 @@ int GetI2CSmeterValue(int valueType)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//======================================================================
|
||||||
|
|
||||||
|
void doRaduinoToTeensy(UBitxRigState* r) {
|
||||||
|
uint8_t* ptr = (uint8_t*)r;
|
||||||
|
|
||||||
|
Wire.beginTransmission(I2CMETER_ADDR);
|
||||||
|
Wire.write(I2CMETER_RIGINF);
|
||||||
|
Wire.write(ptr, sizeof(UBitxRigState));
|
||||||
|
Wire.endTransmission();
|
||||||
|
|
||||||
|
Wire.requestFrom(I2CMETER_ADDR, sizeof(UBitxRigState));
|
||||||
|
|
||||||
|
UBitxRigState tmp;
|
||||||
|
|
||||||
|
int len = 0;
|
||||||
|
ptr = (uint8_t*)&tmp;
|
||||||
|
|
||||||
|
while (Wire.available() > 0) {
|
||||||
|
uint8_t b = Wire.read();
|
||||||
|
if (len < sizeof(UBitxRigState)) {
|
||||||
|
ptr[len++] = b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@ EELAYER 30 0
|
||||||
EELAYER END
|
EELAYER END
|
||||||
$Descr USLetter 11000 8500
|
$Descr USLetter 11000 8500
|
||||||
encoding utf-8
|
encoding utf-8
|
||||||
Sheet 1 1
|
Sheet 1 2
|
||||||
Title "uBitx V5 I/O Board"
|
Title "uBitx V5 I/O Board"
|
||||||
Date ""
|
Date ""
|
||||||
Rev ""
|
Rev ""
|
||||||
|
@ -1102,4 +1102,10 @@ Text Notes 7750 3900 0 118 ~ 0
|
||||||
RX Audio Output
|
RX Audio Output
|
||||||
Text Notes 10200 1800 2 50 Italic 0
|
Text Notes 10200 1800 2 50 Italic 0
|
||||||
Unused op-amp section
|
Unused op-amp section
|
||||||
|
$Sheet
|
||||||
|
S 9400 4500 500 400
|
||||||
|
U 607D96BA
|
||||||
|
F0 "I/O Board Wiring" 50
|
||||||
|
F1 "IO_Board_Wiring.sch" 50
|
||||||
|
$EndSheet
|
||||||
$EndSCHEMATC
|
$EndSCHEMATC
|
||||||
|
|
|
@ -1100,4 +1100,6 @@ Text Notes 4900 1550 0 59 Italic 0
|
||||||
Spare 2 (pin 31)\nS-Meter (pin 28)\nSupply Voltage (pin 21)\nREV PWR (pin 20)\nFWD PWR (pin 26)\nSpare 1 (pin 27)
|
Spare 2 (pin 31)\nS-Meter (pin 28)\nSupply Voltage (pin 21)\nREV PWR (pin 20)\nFWD PWR (pin 26)\nSpare 1 (pin 27)
|
||||||
Text Notes 7750 3900 0 118 ~ 0
|
Text Notes 7750 3900 0 118 ~ 0
|
||||||
RX Audio Output
|
RX Audio Output
|
||||||
|
Text Notes 10200 1800 2 50 Italic 0
|
||||||
|
Unused op-amp section
|
||||||
$EndSCHEMATC
|
$EndSCHEMATC
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
EESchema Schematic File Version 4
|
||||||
|
EELAYER 30 0
|
||||||
|
EELAYER END
|
||||||
|
$Descr A4 11693 8268
|
||||||
|
encoding utf-8
|
||||||
|
Sheet 2 2
|
||||||
|
Title ""
|
||||||
|
Date ""
|
||||||
|
Rev ""
|
||||||
|
Comp ""
|
||||||
|
Comment1 ""
|
||||||
|
Comment2 ""
|
||||||
|
Comment3 ""
|
||||||
|
Comment4 ""
|
||||||
|
$EndDescr
|
||||||
|
$EndSCHEMATC
|
|
@ -0,0 +1,76 @@
|
||||||
|
#ifndef __RigState_h__
|
||||||
|
#define __RigState_h__
|
||||||
|
|
||||||
|
#define UBITX_VFOA_UPDATE 0x01
|
||||||
|
#define UBITX_VFOB_UPDATE 0x02
|
||||||
|
#define UBITX_RIT_UPDATE 0x04
|
||||||
|
#define UBITX_XIT_UPDATE 0x08
|
||||||
|
#define UBITX_FLAGS_UPDATE 0x10
|
||||||
|
|
||||||
|
#define UBITX_VFOB_FLAG 0x01
|
||||||
|
#define UBITX_SPLIT_FLAG 0x02
|
||||||
|
#define UBITX_RIT_FLAG 0x04
|
||||||
|
#define UBITX_XIT_FLAG 0x08
|
||||||
|
#define UBITX_CW_FLAG 0x10
|
||||||
|
#define UBITX_USB_FLAG 0x20
|
||||||
|
#define UBITX_TX_FLAG 0x40
|
||||||
|
|
||||||
|
struct UBitxRigState {
|
||||||
|
uint8_t header = 0;
|
||||||
|
uint32_t vfo[2];
|
||||||
|
uint16_t rit;
|
||||||
|
uint16_t xit;
|
||||||
|
uint8_t flags = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
class UBitxRig {
|
||||||
|
public:
|
||||||
|
inline int freqA() const { return state.vfo[0]; }
|
||||||
|
inline int freqB() const { return state.vfo[1]; }
|
||||||
|
inline int freqRIT() const { return state.rit; }
|
||||||
|
inline int freqXIT() const { return state.xit; }
|
||||||
|
|
||||||
|
inline char vfo() const { return (state.flags & UBITX_VFOB_FLAG) == UBITX_VFOB_FLAG; }
|
||||||
|
inline char isSplit() const { return (state.flags & UBITX_SPLIT_FLAG) == UBITX_SPLIT_FLAG; }
|
||||||
|
inline char isRIT() const { return (state.flags & UBITX_RIT_FLAG) == UBITX_RIT_FLAG; }
|
||||||
|
inline char isXIT() const { return (state.flags & UBITX_XIT_FLAG) == UBITX_XIT_FLAG; }
|
||||||
|
inline char isCW() const { return (state.flags & UBITX_CW_FLAG) == UBITX_CW_FLAG; }
|
||||||
|
inline char isLSB() const { return (state.flags & UBITX_USB_FLAG) != UBITX_USB_FLAG; }
|
||||||
|
inline char isUSB() const { return (state.flags & UBITX_USB_FLAG) == UBITX_USB_FLAG; }
|
||||||
|
|
||||||
|
char* packDelta() {
|
||||||
|
buflen = 0;
|
||||||
|
|
||||||
|
// first byte: what fields have changed
|
||||||
|
buf[buflen++] = uint8_t(state.dirty);
|
||||||
|
|
||||||
|
// next (if req'd): VFO A frequency
|
||||||
|
if (state.dirty & UBITX_VFOA_UPDATE) {
|
||||||
|
packInt(state.vfo[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
// next (if req'd): VFO B frequency
|
||||||
|
if (state.dirty & UBITX_VFOB_UPDATE) {
|
||||||
|
packInt(state.vfo[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
inline void packByte(uint8_t b) { buf[buflen++] = uint8_t(state.dirty);
|
||||||
|
|
||||||
|
inline void packInt(int i) {
|
||||||
|
int tmp = i;
|
||||||
|
for (int j = 0; j < 32; j+=8) {
|
||||||
|
tmp = tmp >> j;
|
||||||
|
buf[buflen++] = uint8_t(tmp & 0x000000FF);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UBitxRigState state;
|
||||||
|
uint8_t buf[sizeof(uint8_t) + sizeof(UBitxRigState)];
|
||||||
|
int buflen = 0;
|
||||||
|
};
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif
|
|
@ -11,6 +11,7 @@ KD8CEC, Ian Lee
|
||||||
#include "Debug.h"
|
#include "Debug.h"
|
||||||
#include "DSP.h"
|
#include "DSP.h"
|
||||||
#include "Nextion.h"
|
#include "Nextion.h"
|
||||||
|
#include "RigState.h"
|
||||||
#include "Sensors.h"
|
#include "Sensors.h"
|
||||||
#include "TR.h"
|
#include "TR.h"
|
||||||
|
|
||||||
|
@ -63,3 +64,9 @@ extern int magnitudelimit_low;
|
||||||
//SWR
|
//SWR
|
||||||
#define I2CMETER_CALCR 0x55 //Calculated SWR Meter
|
#define I2CMETER_CALCR 0x55 //Calculated SWR Meter
|
||||||
#define I2CMETER_UNCALCR 0x54 //Uncalculated SWR Meter
|
#define I2CMETER_UNCALCR 0x54 //Uncalculated SWR Meter
|
||||||
|
|
||||||
|
// Raduino provides updated data to TeensyDSP
|
||||||
|
#define I2CMETER_RIGINF 0x50
|
||||||
|
|
||||||
|
// Raduino requests any CAT updates from TeensyDSP
|
||||||
|
#define I2CMETER_REQCAT 0x51
|
||||||
|
|
|
@ -47,6 +47,11 @@ bool isTX = false;
|
||||||
|
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
|
|
||||||
|
UBitxRigState catState;
|
||||||
|
UBitxRigState rigState;
|
||||||
|
|
||||||
|
/**********************************************************************/
|
||||||
|
|
||||||
void responseConfig()
|
void responseConfig()
|
||||||
{
|
{
|
||||||
if (responseCommand == 2)
|
if (responseCommand == 2)
|
||||||
|
@ -371,16 +376,30 @@ void setup()
|
||||||
Number of bytes received--not used in this procedure.
|
Number of bytes received--not used in this procedure.
|
||||||
*/
|
*/
|
||||||
void i2cReceiveEvent(size_t numBytes)
|
void i2cReceiveEvent(size_t numBytes)
|
||||||
{
|
{
|
||||||
int readCommand = 0;
|
int readCommand = 0;
|
||||||
|
|
||||||
while (Wire1.available() > 0) // for Last command
|
while (Wire1.available() > 0) {
|
||||||
{
|
|
||||||
readCommand = Wire1.read();
|
readCommand = Wire1.read();
|
||||||
// KC4UPR: Note that this looks to be only reading the last command, i.e.
|
if (readCommand == I2CMETER_RIGINF) {
|
||||||
// if multiple commands have been queued up, only the last will get executed.
|
size_t len = 0;
|
||||||
|
uint8_t* ptr = (uint8_t*)&rigState;
|
||||||
|
while (Wire.available() > 0) {
|
||||||
|
uint8_t b = Wire.read();
|
||||||
|
if (len < sizeof(UBitxRigState)) {
|
||||||
|
ptr[len++] = b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// while (Wire1.available() > 0) // for Last command
|
||||||
|
// {
|
||||||
|
// readCommand = Wire1.read();
|
||||||
|
// // KC4UPR: Note that this looks to be only reading the last command, i.e.
|
||||||
|
// // if multiple commands have been queued up, only the last will get executed.
|
||||||
|
// }
|
||||||
|
|
||||||
if (0x50 <= readCommand && readCommand <= 0x59)
|
if (0x50 <= readCommand && readCommand <= 0x59)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
@ -434,6 +453,16 @@ void i2cRequestEvent(void)
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case I2CMETER_RIGINF:
|
||||||
|
// Receive current rig state; transmit any CAT updates, if required.
|
||||||
|
Wire1.write(catState.header); // temporary - just writing a single, null byte
|
||||||
|
break;
|
||||||
|
|
||||||
|
case I2CMETER_REQCAT:
|
||||||
|
// Provide latest CAT updates, if any.
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue