Jasmine Karlsson
/
train_rail
New project
Track.cpp@31:9d973398554f, 2018-06-28 (annotated)
- Committer:
- jasminealice
- Date:
- Thu Jun 28 15:08:41 2018 +0000
- Revision:
- 31:9d973398554f
- Parent:
- 30:63a8a5cefc6b
Fiiinal!!
Who changed what in which revision?
User | Revision | Line number | New 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 | 20:32ba0a5f2d02 | 16 | void Track::DCC_send_command(unsigned int address, unsigned int inst, unsigned int repeat_count) |
jasminealice | 20:32ba0a5f2d02 | 17 | { |
jasminealice | 20:32ba0a5f2d02 | 18 | unsigned __int64 command = 0x0000000000000000; // __int64 is the 64-bit integer type |
jasminealice | 20:32ba0a5f2d02 | 19 | unsigned __int64 temp_command = 0x0000000000000000; |
jasminealice | 20:32ba0a5f2d02 | 20 | unsigned __int64 prefix = 0x3FFF; // 14 "1" bits needed at start |
jasminealice | 20:32ba0a5f2d02 | 21 | unsigned int error = 0x00; //error byte |
jasminealice | 20:32ba0a5f2d02 | 22 | //calculate error detection byte with xor |
jasminealice | 20:32ba0a5f2d02 | 23 | error = address ^ inst; |
jasminealice | 20:32ba0a5f2d02 | 24 | //combine packet bits in basic DCC format |
jasminealice | 20:32ba0a5f2d02 | 25 | command = (prefix<<28)|(address<<19)|(inst<<10)|((error)<<1)|0x01; |
jasminealice | 20:32ba0a5f2d02 | 26 | //printf("\n\r %llx \n\r",command); |
jasminealice | 20:32ba0a5f2d02 | 27 | int i=0; |
jasminealice | 20:32ba0a5f2d02 | 28 | //repeat DCC command lots of times |
jasminealice | 20:32ba0a5f2d02 | 29 | while(i < repeat_count) { |
jasminealice | 20:32ba0a5f2d02 | 30 | temp_command = command; |
jasminealice | 20:32ba0a5f2d02 | 31 | //loops through packet bits encoding and sending out digital pulses for a DCC command |
jasminealice | 20:32ba0a5f2d02 | 32 | for (int j=0; j<64; j++) { |
jasminealice | 20:32ba0a5f2d02 | 33 | if((temp_command&0x8000000000000000)==0) { //test packet bit |
jasminealice | 20:32ba0a5f2d02 | 34 | //send data for a "0" bit |
jasminealice | 20:32ba0a5f2d02 | 35 | trackpin=0; |
jasminealice | 20:32ba0a5f2d02 | 36 | wait_us(100); |
jasminealice | 20:32ba0a5f2d02 | 37 | trackpin=1; |
jasminealice | 20:32ba0a5f2d02 | 38 | wait_us(100); |
jasminealice | 20:32ba0a5f2d02 | 39 | } else { |
jasminealice | 20:32ba0a5f2d02 | 40 | //send data for a "1"bit |
jasminealice | 20:32ba0a5f2d02 | 41 | trackpin=0; |
jasminealice | 20:32ba0a5f2d02 | 42 | wait_us(58); |
jasminealice | 20:32ba0a5f2d02 | 43 | trackpin=1; |
jasminealice | 20:32ba0a5f2d02 | 44 | wait_us(58); |
jasminealice | 20:32ba0a5f2d02 | 45 | } |
jasminealice | 20:32ba0a5f2d02 | 46 | // next bit in packet |
jasminealice | 20:32ba0a5f2d02 | 47 | temp_command = temp_command<<1; |
jasminealice | 20:32ba0a5f2d02 | 48 | } |
jasminealice | 20:32ba0a5f2d02 | 49 | i++; |
jasminealice | 20:32ba0a5f2d02 | 50 | } |
jasminealice | 20:32ba0a5f2d02 | 51 | } |