Remote inc coolant nozzle control program

Dependencies:   mbed reScale USBDevice

Dependents:   Nozzle_inputs Nozzle_display

main.cpp

Committer:
BETZtechnik
Date:
2019-10-06
Revision:
25:5c71b4d95638
Parent:
24:55fafbb82a37

File content as of revision 25:5c71b4d95638:

#include "mbed.h"

#include "reScale.h"

// DUAL NOZZLE VERSION 1.2/ 1.3 only!!

//Serial pc(USBTX, USBRX);

//InterruptIn aux1(P0_7, PullUp); // index pulse

DigitalIn aux1(P0_7);
DigitalIn aux2(P1_21);
DigitalIn cw(P1_24);
DigitalIn ccw(P2_7);
DigitalIn pulse(P2_15);
//InterruptIn pulse(P1_21);

int cwRequested = 0;
int ccwRequested = 0;

int pulseActive = 0;
int pulseFlag =1; // is pulse high or low. (off is high after the opto)
int pulseStart = 0;
int pulseCount = 0;
int lastPulse = 0; // for debounce
int pulseDebounce = 1; //ms for debounce pulse signal

int aux1State = 0;

int autoMode = 0; // setting for AUTO mode (X7a, Pulse etc.)
int aux2Mode =0; // aux 2 use, twitch wait, etc.
int twitchWaitFlag = 0; // was twitch wait enabled?
int waitFlag = 0;


DigitalOut dir(P0_15);
DigitalOut auxOut1(P0_8);

Serial display(P0_14, P0_13, 19200);  // RS 485  TX RX?
Serial inputs(P1_23,P0_20, 9600); //rs232 TX RX


int maxServo = 2500;
int minServo = 500;
reScale servo1Scale(90,-90,minServo,maxServo); //19850 is 1.0v from voltage divider at 10k.
reScale servo2Scale(90,-90,minServo,maxServo); //19850 is 1.0v from voltage divider at 10k.


PwmOut servo1(P2_2); //display board
PwmOut servo2(P2_19);

//char tens = '0';
//char ones = '1';

int Hundreds = 0;
int Tens = 0;
int Ones = 0;

int twitch = 0;
int twitchStart=0;
int twitchDirection=0;
int lastTwitchMove = 0;
int maxTwitch1 = 0;
int maxTwitch2 = 0;
int minTwitch1 = 0;
int minTwitch2 = 0;
int tReadMs = 5;
int twitchIncrement = 10;



int currentNozzle = 0;

int index = 0;               // for parsing serial

int n1Pos = 0;
int n2Pos = 0;

int lastN1Called = 0;  // store the last actual tool position sent from the display because twitch code can shift it.
int lastN2Called = 0;

int n1Dir = 0;
int n2Dir = 0;

int servo1Pos = 0;
int lastServo1Pos = 0;

int servo2Pos = 0;
int lastServo2Pos = 0;


//DigitalOut servo2(P2_2);

/*
void triggered()
{
    servo2 = 1;

    if (cw == 0){
        cwRequested = 1;
        }

        else if (ccw == 0){
            ccwRequested = 1;
            }

}

*/

Timer t;

/*
void count() {
    auxOut1 = 1;
}
*/


