New project

Dependencies:   mbed TextLCD

Committer:
jasminealice
Date:
Tue Jun 12 15:02:44 2018 +0000
Revision:
21:31647d80614f
Parent:
20:32ba0a5f2d02
Child:
30:63a8a5cefc6b
Comments for logic

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jasminealice 20:32ba0a5f2d02 1 #include "Track.h"
jasminealice 20:32ba0a5f2d02 2
jasminealice 20:32ba0a5f2d02 3 Track::Track () : trackpin(p20), lcd(p22, p21, p23, p24, p25, p26), myled1(LED1)
jasminealice 20:32ba0a5f2d02 4 {
jasminealice 20:32ba0a5f2d02 5 //ctor
jasminealice 20:32ba0a5f2d02 6 address = 0;
jasminealice 20:32ba0a5f2d02 7 inst = 0;
jasminealice 20:32ba0a5f2d02 8 myled1 = 1;
jasminealice 20:32ba0a5f2d02 9 }
jasminealice 20:32ba0a5f2d02 10
jasminealice 20:32ba0a5f2d02 11 Track::~Track()
jasminealice 20:32ba0a5f2d02 12 {
jasminealice 20:32ba0a5f2d02 13 //dtor
jasminealice 20:32ba0a5f2d02 14 }
jasminealice 20:32ba0a5f2d02 15
jasminealice 21:31647d80614f 16
jasminealice 20:32ba0a5f2d02 17 void Track::DCC_send_command(int repeat_count)
jasminealice 20:32ba0a5f2d02 18 {
jasminealice 20:32ba0a5f2d02 19 unsigned __int64 command = 0x0000000000000000; // __int64 is the 64-bit integer type
jasminealice 20:32ba0a5f2d02 20 unsigned __int64 temp_command = 0x0000000000000000;
jasminealice 20:32ba0a5f2d02 21 unsigned __int64 prefix = 0x3FFF; // 14 "1" bits needed at start
jasminealice 20:32ba0a5f2d02 22 unsigned int error = 0x00; //error byte
jasminealice 20:32ba0a5f2d02 23 //calculate error detection byte with xor
jasminealice 20:32ba0a5f2d02 24 error = address ^ inst;
jasminealice 20:32ba0a5f2d02 25 //combine packet bits in basic DCC format
jasminealice 20:32ba0a5f2d02 26 command = (prefix<<28)|(address<<19)|(inst<<10)|((error)<<1)|0x01;
jasminealice 20:32ba0a5f2d02 27 //printf("\n\r %llx \n\r",command);
jasminealice 20:32ba0a5f2d02 28 int i=0;
jasminealice 20:32ba0a5f2d02 29 //repeat DCC command lots of times
jasminealice 20:32ba0a5f2d02 30 while(i < repeat_count) {
jasminealice 20:32ba0a5f2d02 31 temp_command = command;
jasminealice 20:32ba0a5f2d02 32 //loops through packet bits encoding and sending out digital pulses for a DCC command
jasminealice 20:32ba0a5f2d02 33 for (int j=0; j<64; j++) {
jasminealice 20:32ba0a5f2d02 34 if((temp_command&0x8000000000000000)==0) { //test packet bit
jasminealice 20:32ba0a5f2d02 35 //send data for a "0" bit
jasminealice 20:32ba0a5f2d02 36 trackpin=0;
jasminealice 20:32ba0a5f2d02 37 wait_us(100);
jasminealice 20:32ba0a5f2d02 38 trackpin=1;
jasminealice 20:32ba0a5f2d02 39 wait_us(100);
jasminealice 20:32ba0a5f2d02 40 } else {
jasminealice 20:32ba0a5f2d02 41 //send data for a "1"bit
jasminealice 20:32ba0a5f2d02 42 trackpin=0;
jasminealice 20:32ba0a5f2d02 43 wait_us(58);
jasminealice 20:32ba0a5f2d02 44 trackpin=1;
jasminealice 20:32ba0a5f2d02 45 wait_us(58);
jasminealice 20:32ba0a5f2d02 46 }
jasminealice 20:32ba0a5f2d02 47 // next bit in packet
jasminealice 20:32ba0a5f2d02 48 temp_command = temp_command<<1;
jasminealice 20:32ba0a5f2d02 49 }
jasminealice 20:32ba0a5f2d02 50 i++;
jasminealice 20:32ba0a5f2d02 51 }
jasminealice 20:32ba0a5f2d02 52 }
jasminealice 20:32ba0a5f2d02 53
jasminealice 20:32ba0a5f2d02 54 void Track::DCC_send_command(unsigned int address, unsigned int inst, unsigned int repeat_count)
jasminealice 20:32ba0a5f2d02 55 {
jasminealice 20:32ba0a5f2d02 56 unsigned __int64 command = 0x0000000000000000; // __int64 is the 64-bit integer type
jasminealice 20:32ba0a5f2d02 57 unsigned __int64 temp_command = 0x0000000000000000;
jasminealice 20:32ba0a5f2d02 58 unsigned __int64 prefix = 0x3FFF; // 14 "1" bits needed at start
jasminealice 20:32ba0a5f2d02 59 unsigned int error = 0x00; //error byte
jasminealice 20:32ba0a5f2d02 60 //calculate error detection byte with xor
jasminealice 20:32ba0a5f2d02 61 error = address ^ inst;
jasminealice 20:32ba0a5f2d02 62 //combine packet bits in basic DCC format
jasminealice 20:32ba0a5f2d02 63 command = (prefix<<28)|(address<<19)|(inst<<10)|((error)<<1)|0x01;
jasminealice 20:32ba0a5f2d02 64 //printf("\n\r %llx \n\r",command);
jasminealice 20:32ba0a5f2d02 65 int i=0;
jasminealice 20:32ba0a5f2d02 66 //repeat DCC command lots of times
jasminealice 20:32ba0a5f2d02 67 while(i < repeat_count) {
jasminealice 20:32ba0a5f2d02 68 temp_command = command;
jasminealice 20:32ba0a5f2d02 69 //loops through packet bits encoding and sending out digital pulses for a DCC command
jasminealice 20:32ba0a5f2d02 70 for (int j=0; j<64; j++) {
jasminealice 20:32ba0a5f2d02 71 if((temp_command&0x8000000000000000)==0) { //test packet bit
jasminealice 20:32ba0a5f2d02 72 //send data for a "0" bit
jasminealice 20:32ba0a5f2d02 73 trackpin=0;
jasminealice 20:32ba0a5f2d02 74 wait_us(100);
jasminealice 20:32ba0a5f2d02 75 trackpin=1;
jasminealice 20:32ba0a5f2d02 76 wait_us(100);
jasminealice 20:32ba0a5f2d02 77 } else {
jasminealice 20:32ba0a5f2d02 78 //send data for a "1"bit
jasminealice 20:32ba0a5f2d02 79 trackpin=0;
jasminealice 20:32ba0a5f2d02 80 wait_us(58);
jasminealice 20:32ba0a5f2d02 81 trackpin=1;
jasminealice 20:32ba0a5f2d02 82 wait_us(58);
jasminealice 20:32ba0a5f2d02 83 }
jasminealice 20:32ba0a5f2d02 84 // next bit in packet
jasminealice 20:32ba0a5f2d02 85 temp_command = temp_command<<1;
jasminealice 20:32ba0a5f2d02 86 }
jasminealice 20:32ba0a5f2d02 87 i++;
jasminealice 20:32ba0a5f2d02 88 }
jasminealice 20:32ba0a5f2d02 89 }