SSI OpComms 3 CM TX

Dependencies:   mbed

Fork of Optical3cmTXnucleo by Thomas Teisberg

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?

UserRevisionLine numberNew 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 }