Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: main.cpp
- Revision:
- 0:18409537564c
- Child:
- 1:290c2f078d43
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Sat Mar 30 06:37:35 2019 +0000
@@ -0,0 +1,224 @@
+/* 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;
+}