LoRa RF Noise Generator: ISR, goto, while, best solution?

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);
  }
}

Your while loop controlling code MUST include a test for stopping the while loop. Compound tests are always a valid way.

Is any part of your device radiating RF noise?

What loop? You didn't post any code.
https://forum.arduino.cc/t/how-to-get-the-best-out-of-this-forum/679966#code-problems

Here is the while loop.

  while(txNoise){
    LoRa.beginPacket();
    LoRa.setTxPower(dbSet, RF_PACONFIG_PASELECT_PABOOST);
    LoRa.print("TEST");
    LoRa.endPacket();
    delay(20000);       //this delay simulates the duration of the final packet size I will use
  }

my ISR triggers a function that: calls a function to increment values, set txNoise false, and a couple other things that arent important

#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]();
  //writeScreen();
  //Heltec.display->dispay();
  
}

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 ERROR1(){
  Heltec.display->clear();
  Heltec.display->drawString(30, 10, "ERROR");
  Heltec.display->display();
}


void ERROR2(){
  Heltec.display->clear();
  Heltec.display->drawString(30, 20, "ERROR");
  Heltec.display->display();
}


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 TXtest(){
    //tx noise script
    LoRa.beginPacket();
    LoRa.print("TESTTTST");
    ERROR1();
    //delay(200);
    ERROR2();
    delay(2000);
   // LoRa.endPacket();
  }
*/



void loop() {
  
  while(txNoise){
    //TXtest();
    LoRa.beginPacket();
    LoRa.setTxPower(20, RF_PACONFIG_PASELECT_PABOOST);
    //LoRa.setSpreadingFactor(sfSet);
    LoRa.print("TEST");
    LoRa.endPacket();
    delay(20000);       //this delay simulates the duration of the final packet size I will use
  }  */
 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
      //#define BAND (freqSet + "E6")
      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);

    
  }
}

it is a Heltec LoRa32 board (esp32 based)

So, you're spewing garbage in the 900MHz band? Why?

sorry for repost it deleted original for spam. Im trying to exit out of a while loop after returning from ISR without it finishing the while loop since it takes over 20sec to run through the while loop

My goal is to have the noise function as simple and as long of duration as possible, and the editing rf values portion to be more responsive (not waiting on a 20sec delay to finish the while loop before it realizes its false.

#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");
    LoRa.endPacket();
    delay(20000);       //this delay simulates the duration of the final packet size I will use
  }  */
 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);
  }
}

Okay, I'll ask again in this thread. Why are you spamming the 900MHz band as was implied in your other thread? Or if you aren't, what are you doing?

What's the question?
From the title, goto is never the answer. There is not a single concept in C++ that will ever need a goto statement.

testing a close loop rf system, adjustable attenuators and packet loss. (simulating tests at longers distances

Ok, fair. Nothing radiated? 'break' is the usual command to exit from a loop...

Sorry i may have skipped over the question when reposting lol. when i press my interrupt button to edit values there is a long delay for it to exit the while loop and continue to the main loop that updates values

Why do you have a button serviced by an interrupt? Or do you?

it is a Heltec LoRa32 board with a built in radio so yes there is a radiating element

Then what you are doing is likely illegal.

because the main function is to generate rf noise and when changing values i need it to stop and wait for a timeout to continue. i dont want it polling the button every loop plus the noise script takes 20sec to execute.

its not illegal its using unlicensed bands and under the tx power limits. i know what im doing rf wise

What board are you using? Does it support interrupts on GPIO 0 ?

Any variables used in an interrupt should be declared as volatile.

You can use a break statement to escape from while loop... but you need to get rid of that delay() statement first.

its a Heltec LoRa32 board and everything works on it i just want to fix the flow so there isnt a 20sec delay.

the delay in the while loop is necessary because the final packet it will send out takes 20sec. i want the percentage of time its transmitting as high as possible, thus a large packet with small delay to resend.

But when you get a button press you want to exit the while loop immediately? If so then you can't use delay... you need to use millis().