int main()
{

// pulse.fall(&count);

    cw.mode(PullUp);
    ccw.mode(PullUp);
    aux1.mode(PullUp);
    pulse.mode(PullUp);
    aux2.mode(PullUp);
//auxOut1 = 1;

    servo1.period(0.02);    // 2019-08-26
    servo2.period(0.02);    // 2019-08-26


    t.start();

    lastPulse = t.read_ms();

//aux1.rise(&triggered);



//servo2 = 0;



    uint8_t c = 0; // for 485 link

    while(1) {


        if (t.read()  > 1200) {
            t.reset();
            lastTwitchMove = t.read_ms();
            lastPulse = t.read_ms();
        }


//************************************  AUTO MODES **********************

        if (autoMode == 1) { // ATC pin monitoring mode
            if (aux1 == 0 && aux1State == 0) {

                if (cw == 1) {
//servo2 = 1;
                    dir= 1;
//wait(0.001);
                    display.printf("M");
                    wait(0.05);
                    display.printf("-");
                    wait(0.001);
                    dir=0;
                    aux1State = 1;
//wait(.001);
                }

                if (ccw == 1) {
                    dir= 1;
//wait(0.01);
                    display.printf("M");
                    wait(0.05);
                    display.printf("+");
                    wait(0.001);
                    dir=0;
                    aux1State = 1;
//wait(.001);
                }
            }

            if (aux1 == 1 && aux1State == 1) {
                aux1State = 0;
//wait(0.1);
            }
        } //end of if ATC pin monitoring


//********************** Pulse **********************************



        if (autoMode == 2) { // pulse mode
            if (pulse == 0 && pulseActive == 0 && pulseFlag == 1 && (t.read_ms() > (lastPulse + pulseDebounce))) {
                pulseStart = t.read_ms();
                lastPulse = t.read_ms();
                pulseActive = 1;
                pulseCount = 1;
                pulseFlag = 0; // pin is now low
//wait(0.01);
            }

            if (pulse == 1 && pulseActive == 1 && pulseFlag == 0 && (t.read_ms() > lastPulse + pulseDebounce)) {
                pulseFlag = 1;
                lastPulse = t.read_ms();
            }

            if (pulse == 0 && pulseActive == 1 && pulseFlag == 1 && (t.read_ms() > lastPulse + pulseDebounce)) {
                pulseCount = pulseCount + 1;
                pulseFlag =0;
                lastPulse = t.read_ms();
//wait(0.01);
            }

            if (pulseActive == 1 && (t.read_ms() > pulseStart + 1000)) {
                pulseCount = pulseCount + 100;

                dir=1;
                display.printf("T");
                wait(0.05);
                display.printf("%d", pulseCount);
                wait(0.001);
                dir=0;

                pulseCount = 0;
                pulseActive = 0;
                pulseFlag=1;
                lastPulse = t.read_ms();
                //wait(0.01);
            }
        } // end of if pulse mode



//********************** Display code NEW with W **********************************
//**********************STAGE 1

        while (display.readable()) {

            c = display.getc();

            if (c == 'N') {

                index = 1;

            }

            if (c == 'W') { // wiggle setting
                index = 5;
            }

            if (c == 'A') { // auto mode
                index = 8;
            }

            if (c == 'I') { // aux2 input mode
                index = 9;
            }

            if (c == 'D') { // nozzle direction
                c = display.getc();
                if (c == '1') { // N1
                    index = 6;
                }
                if (c == '2') { // N2
                    index = 7;
                }
            }




//**********************STAGE 2




            if (index == 5) {
                c = display.getc();
                if (c == '0') {
                    twitch = 0;
                    index = 0;
                }
                if (c == '1') {
                    twitch = 1;
                    index = 0;
                }
                if (c == '2') {
                    twitch = 2;
                    index = 0;
                }
                if (c == '3') {
                    twitch = 3;
                    index = 0;
                }
            }

//******************************


            if (index == 6) {
                c = display.getc();
                if (c == '0') {
                    n1Dir = 0;
                    index = 0;
                }
                if (c == '1') {
                    n1Dir = 1;
                    index = 0;
                }
            }

            if (index == 7) {
                c = display.getc();
                if (c == '0') {
                    n2Dir = 0;
                    index = 0;
                }
                if (c == '1') {
                    n2Dir = 1;
                    index = 0;
                }

            }

            if (index == 8) { // auto mode
                c = display.getc();
                if (c == '1') {
                    autoMode = 1; // X7a (x7 atc)
                    index = 0;
                }
                if (c == '2') {
                    autoMode = 2;  // Pulse
                    index = 0;
                }

            }
            
if (index == 9) { // aux2 mode
                c = display.getc();
                if (c == '0') {
                    aux2Mode = 0; // 0= off, 1 = twitch pause wait for coolant signal
                    index = 0;
                }
                if (c == '1') {
                    aux2Mode = 1;  // twitch pause
                    index = 0;
                }

            }            



//******************************



            if (index == 1) {       //Display is sending -90>+90 and adding 190 for N1 so would send 100 to 280 for -90 to +90
                c = display.getc();
                if (c == '1') {  // N1
                    currentNozzle = 1;
                    Hundreds = 0;
                    index = 3;

                }

                else if (c == '2') { //N2
                    currentNozzle = 1;
                    Hundreds = 1;
                    index = 3;
                }

                else  if (c == '3') { //N2     // Display adding 390 for N2 so 300 to 480 would be -90 to +90
                    currentNozzle = 2;
                    Hundreds = 0;
                    index = 3;
                }

                else   if (c == '4') { //N2
                    currentNozzle = 2;
                    Hundreds = 1;
                    index = 3;
                }


            }



            if (index == 3) {

                c = display.getc();

                if (c=='0') {
                    Tens = 0;
                    index = 4;

                }

                else if (c=='1') {
                    Tens = 1;
                    index = 4;

                }

                else if (c=='2') {
                    Tens = 2;
                    index = 4;

                }

                else if (c=='3') {
                    Tens = 3;
                    index = 4;

                }

                else if (c=='4') {
                    Tens = 4;
                    index = 4;
                }

                else if (c=='5') {
                    Tens = 5;
                    index = 4;
                }

                else if (c=='6') {
                    Tens = 6;
                    index = 4;
                }

                else if (c=='7') {
                    Tens = 7;
                    index = 4;
                }

                else if (c=='8') {
                    Tens = 8;
                    index = 4;
                }

                else if (c=='9') {
                    Tens = 9;
                    index = 4;
                }


            }

            if (index == 4) {

                c = display.getc();

                if (c=='0') {
                    Ones = 0;
                }

                else if (c=='1') {
                    Ones = 1;
                }

                else if (c=='2') {
                    Ones = 2;
                }

                else if (c=='3') {
                    Ones = 3;
                }

                else if (c=='4') {
                    Ones = 4;
                }

                else if (c=='5') {
                    Ones = 5;
                }

                else if (c=='6') {
                    Ones = 6;
                }

                else if (c=='7') {
                    Ones = 7;
                }

                else if (c=='8') {
                    Ones = 8;
                }

                else if (c=='9') {
                    Ones = 9;
                }



                if (currentNozzle == 1) {
                    n1Pos = (((Hundreds *100) + (Tens *10) + Ones) - 90);
                    twitchStart = 0; // trigger sweep from new angle
                    servo1Pos = servo1Scale.from(n1Pos);
                    lastN1Called = servo1Pos;
//servo1.pulsewidth_us(servo1Pos);
                    index=0;
                }

                if (currentNozzle == 2) {
                    n2Pos = (((Hundreds *100) + (Tens *10) + Ones) - 90);
                    twitchStart = 0; // trigger sweep from new angle
                    servo2Pos = servo2Scale.from(n2Pos);
                    lastN2Called = servo2Pos;
//servo1.pulsewidth_us(servo1Pos);
                    index=0;
                }


            }
        }



        if ((twitch == 0) || (twitch > 0 && aux2Mode == 1 && aux2 == 1)) {
            if (servo1Pos != lastServo1Pos) {
                twitchStart = 0;
                twitchDirection = 0;
                servo1Pos = servo1Scale.from(n1Pos);
                servo1.pulsewidth_us(servo1Pos);
                lastServo1Pos = servo1Pos;
            }

            if (servo2Pos != lastServo2Pos) {
                twitchStart = 0;
                twitchDirection = 0;
                servo2Pos = servo1Scale.from(n2Pos);
                servo2.pulsewidth_us(servo2Pos);
                lastServo2Pos = servo2Pos;
            }

        }

        if (twitch > 0 && aux2Mode != 1 || (twitch > 0 && aux2Mode == 1 && aux2 == 0)) {
            if (twitchStart == 0) {
                //tw.start();  // start timer for nozzle sweep
                //servo1Pos = servo1Scale.from(n1Pos);
                servo1.pulsewidth_us(servo1Pos);
                servo2.pulsewidth_us(servo2Pos);
                lastTwitchMove = t.read_ms(); // store time of last nozzle movement
                minTwitch1 = lastN1Called; // store original servo postion for bottom of sweep
                minTwitch2 = lastN2Called; // store original servo postion for bottom of sweep

                if(n1Dir == 0) {
                    if (twitch == 1) {
                        maxTwitch1 = lastN1Called - 100; // 11.11mS per degree of sweep, 55 = 5 degrees of sweep. This should be a viariable set on the display.
                    }
                    if (twitch == 2) {
                        maxTwitch1 = lastN1Called - 150;
                    }
                    if (twitch == 3) {
                        maxTwitch1 = lastN1Called - 200;
                    }
                }

                if(n1Dir == 1) {  // reverse
                    if (twitch == 1) {
                        maxTwitch1 = lastN1Called + 100; // 11.11mS per degree of sweep, 55 = 5 degrees of sweep. This should be a viariable set on the display.
                    }
                    if (twitch == 2) {
                        maxTwitch1 = lastN1Called + 150;
                    }
                    if (twitch == 3) {
                        maxTwitch1 = lastN1Called + 200;
                    }
                }

                if(n2Dir == 0) {
                    if (twitch == 1) {
                        maxTwitch2 = lastN2Called - 100; // 11.11mS per degree of sweep, 55 = 5 degrees of sweep. This should be a viariable set on the display.
                    }
                    if (twitch == 2) {
                        maxTwitch2 = lastN2Called - 150;
                    }
                    if (twitch == 3) {
                        maxTwitch2 = lastN2Called - 200;
                    }
                }

                if(n2Dir == 1) {  // reverse
                    if (twitch == 1) {
                        maxTwitch2 = lastN2Called + 100; // 11.11mS per degree of sweep, 55 = 5 degrees of sweep. This should be a viariable set on the display.
                    }
                    if (twitch == 2) {
                        maxTwitch2 = lastN2Called + 150;
                    }
                    if (twitch == 3) {
                        maxTwitch2 = lastN2Called + 200;
                    }
                }

                twitchStart = 1;

            }


            if ((twitchStart == 1) && (t.read_ms() > (lastTwitchMove + tReadMs))) {
                if (twitchDirection == 0) { //going up
                    if (n1Dir ==0) {
                        servo1Pos = servo1Pos - twitchIncrement; // add variable amount of uS to the servo signal
                    }
                    if (n2Dir == 0) {
                        servo2Pos = servo2Pos - twitchIncrement;
                    }

                    if (n1Dir ==1) {
                        servo1Pos = servo1Pos + twitchIncrement; // add variable amount of uS to the servo signal
                    }
                    if (n2Dir == 1) {
                        servo2Pos = servo2Pos + twitchIncrement;
                    }


                    if (n1Dir ==0 && servo1Pos < maxTwitch1 ) {
                        servo1Pos = maxTwitch1;
                        servo2Pos = maxTwitch2;
                        twitchDirection = 1; //reverse direction
                    }

                    //      if (n2Dir == 0 && servo2Pos < maxTwitch2) {
                    //         servo2Pos = maxTwitch2;
                    //         twitchDirection = 1; //reverse direction
                    //    }
                    if (n1Dir ==1 && servo1Pos > maxTwitch1) {
                        servo1Pos = maxTwitch1;
                        servo2Pos = maxTwitch2;
                        twitchDirection = 1; //reverse direction
                    }

                    //     if (n2Dir == 1 && servo2Pos > maxTwitch2) {
                    //        servo2Pos = maxTwitch2;
                    //       twitchDirection = 1; //reverse direction
                    //   }


                    lastTwitchMove = t.read_ms();
                }

                if (twitchDirection == 1) { // going down

                    if (n1Dir ==0) {
                        servo1Pos = servo1Pos + twitchIncrement; // add variable amount of uS to the servo signal
                    }
                    if (n2Dir == 0) {
                        servo2Pos = servo2Pos + twitchIncrement;
                    }

                    if (n1Dir ==1) {
                        servo1Pos = servo1Pos - twitchIncrement; // add variable amount of uS to the servo signal
                    }
                    if (n2Dir == 1) {
                        servo2Pos = servo2Pos - twitchIncrement;
                    }

                    /*
                        if (n1Dir == 0 && servo1Pos < minServo) {
                            servo1Pos = minServo;
                            twitchDirection = 0; //reverse direction
                        }
                        */
                    if (n1Dir == 0 && servo1Pos > (minTwitch1+50)) {
                        servo1Pos = minTwitch1;
                        servo2Pos = minTwitch2;
                        twitchDirection = 0; //reverse direction
                    }
                    if (n1Dir == 1 && servo1Pos < (minTwitch1 - 50)) {
                        servo1Pos = minTwitch1;
                        servo2Pos = minTwitch2;
                        twitchDirection = 0; //reverse direction
                    }
                    //       if (n2Dir == 0 && servo2Pos > (minTwitch2+0)) {
                    //       servo2Pos = minTwitch2;
                    //       twitchDirection = 0; //reverse direction
                    //   }
                    //       if (n2Dir == 1 && servo2Pos < minTwitch2) {
                    //       servo2Pos = minTwitch2;
                    //       twitchDirection = 0; //reverse direction
                    //   }

                    lastTwitchMove = t.read_ms();
                }

                if (servo1Pos != lastServo1Pos) {
                    servo1.pulsewidth_us(servo1Pos);
                    lastServo1Pos = servo1Pos;
                }

                if (servo2Pos != lastServo2Pos) {
                    servo2.pulsewidth_us(servo2Pos);
                    lastServo2Pos = servo2Pos;
                }


            }
        }
        
        if (twitch >0 && aux2Mode == 1 && aux2 == 1) {
            if (waitFlag == 0) {
                dir=1;
                display.printf("X");
                wait(0.05);
                display.printf("X");
                wait(0.001);
                dir=0;
                waitFlag =1;
                // wait (0.1);
            }
        }
        if ((twitch == 0) || (twitch >0 && aux2Mode == 1 && aux2 == 0)|| (twitch >0 && aux2Mode == 0)) {
            if (waitFlag == 1) {
                dir=1;
                display.printf("Y");
                wait(0.05);
                display.printf("Y");
                wait(0.001);
                dir=0;
                waitFlag =0;
                // wait (0.1);
            }
        }        


//********************************* Inputs serial *******************************


        while (inputs.readable()) {


            c = inputs.getc();

            if (c == 'T') {

                index = 1;
                // servo2=1;
            }


            if (index == 1) {
                c = inputs.getc();


                if (c=='0') {
                    Tens = 0;
                    // servo2=1;
                }

                else if (c=='1') {
                    Tens = 1;


                }

                else if (c=='2') {
                    Tens = 2;

                }

                else if (c=='3') {
                    Tens = 3;

                }

                else if (c=='4') {
                    Tens = 4;
                }

                else if (c=='5') {
                    Tens = 5;
                }

                else if (c=='6') {
                    Tens = 6;
                }

                else if (c=='7') {
                    Tens = 7;
                }

                else if (c=='8') {
                    Tens = 8;
                }

                else if (c=='9') {
                    Tens = 9;
                }

                else if (c=='0') {
                    Tens = 0;
                }
                index = 2;
            }


            if (index == 2) {
                c = inputs.getc();
                if (c=='0') {
                    Ones = 0;

                }

                else if (c=='1') {
                    Ones = 1;


                }

                else if (c=='2') {
                    Ones = 2;

                }

                else if (c=='3') {
                    Ones = 3;

                }

                else if (c=='4') {
                    Ones = 4;
                }

                else if (c=='5') {
                    Ones = 5;
                }

                else if (c=='6') {
                    Ones = 6;
                }

                else if (c=='7') {
                    Ones = 7;
                }

                else if (c=='8') {
                    Ones = 8;
                }

                else if (c=='9') {
                    Ones = 9;
                }

                else if (c=='0') {
                    Ones = 0;
                }
                int tempToolNo = (Tens*10)+100+Ones;
                dir=1;
                display.printf("T");
                wait(0.05);
                display.printf("%d", tempToolNo);
                wait(0.001);
                dir=0;
                index = 0;
                tempToolNo=0;

            }


        }


// *****************************************************************************



    }
}