Pulse consistency test using wait_us in a thread

main.cpp

Committer:
punkisnail
Date:
2019-03-30
Revision:
0:18409537564c
Child:
1:4dec185d33e9

File content as of revision 0:18409537564c:

/* mbed Microcontroller Library
 * Copyright (c) 2018 ARM Limited
 * SPDX-License-Identifier: Apache-2.0
 */

#include <mbed.h>
#include "SoftPWM.h"

#define DUTY_CYCLE 0.55f

#define MAX_INTENSITY 70

SoftPWM LEDR(p2);
SoftPWM LEDG(p4);
SoftPWM LEDB(p3);

DigitalOut VEN_3V3B(p25);

DigitalOut BOOST_EN(p14);
PwmOut BOOST_PWM(p16);

DigitalOut HB_CH1(p6);
DigitalOut HB_CH2(p7);

InterruptIn SW_ONOFF(p15);
InterruptIn SW_MODE(p17);
InterruptIn SW_PLUS(p13);
InterruptIn SW_MINUS(p19);

Ticker stimTicker;

volatile bool flip_power = false;
volatile bool low_power = false;

int intensity = 0;

volatile bool stim_mode = false;
volatile bool stim_active = false;
volatile bool stim_progress = true;
short stim_count = 0;

void flip_ONOFF() {
    flip_power = true;
}

void flip_MODE() {
  if (!low_power && !stim_mode) {
    stim_mode = true;
  }
}

void flip_PLUS() {
    if (!low_power && !stim_mode) {
        if (intensity < MAX_INTENSITY) intensity++;        
    }
}

void flip_MINUS() {
    if (!low_power && !stim_mode) {
        if (intensity > 0) intensity--;    
    }    
}

void stimProgress() {
    stim_progress = true;
}

void stimulate() {
    // DAC = intensity
    HB_CH1 = 1;
    HB_CH2 = 0;
    
    wait_us(100);
    
    HB_CH1 = 0;
    HB_CH2 = 1;
    
    wait_us(100);
    
    HB_CH1 = 0;
    HB_CH2 = 0;
    // DAC = 0     
}

void startStimProcess() {
    stim_active = true;
    stim_count = 0;
    BOOST_EN = 1;
    BOOST_PWM.write(DUTY_CYCLE);
    stim_progress = false;
    stimTicker.attach(&stimProgress, 1);    
}

void stopStimProcess() {
    if (!stim_mode) return;
    
    stimTicker.detach();
    
    stim_count = 0;
    stim_active = false;
    stim_mode = false;
    stim_progress = false;
    
    HB_CH1 = 0;
    HB_CH2 = 0;
    
    BOOST_EN = 0;
    BOOST_PWM.write(0);
    
    // DAC = 0                     
}

int main()
{
    SW_ONOFF.mode(PullUp);
    SW_MODE.mode(PullUp);
    SW_PLUS.mode(PullUp);
    SW_MINUS.mode(PullUp);
    
    SW_ONOFF.fall(&flip_ONOFF);
    SW_MODE.fall(&flip_MODE);
    SW_PLUS.fall(&flip_PLUS);
    SW_MINUS.fall(&flip_MINUS);    
    
    HB_CH1 = 0;
    HB_CH2 = 0;
    BOOST_EN = 0;
    VEN_3V3B = 0;    

    BOOST_PWM.period_us(100);    
    
    LEDR.period_us(500);
    LEDG.period_us(500);
    LEDB.period_us(500);
        
    while(1)
    {
      if (!low_power) {
        SW_MODE.enable_irq();
        SW_PLUS.enable_irq();
        SW_MINUS.enable_irq();
        
        VEN_3V3B = 1;
        
        intensity = 0;
        
        while (!low_power) {
          if (stim_mode && !stim_active) {
            startStimProcess();
          }
          
          if (stim_active) {
              LEDR.write(0.5f);
              LEDG.write(0.25f);
              LEDB.write(0);
                  
              if (stim_progress) {
                  stim_progress = false;
                  
                  LEDR.write(0.5f);
                  LEDG.write(0);
                  LEDB.write(0.5f);
                  
                  stimulate();             
                  
                  if (++stim_count == 4) {
                    stopStimProcess();
                  }
                  
                  wait(0.2f);
              }
          }
          else {
            LEDR.write(0);
            LEDG.write(0.5f);
            LEDB.write(0);              
          }
          
          if (flip_power) {
            flip_power = false;
            wait(0.2f);
            low_power = true;
          }
          
          __WFE();
          __SEV();
          __WFE();             
        }
      }
      else {
        SW_ONOFF.disable_irq();
        SW_MODE.disable_irq();
        SW_PLUS.disable_irq();
        SW_MINUS.disable_irq();
        
        stopStimProcess();
        
        VEN_3V3B = 0;
        
        LEDR.write(0);
        LEDG.write(0);
        LEDB.write(0);
        
        wait(0.2f);
        
        SW_ONOFF.enable_irq();

        nrf_gpio_cfg_sense_input(15, NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW);
        NRF_POWER->SYSTEMOFF = 1;            
        
        if (flip_power) {
          flip_power = false;
          wait(0.2f);
          low_power = false;    
        }
      }
      
      __WFE();
      __SEV();
      __WFE();
    }
    
    return 0;
}