Infrastructure/ToroidalMagneticFieldCircuit/Rack/Arduino/main.cpp

#include <Arduino.h>
#include <string.h>


//default delay and output trigger length

int length = 4000;
bool enabled = false;

int wholes = 0;
int remain =5000-8;


const byte inPin = 2;
const byte outPin = 13;

void send(){
  if (enabled){
    //and nwo for some dirty work
    //delaying microseconds doesnt work well forl longer times
    //so we will repeatedly wait for shorter times
    //sorry

    for(int i = 1; i<=wholes; i++)
      delayMicroseconds(15000);
    delayMicroseconds(remain);
    //digitalWrite was slow
    //digitalWrite(outPin, HIGH);
    PORTB = B100000;
    delayMicroseconds(length);

    //digitalWrite(outPin, LOW);
    PORTB = B000000;
  }
}

void setup() {
  pinMode(inPin, INPUT);
  pinMode(outPin, OUTPUT);



  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  Serial.println("Welcome to arduino trigger system for GOLEM");

  attachInterrupt(digitalPinToInterrupt(2), send, RISING);
}

int incomingByte = 0;

void loop() {

  if (Serial.available() > 0) {
             // read the incoming line:
             String incoming;
             incoming = Serial.readString();

              if (incoming.substring(0, 6) == "enable"){
                enabled = true;
                Serial.println("trigger enabled");
              }
             else if (incoming.substring(0, 7) == "disable"){
               enabled = false;
               Serial.println("trigger disabled");
              }
            else if (incoming.substring(0, 3) == "set"){
                String text = incoming.substring(4);
                int trig_delay = text.toInt();
                if (trig_delay<5){
                  Serial.println("minimal delay is 5us");
                  trig_delay=5;
                }
                Serial.print("setting delay time to: ");
                Serial.print(trig_delay);
                Serial.println("us");
                trig_delay=trig_delay-5;
                wholes = trig_delay/15000;
                remain = trig_delay%15000;
               }
            else if (incoming.substring(0,1) == "t"){
              if(enabled){
                Serial.println("TRIGGERED!");
                //send();
                PORTB = B100000;
                delayMicroseconds(length);

                //digitalWrite(outPin, LOW);
                PORTB = B000000;
              }

            }
             else{
               Serial.print("unknown command: ");
               Serial.println(incoming.substring(0, 5));
             }

     }

    //delay(500);
}