Getting Push Button Logic To Stick?

I'm trying to get a sensor to activate if a push button is clicked. And deactivate when a certain condition is met and reactivate when the push button is pressed again.

    #include <SPI.h> // Included for SFE_LSM9DS0 library
    #include <Wire.h>
    #include <SFE_LSM9DS0.h>
    
    #define LSM9DS0_XM  0x1D // Would be 0x1E if SDO_XM is LOW
    #define LSM9DS0_G   0x6B // Would be 0x6A if SDO_G is LOW
    // Create an instance of the LSM9DS0 library called `dof` the
    // parameters for this constructor are:
    // [SPI or I2C Mode declaration], [gyro I2C address], [xm I2C address]
    LSM9DS0 dof(MODE_I2C, LSM9DS0_G, LSM9DS0_XM);
    
    const byte INT1XM = 4; // INT1XM tells us when accel data is ready
    //const byte INT2XM = 8; // INT2XM tells us when mag data is ready
    //const byte DRDYG = 7;  // DRDYG tells us when gyro data is ready
    const int buttonPin = 15;     // the number of the pushbutton pin
    
    int buttonState = 0;
    
    
    double X;
    double Y;
    double Z;
    
    void setup(){
    
      pinMode(INT1XM, INPUT);
      pinMode(buttonPin, INPUT);
    
    
    
      Serial.begin(9600);
      Serial1.begin(9600); // Start serial at 115200 bps
      // Use the begin() function to initialize the LSM9DS0 library.
      // You can either call it with no parameters (the easy way):
    
      uint16_t status = dof.begin();
      // Or call it with declarations for sensor scales and data rates:  
      //uint16_t status = dof.begin(dof.G_SCALE_2000DPS, dof.A_SCALE_6G, dof.M_SCALE_2GS);
    
      // begin() returns a 16-bit value which includes both the gyro and
      // accelerometers WHO_AM_I response. You can check this to make sure
      // communication was successful.
      // Serial.println(status, HEX);
      setODR();
    }
    
    void loop(){
    
      buttonState = digitalRead(buttonPin); //Read push button logic.
      
     // Serial.println(buttonState);
    
      if (buttonState == 1) {   //if push button is pressed
    
        printAccel(); //print sensor data
        
      }
    
    }
    
    void printAccel()
    {
      // Only read from the accelerometer if the accel interrupts,
      // which means that new data is ready.
      if (digitalRead(INT1XM))
      {
        // Use the readAccel() function to get new data from the accel.
        // After calling this function, new values will be stored in
        // the ax, ay, and az variables.
        dof.readAccel();
    
        //Serial.print("A: ");
    
        // Using the calcAccel helper function, we can get the
        // accelerometer readings in g's.
        X=dof.calcAccel(dof.ax);
        Y=dof.calcAccel(dof.ay);
        Z=dof.calcAccel(dof.az);
    
        Serial.print(X);
        Serial.print(", ");
        Serial.print(Y);
        Serial.print(", ");
        Serial.println(Z); 
    
        // Serial1.println(Z);   
    
        fall(); //jump to check condition
    
      }
    }
    
    void setODR(){
    
      dof.setAccelODR(dof.A_ODR_25);
      dof.setAccelScale(dof.A_SCALE_16G);
    }
    
    void fall(){
    
      if(-0.08<X && X<0.08){
        if(-0.08<Y && Y<0.08){
          if(-0.08<Z && Z<0.08){
    
            Serial1.println("N");
            Serial.println("Fallen!");
    
            loop(); //if condition is met, jump to loop to wait for push button to be pressed again.
    
            }
          }
        }
      //else{
    
        printAccel(); //else continue printing sensor data
    
      //}
    }

However I am having some trouble getting it to work, above is what I have worked out thus far.

Maybe you can take some of the elements in here and put them in your sketch:

//push on push off
int inPin = 2;      // switch is connected to this pin
int outPin = 13;    // led is connected to this pin

byte reading;       // the current reading from the input pin
byte flag = LOW;    // if LOW the switch was pushed, if HIGH the switch was released
unsigned long time = 0;         // 
unsigned long debounce = 200UL; // the debounce time

void setup()
{
  pinMode(inPin, INPUT_PULLUP); //the N.O. switch is connected to GND
  pinMode(outPin, OUTPUT);
  digitalWrite(outPin, LOW);
  time = millis();
  flag = LOW; 

}  // END of setup()


void loop()
{
  reading = digitalRead(inPin);

  //have we pushed the switch
  if (reading == LOW && flag == HIGH && (millis() - time > debounce)) 
  {
    time = millis();  //get ready foer the next iteration
    //toggle the LED
    digitalWrite(outPin, !digitalRead(outPin));
    //show that the switch was pushed
    flag = LOW;
  }

  //have we let go of the switch
  if (reading == HIGH && flag == LOW && millis() - time > debounce)
  {
    time = millis();  //get ready foer the next iteration
    //show that the switch was let go
    flag = HIGH;
  }

}  // END of loop()

You can't call the function loop() from within your program - you will just generate circular code that crashes.

You need to redesign your program so that the loop() function controls everything else.

...R