SSI OpComms 3 CM TX
Dependencies: mbed
Fork of Optical3cmTXnucleo by
main.cpp@8:b6b645caf4ef, 2015-11-15 (annotated)
- Committer:
- Aaditya Shidham
- Date:
- Sun Nov 15 18:51:38 2015 -0800
- Revision:
- 8:b6b645caf4ef
- Parent:
- 7:4fafb1b60eab
added second exp chsum
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
bhz | 7:4fafb1b60eab | 1 | #include "mbed.h" |
bhz | 7:4fafb1b60eab | 2 | #include <string> |
bhz | 7:4fafb1b60eab | 3 | using namespace std; |
tteisberg | 0:cb5d20585be4 | 4 | |
tteisberg | 0:cb5d20585be4 | 5 | DigitalOut tx(D15); |
tteisberg | 0:cb5d20585be4 | 6 | |
tteisberg | 0:cb5d20585be4 | 7 | Serial pc(USBTX, USBRX); // tx, rx |
tdiamandis | 1:a5e80a54e72f | 8 | const int PPM = 4; |
tdiamandis | 1:a5e80a54e72f | 9 | const int PACKET_LENGTH = 98; |
tdiamandis | 6:8eae544417af | 10 | unsigned int PULSE_LENGTH = 0; |
tteisberg | 0:cb5d20585be4 | 11 | |
tdiamandis | 1:a5e80a54e72f | 12 | //Function Prototypes |
tdiamandis | 1:a5e80a54e72f | 13 | void blink_packet(char* buffer, int len); |
tdiamandis | 1:a5e80a54e72f | 14 | void blink_char(char c); |
tdiamandis | 1:a5e80a54e72f | 15 | void blink(int data); |
tdiamandis | 1:a5e80a54e72f | 16 | |
tdiamandis | 1:a5e80a54e72f | 17 | |
tdiamandis | 1:a5e80a54e72f | 18 | /*Function: blink_packet: |
tdiamandis | 1:a5e80a54e72f | 19 | Preconditions: |
tdiamandis | 1:a5e80a54e72f | 20 | len is index of last filled character in buffer |
tdiamandis | 1:a5e80a54e72f | 21 | Postconditions: |
tdiamandis | 1:a5e80a54e72f | 22 | transmits the packet buffer |
tdiamandis | 1:a5e80a54e72f | 23 | */ |
tdiamandis | 1:a5e80a54e72f | 24 | void blink_packet(char* buffer, int len) |
tdiamandis | 1:a5e80a54e72f | 25 | { |
tdiamandis | 1:a5e80a54e72f | 26 | //Encodes and transmits each character |
tdiamandis | 1:a5e80a54e72f | 27 | for (int i=0; i < len; i++) { |
tdiamandis | 1:a5e80a54e72f | 28 | blink_char(buffer[i]); |
tteisberg | 0:cb5d20585be4 | 29 | } |
tdiamandis | 1:a5e80a54e72f | 30 | |
tdiamandis | 1:a5e80a54e72f | 31 | //Signifies end of packet |
tdiamandis | 1:a5e80a54e72f | 32 | tx = 1; |
tdiamandis | 5:4bf7b8f3fd58 | 33 | wait_us(PULSE_LENGTH*(PPM+1)); |
tdiamandis | 1:a5e80a54e72f | 34 | tx = 0; |
tdiamandis | 1:a5e80a54e72f | 35 | } |
tdiamandis | 1:a5e80a54e72f | 36 | |
tdiamandis | 1:a5e80a54e72f | 37 | |
tdiamandis | 1:a5e80a54e72f | 38 | /*Function: blink_char: |
tdiamandis | 1:a5e80a54e72f | 39 | Postconditions: |
tdiamandis | 1:a5e80a54e72f | 40 | transmits the char c via DPPM 4 |
tdiamandis | 1:a5e80a54e72f | 41 | */ |
tdiamandis | 1:a5e80a54e72f | 42 | void blink_char(char c) { |
tdiamandis | 1:a5e80a54e72f | 43 | printf("%d", c); |
tdiamandis | 1:a5e80a54e72f | 44 | printf("%c", '\r'); |
tdiamandis | 1:a5e80a54e72f | 45 | printf("%c", '\n'); |
tdiamandis | 1:a5e80a54e72f | 46 | for (int i=3; i>=0; i--) { |
tdiamandis | 1:a5e80a54e72f | 47 | blink((c & (3 << i*2)) >> i*2); |
tdiamandis | 1:a5e80a54e72f | 48 | } |
tteisberg | 0:cb5d20585be4 | 49 | } |
tteisberg | 0:cb5d20585be4 | 50 | |
tdiamandis | 1:a5e80a54e72f | 51 | |
tdiamandis | 1:a5e80a54e72f | 52 | /*Function: blink_packet: |
tdiamandis | 1:a5e80a54e72f | 53 | Preconditions: |
tdiamandis | 1:a5e80a54e72f | 54 | data < DPPM used |
tdiamandis | 1:a5e80a54e72f | 55 | Postconditions: |
tdiamandis | 1:a5e80a54e72f | 56 | pulses the light to transmit data |
tdiamandis | 1:a5e80a54e72f | 57 | */ |
tdiamandis | 1:a5e80a54e72f | 58 | void blink(int data) { |
tdiamandis | 1:a5e80a54e72f | 59 | printf("%d", data); |
tdiamandis | 1:a5e80a54e72f | 60 | printf("%c", '\r'); |
tdiamandis | 1:a5e80a54e72f | 61 | printf("%c", '\n'); |
tdiamandis | 1:a5e80a54e72f | 62 | //Time on = PULSE_LENGTH |
tdiamandis | 1:a5e80a54e72f | 63 | tx = 1; |
tdiamandis | 1:a5e80a54e72f | 64 | wait_us(PULSE_LENGTH); |
tdiamandis | 1:a5e80a54e72f | 65 | |
tdiamandis | 1:a5e80a54e72f | 66 | //Time off = PULSE_LENGTH*(data value) |
tdiamandis | 1:a5e80a54e72f | 67 | // For example, a 01 transmitted would have a difference between pulses of 2 PULSE_LENGTH |
tdiamandis | 1:a5e80a54e72f | 68 | tx = 0; |
tdiamandis | 2:eb6621f41f07 | 69 | wait_us(PULSE_LENGTH*(data+1)); |
tdiamandis | 1:a5e80a54e72f | 70 | tx = 1; |
tdiamandis | 1:a5e80a54e72f | 71 | } |
tdiamandis | 1:a5e80a54e72f | 72 | |
bhz | 7:4fafb1b60eab | 73 | char checksum(char* buffer, int len) |
bhz | 7:4fafb1b60eab | 74 | { |
bhz | 7:4fafb1b60eab | 75 | char sum = 0; |
bhz | 7:4fafb1b60eab | 76 | for(int i = 0; i < len; i++) sum ^= buffer[i]; |
bhz | 7:4fafb1b60eab | 77 | return sum; |
bhz | 7:4fafb1b60eab | 78 | } |
bhz | 7:4fafb1b60eab | 79 | |
Aaditya Shidham |
8:b6b645caf4ef | 80 | //http://stackoverflow.com/questions/8845178/c-programming-tcp-checksum |
Aaditya Shidham |
8:b6b645caf4ef | 81 | char checkSum(char *buffer, int size) |
Aaditya Shidham |
8:b6b645caf4ef | 82 | { |
Aaditya Shidham |
8:b6b645caf4ef | 83 | unsigned long cksum=0; |
Aaditya Shidham |
8:b6b645caf4ef | 84 | while(size) |
Aaditya Shidham |
8:b6b645caf4ef | 85 | { |
Aaditya Shidham |
8:b6b645caf4ef | 86 | cksum+=*buffer++; |
Aaditya Shidham |
8:b6b645caf4ef | 87 | size--; |
Aaditya Shidham |
8:b6b645caf4ef | 88 | } |
Aaditya Shidham |
8:b6b645caf4ef | 89 | |
Aaditya Shidham |
8:b6b645caf4ef | 90 | cksum = (cksum >> 16) + (cksum & 0xffff); |
Aaditya Shidham |
8:b6b645caf4ef | 91 | cksum += (cksum >>16); |
Aaditya Shidham |
8:b6b645caf4ef | 92 | return (char)(~cksum); |
Aaditya Shidham |
8:b6b645caf4ef | 93 | } |
Aaditya Shidham |
8:b6b645caf4ef | 94 | |
tteisberg | 0:cb5d20585be4 | 95 | int main() |
tteisberg | 0:cb5d20585be4 | 96 | { |
tdiamandis | 1:a5e80a54e72f | 97 | pc.printf("3 CM Link Board - Transmit\r\n"); |
tdiamandis | 4:024257aaea1e | 98 | pc.printf("Enter pulse length in microseconds (10e-6), enter for 1000\r\n"); |
tdiamandis | 4:024257aaea1e | 99 | while(1) { |
tdiamandis | 4:024257aaea1e | 100 | char d = pc.getc(); |
tdiamandis | 4:024257aaea1e | 101 | if(d != '\n') { |
tdiamandis | 4:024257aaea1e | 102 | PULSE_LENGTH = PULSE_LENGTH*10 + (d-'0'); |
tdiamandis | 4:024257aaea1e | 103 | } |
tdiamandis | 4:024257aaea1e | 104 | else { |
tdiamandis | 4:024257aaea1e | 105 | if (PULSE_LENGTH == 0) PULSE_LENGTH = 1000; |
tdiamandis | 4:024257aaea1e | 106 | pc.printf("Pulse length is "); |
tdiamandis | 4:024257aaea1e | 107 | pc.printf("%d", PULSE_LENGTH); |
tdiamandis | 4:024257aaea1e | 108 | pc.printf("\r\n"); |
tdiamandis | 4:024257aaea1e | 109 | break; |
tdiamandis | 4:024257aaea1e | 110 | } |
tdiamandis | 4:024257aaea1e | 111 | } |
tteisberg | 0:cb5d20585be4 | 112 | |
tdiamandis | 1:a5e80a54e72f | 113 | //Packet |
tdiamandis | 1:a5e80a54e72f | 114 | char buffer[PACKET_LENGTH + 2]; |
tteisberg | 0:cb5d20585be4 | 115 | int idx = 0; |
tteisberg | 0:cb5d20585be4 | 116 | while(1) { |
tteisberg | 0:cb5d20585be4 | 117 | char a = pc.getc(); |
tdiamandis | 1:a5e80a54e72f | 118 | |
tdiamandis | 1:a5e80a54e72f | 119 | //Fills buffer then transmits |
tdiamandis | 4:024257aaea1e | 120 | if (a == '~') { |
tdiamandis | 4:024257aaea1e | 121 | tx = tx ^ 1; |
tdiamandis | 4:024257aaea1e | 122 | while (pc.getc() != '~'); |
tdiamandis | 4:024257aaea1e | 123 | } |
tdiamandis | 4:024257aaea1e | 124 | else if(a != '\n' && idx < PACKET_LENGTH){ |
tteisberg | 0:cb5d20585be4 | 125 | buffer[idx] = a; |
tteisberg | 0:cb5d20585be4 | 126 | idx++; |
tdiamandis | 4:024257aaea1e | 127 | } |
tdiamandis | 4:024257aaea1e | 128 | else { |
tdiamandis | 1:a5e80a54e72f | 129 | //Adds ending characters |
bhz | 7:4fafb1b60eab | 130 | // No need to add line ending characters -BZ |
bhz | 7:4fafb1b60eab | 131 | // buffer[idx] = '\r'; |
bhz | 7:4fafb1b60eab | 132 | // idx++; |
bhz | 7:4fafb1b60eab | 133 | // buffer[idx] = '\n'; |
bhz | 7:4fafb1b60eab | 134 | // idx++; |
Aaditya Shidham |
8:b6b645caf4ef | 135 | // add the checksums |
Aaditya Shidham |
8:b6b645caf4ef | 136 | char cksum2 = checkSum(buffer, PACKET_LENGTH); |
bhz | 7:4fafb1b60eab | 137 | buffer[idx] = checksum(buffer, idx); |
tdiamandis | 4:024257aaea1e | 138 | idx++; |
Aaditya Shidham |
8:b6b645caf4ef | 139 | buffer[idx] = cksum2; |
tdiamandis | 1:a5e80a54e72f | 140 | //Transmits packet |
tdiamandis | 1:a5e80a54e72f | 141 | blink_packet(buffer, idx); |
tteisberg | 0:cb5d20585be4 | 142 | idx = 0; |
tteisberg | 0:cb5d20585be4 | 143 | } |
tteisberg | 0:cb5d20585be4 | 144 | } |
tteisberg | 0:cb5d20585be4 | 145 | } |