New project

Dependencies:   mbed TextLCD

main.cpp

Committer:
jasminealice
Date:
2018-06-08
Revision:
16:55c3c5727f14
Parent:
15:8d96f7a06103
Child:
17:b7b5f40cebff

File content as of revision 16:55c3c5727f14:

#include "mbed.h"
#include "TextLCD.h"
#include <string>
#include <iostream>
#include "mcp23017.h"
#include "train.h"

//Board 1

/*----------------------------------------------------------------------------
Pin definitions
*----------------------------------------------------------------------------*/
DigitalOut myled(LED1);
DigitalOut myled2(LED2);
DigitalOut myled3(LED3);
DigitalOut myled4(LED4);

TextLCD lcd(p22, p21, p23, p24, p25, p26); // lcd

//AnalogIn Ain(p20);          // pot. met.
DigitalOut Track(p20);      // train track

/* Train detectors d2, d21, d22 (trainstation) */
// detect_21(p17);
//DigitalIn detect_22(p16);
//DigitalIn detect_2(p15);

/* Switch Definitions */
DigitalIn sw1(p29);
DigitalIn sw2(p30);
DigitalIn sw3(p11);
DigitalIn sw4(p12);
//InterruptIn sw1(p5);
//InterruptIn inter0(p12);
//InterruptIn inter1(p13);

/*----------------------------------------------------------------------------
Train movement
*----------------------------------------------------------------------------*/

//move backwards/reverse
const unsigned int DCCinst_reverse = 0x48; //reverse speed

//speed dial forward
const unsigned int DCCinst_step2 = 0x72; //step 2
const unsigned int DCCinst_step4 = 0x73; //step 4
unsigned int DCCinst_step6 = 0x68; //step 6 1/4 speed
const unsigned int DCCinst_step13 = 0x78; //step 13 1/2 speed
const unsigned int DCCinst_step20 = 0x75; //step 20 3/4 speed
const unsigned int DCCinst_step28 = 0x7F; //step 28 Full speed

//stop 
const unsigned int DCCinst_stop = 0x40; //forward and stop 01100000

/* Functions definition */
void readVoltage();
bool readDetector();
bool readSwitch();
void DCC_send_command(unsigned int address, unsigned int inst, unsigned int repeat_count); //send command


/*----------------------------------------------------------------------------
Main
*----------------------------------------------------------------------------*/
int main() {
    /*sw1.rise(&testInterupt2);
    sw1.fall(&testInterupt);
    inter0.rise(&riseFunction);
    inter1.rise(&riseFunction);*/
    while(1){
        
        /* Train Definitions */
        unsigned int DCCaddress_darkRed = 0x01;
        //unsigned int DCCaddress_lightRed = 0x03;
        lcd.printf("Start the journey");
        wait(0.2);
        if(readSwitch()){
            lcd.cls();
            lcd.printf("Forward");
            DCC_send_command(DCCaddress_darkRed,DCCinst_step13,10); // forward half speed train address 3
        }else{
            lcd.cls();
            lcd.printf("Reverse");
            DCC_send_command(DCCaddress_darkRed,DCCinst_reverse,10); // forward half speed train address 3
        }
             
    
    }
}


/*----------------------------------------------------------------------------
Functions
*----------------------------------------------------------------------------*/

/*
void testInterupt(){
    lcd.cls();
    myled = 1;
    lcd.printf("In interupt function");
    lcd.printf("%d", sw1.read());
    myled4 = 0;
}

void testInterupt2(){
    lcd.cls();
    myled = 0;
    lcd.printf("In interupt2 function");
    lcd.printf("%d", sw1.read());
    myled4 = 1;
}

void riseFunction(){
    lcd.printf("In rise function");
    lcd.printf("%d", inter1.read());
}

void fallFunction(){
    lcd.printf("In fall function");
    lcd.printf("%d", inter1.read());    
}*/




bool readSwitch(){
    int val = sw1.read();
    lcd.printf("%d", val);
    if(val == 1)
    return true;
    else
    return false;
}

bool readDetector(){
    /*int val1 = detect_2.read();
    if(val1 == 1)
    {
        lcd.cls();
        lcd.printf("Detect 2: ");
        lcd.printf("%d", val1);
        return true;
    }
    
    int val2 = detect_21.read();
    if(val2 == 1)
    {
        lcd.cls();
        lcd.printf("Detect 21: ");
        lcd.printf("%d", val2);
        return true;
    }
    
    int val3 = detect_22.read();
    if(val3 == 1)
    {
        lcd.cls();
        lcd.printf("Detect 22: ");
        lcd.printf("%d", val3);
        return true;
    }*/
  //  return false;
}

void readVoltage(){
        /*float f = Ain.read(); //Read voltage value
        float Vin = f *3.3;
        lcd.printf("%.2f", Vin);
        wait(0.1);
        lcd.printf("\n");*/
}

void DCC_send_command(unsigned int address, unsigned int inst, unsigned int repeat_count)
{
    unsigned __int64 command = 0x0000000000000000; // __int64 is the 64-bit integer type
    unsigned __int64 temp_command = 0x0000000000000000;
    unsigned __int64 prefix = 0x3FFF; // 14 "1" bits needed at start
    unsigned int error = 0x00; //error byte
    //calculate error detection byte with xor
    error = address ^ inst;
    //combine packet bits in basic DCC format
    command = (prefix<<28)|(address<<19)|(inst<<10)|((error)<<1)|0x01;
    //printf("\n\r %llx \n\r",command);
    int i=0;
//repeat DCC command lots of times
    while(i < repeat_count) {
        temp_command = command;
//loops through packet bits encoding and sending out digital pulses for a DCC command
        for (int j=0; j<64; j++) {
            if((temp_command&0x8000000000000000)==0) { //test packet bit
                //send data for a "0" bit
                Track=0;
                wait_us(100);
                Track=1;
                wait_us(100);
            } else {
                //send data for a "1"bit
                Track=0;
                wait_us(58);
                Track=1;
                wait_us(58);
            }
            // next bit in packet
            temp_command = temp_command<<1;
        }
        i++;
    }
}