SSI OpComms 3 CM TX
Dependencies: mbed
Fork of Optical3cmTXnucleo by
main.cpp@2:eb6621f41f07, 2015-11-08 (annotated)
- Committer:
- tdiamandis
- Date:
- Sun Nov 08 00:58:35 2015 +0000
- Revision:
- 2:eb6621f41f07
- Parent:
- 1:a5e80a54e72f
- Child:
- 3:9c564c7cbabf
- Child:
- 4:024257aaea1e
Fixed +1 bug with delay
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
tteisberg | 0:cb5d20585be4 | 1 | #include "mbed.h" |
tteisberg | 0:cb5d20585be4 | 2 | |
tteisberg | 0:cb5d20585be4 | 3 | DigitalOut tx(D15); |
tteisberg | 0:cb5d20585be4 | 4 | |
tteisberg | 0:cb5d20585be4 | 5 | Serial pc(USBTX, USBRX); // tx, rx |
tdiamandis | 1:a5e80a54e72f | 6 | const int PULSE_LENGTH = 1000; |
tdiamandis | 1:a5e80a54e72f | 7 | const int PPM = 4; |
tdiamandis | 1:a5e80a54e72f | 8 | const int PACKET_LENGTH = 98; |
tteisberg | 0:cb5d20585be4 | 9 | |
tdiamandis | 1:a5e80a54e72f | 10 | //Function Prototypes |
tdiamandis | 1:a5e80a54e72f | 11 | void blink_packet(char* buffer, int len); |
tdiamandis | 1:a5e80a54e72f | 12 | void blink_char(char c); |
tdiamandis | 1:a5e80a54e72f | 13 | void blink(int data); |
tdiamandis | 1:a5e80a54e72f | 14 | |
tdiamandis | 1:a5e80a54e72f | 15 | |
tdiamandis | 1:a5e80a54e72f | 16 | /*Function: blink_packet: |
tdiamandis | 1:a5e80a54e72f | 17 | Preconditions: |
tdiamandis | 1:a5e80a54e72f | 18 | len is index of last filled character in buffer |
tdiamandis | 1:a5e80a54e72f | 19 | Postconditions: |
tdiamandis | 1:a5e80a54e72f | 20 | transmits the packet buffer |
tdiamandis | 1:a5e80a54e72f | 21 | */ |
tdiamandis | 1:a5e80a54e72f | 22 | void blink_packet(char* buffer, int len) |
tdiamandis | 1:a5e80a54e72f | 23 | { |
tdiamandis | 1:a5e80a54e72f | 24 | //Encodes and transmits each character |
tdiamandis | 1:a5e80a54e72f | 25 | for (int i=0; i < len; i++) { |
tdiamandis | 1:a5e80a54e72f | 26 | blink_char(buffer[i]); |
tteisberg | 0:cb5d20585be4 | 27 | } |
tdiamandis | 1:a5e80a54e72f | 28 | |
tdiamandis | 1:a5e80a54e72f | 29 | //Signifies end of packet |
tdiamandis | 1:a5e80a54e72f | 30 | tx = 1; |
tdiamandis | 1:a5e80a54e72f | 31 | wait_us(PULSE_LENGTH*2*(PPM+1)); |
tdiamandis | 1:a5e80a54e72f | 32 | tx = 0; |
tdiamandis | 1:a5e80a54e72f | 33 | } |
tdiamandis | 1:a5e80a54e72f | 34 | |
tdiamandis | 1:a5e80a54e72f | 35 | |
tdiamandis | 1:a5e80a54e72f | 36 | /*Function: blink_char: |
tdiamandis | 1:a5e80a54e72f | 37 | Postconditions: |
tdiamandis | 1:a5e80a54e72f | 38 | transmits the char c via DPPM 4 |
tdiamandis | 1:a5e80a54e72f | 39 | */ |
tdiamandis | 1:a5e80a54e72f | 40 | void blink_char(char c) { |
tdiamandis | 1:a5e80a54e72f | 41 | printf("%d", c); |
tdiamandis | 1:a5e80a54e72f | 42 | printf("%c", '\r'); |
tdiamandis | 1:a5e80a54e72f | 43 | printf("%c", '\n'); |
tdiamandis | 1:a5e80a54e72f | 44 | for (int i=3; i>=0; i--) { |
tdiamandis | 1:a5e80a54e72f | 45 | blink((c & (3 << i*2)) >> i*2); |
tdiamandis | 1:a5e80a54e72f | 46 | } |
tteisberg | 0:cb5d20585be4 | 47 | } |
tteisberg | 0:cb5d20585be4 | 48 | |
tdiamandis | 1:a5e80a54e72f | 49 | |
tdiamandis | 1:a5e80a54e72f | 50 | /*Function: blink_packet: |
tdiamandis | 1:a5e80a54e72f | 51 | Preconditions: |
tdiamandis | 1:a5e80a54e72f | 52 | data < DPPM used |
tdiamandis | 1:a5e80a54e72f | 53 | Postconditions: |
tdiamandis | 1:a5e80a54e72f | 54 | pulses the light to transmit data |
tdiamandis | 1:a5e80a54e72f | 55 | */ |
tdiamandis | 1:a5e80a54e72f | 56 | void blink(int data) { |
tdiamandis | 1:a5e80a54e72f | 57 | printf("%d", data); |
tdiamandis | 1:a5e80a54e72f | 58 | printf("%c", '\r'); |
tdiamandis | 1:a5e80a54e72f | 59 | printf("%c", '\n'); |
tdiamandis | 1:a5e80a54e72f | 60 | //Time on = PULSE_LENGTH |
tdiamandis | 1:a5e80a54e72f | 61 | tx = 1; |
tdiamandis | 1:a5e80a54e72f | 62 | wait_us(PULSE_LENGTH); |
tdiamandis | 1:a5e80a54e72f | 63 | |
tdiamandis | 1:a5e80a54e72f | 64 | //Time off = PULSE_LENGTH*(data value) |
tdiamandis | 1:a5e80a54e72f | 65 | // For example, a 01 transmitted would have a difference between pulses of 2 PULSE_LENGTH |
tdiamandis | 1:a5e80a54e72f | 66 | tx = 0; |
tdiamandis | 2:eb6621f41f07 | 67 | wait_us(PULSE_LENGTH*(data+1)); |
tdiamandis | 1:a5e80a54e72f | 68 | tx = 1; |
tdiamandis | 1:a5e80a54e72f | 69 | } |
tdiamandis | 1:a5e80a54e72f | 70 | |
tteisberg | 0:cb5d20585be4 | 71 | int main() |
tteisberg | 0:cb5d20585be4 | 72 | { |
tdiamandis | 1:a5e80a54e72f | 73 | pc.printf("3 CM Link Board - Transmit\r\n"); |
tteisberg | 0:cb5d20585be4 | 74 | |
tdiamandis | 1:a5e80a54e72f | 75 | //Packet |
tdiamandis | 1:a5e80a54e72f | 76 | char buffer[PACKET_LENGTH + 2]; |
tteisberg | 0:cb5d20585be4 | 77 | int idx = 0; |
tteisberg | 0:cb5d20585be4 | 78 | while(1) { |
tteisberg | 0:cb5d20585be4 | 79 | char a = pc.getc(); |
tdiamandis | 1:a5e80a54e72f | 80 | |
tdiamandis | 1:a5e80a54e72f | 81 | //Fills buffer then transmits |
tdiamandis | 1:a5e80a54e72f | 82 | if(a != '\n' && idx < PACKET_LENGTH){ |
tteisberg | 0:cb5d20585be4 | 83 | buffer[idx] = a; |
tteisberg | 0:cb5d20585be4 | 84 | idx++; |
tteisberg | 0:cb5d20585be4 | 85 | }else{ |
tdiamandis | 1:a5e80a54e72f | 86 | //Adds ending characters |
tdiamandis | 1:a5e80a54e72f | 87 | // buffer[idx] = '\r'; |
tdiamandis | 1:a5e80a54e72f | 88 | // idx++; |
tdiamandis | 1:a5e80a54e72f | 89 | // buffer[idx] = '\n'; |
tdiamandis | 1:a5e80a54e72f | 90 | // idx++; |
tdiamandis | 1:a5e80a54e72f | 91 | |
tdiamandis | 1:a5e80a54e72f | 92 | //Transmits packet |
tdiamandis | 1:a5e80a54e72f | 93 | blink_packet(buffer, idx); |
tteisberg | 0:cb5d20585be4 | 94 | idx = 0; |
tteisberg | 0:cb5d20585be4 | 95 | } |
tteisberg | 0:cb5d20585be4 | 96 | } |
tteisberg | 0:cb5d20585be4 | 97 | } |