Jasmine Karlsson
/
train_rail
New project
Track.cpp@21:31647d80614f, 2018-06-12 (annotated)
- 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?
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 | 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 | } |