SSI OpComms 3 CM TX

Dependencies:   mbed

Fork of Optical3cmTXnucleo by Thomas Teisberg

Committer:
bhz
Date:
Mon Nov 16 00:08:50 2015 +0000
Revision:
7:4fafb1b60eab
Parent:
6:8eae544417af
Child:
8:b6b645caf4ef
Implemented basic checksum

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
tteisberg 0:cb5d20585be4 80 int main()
tteisberg 0:cb5d20585be4 81 {
tdiamandis 1:a5e80a54e72f 82 pc.printf("3 CM Link Board - Transmit\r\n");
tdiamandis 4:024257aaea1e 83 pc.printf("Enter pulse length in microseconds (10e-6), enter for 1000\r\n");
tdiamandis 4:024257aaea1e 84 while(1) {
tdiamandis 4:024257aaea1e 85 char d = pc.getc();
tdiamandis 4:024257aaea1e 86 if(d != '\n') {
tdiamandis 4:024257aaea1e 87 PULSE_LENGTH = PULSE_LENGTH*10 + (d-'0');
tdiamandis 4:024257aaea1e 88 }
tdiamandis 4:024257aaea1e 89 else {
tdiamandis 4:024257aaea1e 90 if (PULSE_LENGTH == 0) PULSE_LENGTH = 1000;
tdiamandis 4:024257aaea1e 91 pc.printf("Pulse length is ");
tdiamandis 4:024257aaea1e 92 pc.printf("%d", PULSE_LENGTH);
tdiamandis 4:024257aaea1e 93 pc.printf("\r\n");
tdiamandis 4:024257aaea1e 94 break;
tdiamandis 4:024257aaea1e 95 }
tdiamandis 4:024257aaea1e 96 }
tteisberg 0:cb5d20585be4 97
tdiamandis 1:a5e80a54e72f 98 //Packet
tdiamandis 1:a5e80a54e72f 99 char buffer[PACKET_LENGTH + 2];
tteisberg 0:cb5d20585be4 100 int idx = 0;
tteisberg 0:cb5d20585be4 101 while(1) {
tteisberg 0:cb5d20585be4 102 char a = pc.getc();
tdiamandis 1:a5e80a54e72f 103
tdiamandis 1:a5e80a54e72f 104 //Fills buffer then transmits
tdiamandis 4:024257aaea1e 105 if (a == '~') {
tdiamandis 4:024257aaea1e 106 tx = tx ^ 1;
tdiamandis 4:024257aaea1e 107 while (pc.getc() != '~');
tdiamandis 4:024257aaea1e 108 }
tdiamandis 4:024257aaea1e 109 else if(a != '\n' && idx < PACKET_LENGTH){
tteisberg 0:cb5d20585be4 110 buffer[idx] = a;
tteisberg 0:cb5d20585be4 111 idx++;
tdiamandis 4:024257aaea1e 112 }
tdiamandis 4:024257aaea1e 113 else {
tdiamandis 1:a5e80a54e72f 114 //Adds ending characters
bhz 7:4fafb1b60eab 115 // No need to add line ending characters -BZ
bhz 7:4fafb1b60eab 116 // buffer[idx] = '\r';
bhz 7:4fafb1b60eab 117 // idx++;
bhz 7:4fafb1b60eab 118 // buffer[idx] = '\n';
bhz 7:4fafb1b60eab 119 // idx++;
bhz 7:4fafb1b60eab 120 // add the checksum
bhz 7:4fafb1b60eab 121 buffer[idx] = checksum(buffer, idx);
tdiamandis 4:024257aaea1e 122 idx++;
tdiamandis 1:a5e80a54e72f 123
tdiamandis 1:a5e80a54e72f 124 //Transmits packet
tdiamandis 1:a5e80a54e72f 125 blink_packet(buffer, idx);
tteisberg 0:cb5d20585be4 126 idx = 0;
tteisberg 0:cb5d20585be4 127 }
tteisberg 0:cb5d20585be4 128 }
tteisberg 0:cb5d20585be4 129 }