Fiona Lin / Mbed OS cap_sense

dis_exp.cpp

Committer:
fionalin
Date:
2022-06-28
Revision:
0:4e3ad938564e
Child:
2:d9745be6c253

File content as of revision 0:4e3ad938564e:

#include <mbed.h>
#include "dis_exp.h"
#include "capsense.h"
#include "stepper.h"

DiscreteExperiment::DiscreteExperiment(StepperMotor& motor, CapSense& capsense, 
                                       int32_t n_measure, uint32_t t_measure_us, 
                                       int32_t delta_steps, int32_t max_steps)
    : motor(motor), capsense(capsense), n_measure(n_measure),
      t_measure_us(t_measure_us), delta_steps(delta_steps), 
      max_steps(max_steps), steps_taken(0) {}
    
void DiscreteExperiment::proceed() {
    
    bool measured = false;

    switch (state) {
        case State::IDLE:
            break;
        case State::DONE:
            break;
        case State::MOVING:
            if (move_counter != 0 && steps_taken < max_steps) {
                if (move_counter < 0) {
                    printf("[bug] Oh shit....\n");
                motor.step_positive();
                move_counter--;
                steps_taken++;
            } else {
                state = MEASURING;
                measu_counter = n_measure;
            }
            break;
        case State::MEASURING:
            if (measu_counter != 0) {
                if (measu_counter < 0) {
                    printf("[bug] Oh shit....\n");
                }
                while (!measured) {
                    measured = capsense.try_measure();
                }
                data.push_back({steps_taken, capsense.read_measurement()});
                measu_counter--;
            } else {
                state = MOVING;
                move_counter = delta_steps;
            }
            break;
    }
    }
            
}


bool DiscreteExperiment::is_done() {
    return state == DONE;
}

std::vector<std::tuple<int32_t, long>>& DiscreteExperiment::report() {
    return data;
}

void DiscreteExperiment::start() {
    state = MOVING;
    move_counter = delta_steps;
}

void DiscreteExperiment::reset() {
    state = IDLE;
}