RAN OUT OF REPLIES BECAUSE YOU ARE FAILING TO UNDERSTAND MY QUESTION
TRIED TO RECLARIFY IN THIS POST
I am writing a sketch for an rf noise generator that runs a long 20sec while loop generating rf noise. I have an interrupt button for changing rf values which sets the while loop false when editing values for immediate response to the display. After editing values has timed out it will continue generating rf noise with the updated values.
My problem is finding a way to check if the while loop is still true after returning from ISR before continuing, or to return from the ISR to a place outside of the while loop it was interrupted from. Currently when I press the button and fire the ISR there is a large delay after it runs the ISR for it to exit the 20sec while loop it returned too since it has to finish the loop before it rechecks if its true.
POSTING REPLIES HERE:
txNoise is already a boolean triggered by the press() ISR function. I think the problem is that when it finishes the interrupt function and returns to the while loop, it finishes the rest of the code inside the while loop before looping and testing if the while condition is still true. You seem to understand my issue better than the others.
Again to clarify im looking for a way to either recheck if a while loop is still true when returning from an interrupt function, or a way to return from an interrupt function in another place in the code (like "goto" but global)
If this is not possible maybe someone could suggest a better way to structure the code and achieve the same result
#include "heltec.h"
#define BAND 905E6
//SOFT VALUES
int MasterDelay = 100; //Menu Select delay for menuCounter & pauseCounter
int pCdelay = 20; //pauseCounter delay before returning to TX Noise
int mCdelay = 10; //menuCounter delay before switching menu screens
int debugDelay = 3;
int dbSet = 20; //TX Strength starting value (0-20)
int sfSet = 10; //Spread Factor starting value (0-10)
int freqSet = 905; //Frequency starting value (900-920)
//HARD VALUES
bool txNoise = true; //TX Noise or Menu Select operator
int button; //digitalRead button
int pauseCounter = 0; //delay counter before returning to TX Noise
int menuCounter = 0; //delay counter between switching menu screens
int editToggle = 0; //Menu Edit selection
int debug = 1;
typedef void (*buttonPress)(void);
void setup() {
Heltec.begin(true /*DisplayEnable Enable*/, true /*Heltec.LoRa Disable*/, true /*Serial Enable*/, true /*PABOOST Enable*/, BAND /*long BAND*/);
Heltec.display->clear();
digitalWrite(25, HIGH);
writeScreen();
Heltec.display->display();
pinMode(0, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(0), Press, FALLING);
}
buttonPress BUTTONPRESS[] = {dbAdj, sfAdj, freqAdj};
void Press(){
txNoise = false;
pauseCounter = 0;
digitalWrite(25, LOW);
BUTTONPRESS[editToggle]();
}
void dbAdj() {
dbSet = dbSet + (debug);
if(dbSet > 20){
dbSet = 0;
}
else if(dbSet == -1){
dbSet = 20;
}
}
void sfAdj() {
sfSet = sfSet + (debug);
if(sfSet > 10){
sfSet = 0;
}
else if(sfSet == -1){
sfSet = 10;
}
}
void freqAdj() {
freqSet = freqSet + (debug);
if(freqSet > 920){
freqSet = 900;
}
else if(freqSet == 899){
freqSet = 920;
}
}
void writeScreen(){
String DBorSFtext[] = {("TX Strength ") + String (dbSet) + ("db"), ("Spread Factor ") + String (sfSet), ("Spread Factor ") + String (sfSet)};
Heltec.display->clear();
Heltec.display->setTextAlignment(TEXT_ALIGN_LEFT);
Heltec.display->setFont(ArialMT_Plain_24);
if(editToggle == 2){
Heltec.display->drawString(89, 37, "<");
}
else if(editToggle == 1){
if(sfSet < 10){
Heltec.display->drawString(103, 36, "^");
}
else{
Heltec.display->drawString(108, 36, "^");
}
}
else{
if(dbSet < 10){
Heltec.display->drawString(88, 36, "^");
}
else{
Heltec.display->drawString(92, 36, "^");
}
}
Heltec.display->drawString(0, 36, String (freqSet) + "mhz");
Heltec.display->setFont(ArialMT_Plain_16);
Heltec.display->drawString(0, 20, (DBorSFtext[editToggle]));
Heltec.display->drawString(18, 0, "SNR Jammer");
}
void loop() {
while(txNoise){
LoRa.beginPacket();
LoRa.print("TEST");
delay(20000); //this delay simulates the duration of the final packet size I will use
LoRa.endPacket();
}
if(!txNoise){
++pauseCounter;
button = digitalRead(0);
if(button == LOW){
if(pauseCounter == debugDelay){
debug = -1;
BUTTONPRESS[editToggle]();
debug = 1;
}
++menuCounter;
}
else if(pauseCounter > pCdelay){
//initialize TX Noise parameters
LoRa.setTxPower(dbSet, RF_PACONFIG_PASELECT_PABOOST);
LoRa.setSpreadingFactor(sfSet);
txNoise = true;
digitalWrite(25, HIGH);
}
else{
menuCounter = 0;
}
if(menuCounter > mCdelay){
pauseCounter = (debugDelay + 1);
++editToggle;
menuCounter = 0;
if(editToggle > 2){
editToggle = 0;
}
}
writeScreen();
Heltec.display->display();
delay(MasterDelay);
}
}