Thomas Cauwelier / Mbed 2 deprecated visible_light_communication

Dependencies:   SoftSerial SDFileSystem mbed wave_player

Committer:
Desertification
Date:
Tue May 16 22:49:52 2017 +0000
Revision:
25:d28cfa47ff46
Parent:
24:d91e9b3b5bd5
Child:
29:c2d95d88ee0b
fix switching readable and writeable causing overwrite

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Thomas Cauwelier 24:d91e9b3b5bd5 1 //
Thomas Cauwelier 24:d91e9b3b5bd5 2 // Created by thoma on 16-May-17.
Thomas Cauwelier 24:d91e9b3b5bd5 3 //
Thomas Cauwelier 24:d91e9b3b5bd5 4
Thomas Cauwelier 24:d91e9b3b5bd5 5 #include "Relay.h"
Thomas Cauwelier 24:d91e9b3b5bd5 6
Thomas Cauwelier 24:d91e9b3b5bd5 7
Thomas Cauwelier 24:d91e9b3b5bd5 8 Relay::Relay(PinName tx_luart, int baudrate_luart, PinName tx_usb, PinName rx_usb, int baudrate_usb) :
Thomas Cauwelier 24:d91e9b3b5bd5 9 softSerial(tx_luart,NC), usb(tx_usb,rx_usb,baudrate_usb) {
Thomas Cauwelier 24:d91e9b3b5bd5 10 softSerial.baud(baudrate_luart);
Thomas Cauwelier 24:d91e9b3b5bd5 11 }
Thomas Cauwelier 24:d91e9b3b5bd5 12
Thomas Cauwelier 24:d91e9b3b5bd5 13 void Relay::run() {
Thomas Cauwelier 24:d91e9b3b5bd5 14 while(true){
Thomas Cauwelier 24:d91e9b3b5bd5 15 handle_type();
Thomas Cauwelier 24:d91e9b3b5bd5 16 }
Thomas Cauwelier 24:d91e9b3b5bd5 17 }
Thomas Cauwelier 24:d91e9b3b5bd5 18
Thomas Cauwelier 24:d91e9b3b5bd5 19 void Relay::set_volume(){
Thomas Cauwelier 24:d91e9b3b5bd5 20 while (!usb.readable());
Thomas Cauwelier 24:d91e9b3b5bd5 21 int volume = usb.getc();
Thomas Cauwelier 24:d91e9b3b5bd5 22
Thomas Cauwelier 24:d91e9b3b5bd5 23 while(!softSerial.writeable());
Thomas Cauwelier 24:d91e9b3b5bd5 24 softSerial.putc(volume);
Thomas Cauwelier 24:d91e9b3b5bd5 25
Thomas Cauwelier 24:d91e9b3b5bd5 26 while (!usb.writeable());
Thomas Cauwelier 24:d91e9b3b5bd5 27 usb.putc(ACK);
Thomas Cauwelier 24:d91e9b3b5bd5 28 }
Thomas Cauwelier 24:d91e9b3b5bd5 29
Thomas Cauwelier 24:d91e9b3b5bd5 30 void Relay::send_file(){
Thomas Cauwelier 24:d91e9b3b5bd5 31 // get file size
Thomas Cauwelier 24:d91e9b3b5bd5 32 int size = 0;
Thomas Cauwelier 24:d91e9b3b5bd5 33 for (int i = 0; i < 4; ++i) {
Thomas Cauwelier 24:d91e9b3b5bd5 34 while (!usb.readable());
Thomas Cauwelier 24:d91e9b3b5bd5 35 int b = usb.getc();
Thomas Cauwelier 24:d91e9b3b5bd5 36 while(!softSerial.writeable());
Thomas Cauwelier 24:d91e9b3b5bd5 37 softSerial.putc(b);
Thomas Cauwelier 24:d91e9b3b5bd5 38 size |= b << ((3-i) << 3);
Thomas Cauwelier 24:d91e9b3b5bd5 39 }
Thomas Cauwelier 24:d91e9b3b5bd5 40
Thomas Cauwelier 24:d91e9b3b5bd5 41 // send data
Thomas Cauwelier 24:d91e9b3b5bd5 42 int j = 0;
Thomas Cauwelier 24:d91e9b3b5bd5 43 while(j < size){
Thomas Cauwelier 24:d91e9b3b5bd5 44
Thomas Cauwelier 24:d91e9b3b5bd5 45 // get max 64 bytes
Thomas Cauwelier 24:d91e9b3b5bd5 46 int k = 0;
Thomas Cauwelier 24:d91e9b3b5bd5 47 for (k; k < 64; ++k) {
Thomas Cauwelier 24:d91e9b3b5bd5 48 if(j == size){
Thomas Cauwelier 24:d91e9b3b5bd5 49 break;
Thomas Cauwelier 24:d91e9b3b5bd5 50 }
Thomas Cauwelier 24:d91e9b3b5bd5 51 while (!usb.readable());
Thomas Cauwelier 24:d91e9b3b5bd5 52 int b = usb.getc();
Thomas Cauwelier 24:d91e9b3b5bd5 53 buffer[k] = b;
Thomas Cauwelier 24:d91e9b3b5bd5 54 j++;
Thomas Cauwelier 24:d91e9b3b5bd5 55 }
Thomas Cauwelier 24:d91e9b3b5bd5 56
Thomas Cauwelier 24:d91e9b3b5bd5 57 // send max 64 bytes
Thomas Cauwelier 24:d91e9b3b5bd5 58 int m = 0;
Thomas Cauwelier 24:d91e9b3b5bd5 59 for (m; m < k; ++m) {
Desertification 25:d28cfa47ff46 60 while (!softSerial.writeable());
Thomas Cauwelier 24:d91e9b3b5bd5 61 softSerial.putc(buffer[m]);
Thomas Cauwelier 24:d91e9b3b5bd5 62 }
Thomas Cauwelier 24:d91e9b3b5bd5 63
Thomas Cauwelier 24:d91e9b3b5bd5 64 // request new bytes from rpi
Thomas Cauwelier 24:d91e9b3b5bd5 65 while (!usb.writeable());
Thomas Cauwelier 24:d91e9b3b5bd5 66 usb.putc(ACK);
Thomas Cauwelier 24:d91e9b3b5bd5 67 }
Thomas Cauwelier 24:d91e9b3b5bd5 68 }
Thomas Cauwelier 24:d91e9b3b5bd5 69
Thomas Cauwelier 24:d91e9b3b5bd5 70 void Relay::handle_type() {
Thomas Cauwelier 24:d91e9b3b5bd5 71 while (!usb.readable());
Thomas Cauwelier 24:d91e9b3b5bd5 72 int packet_type = usb.getc();
Thomas Cauwelier 24:d91e9b3b5bd5 73
Thomas Cauwelier 24:d91e9b3b5bd5 74 while(!softSerial.writeable());
Thomas Cauwelier 24:d91e9b3b5bd5 75 softSerial.putc(packet_type);
Thomas Cauwelier 24:d91e9b3b5bd5 76
Thomas Cauwelier 24:d91e9b3b5bd5 77 while (!usb.writeable());
Thomas Cauwelier 24:d91e9b3b5bd5 78 usb.putc(ACK);
Thomas Cauwelier 24:d91e9b3b5bd5 79
Thomas Cauwelier 24:d91e9b3b5bd5 80 switch (packet_type){
Thomas Cauwelier 24:d91e9b3b5bd5 81 case SET_VOLUME:
Thomas Cauwelier 24:d91e9b3b5bd5 82 set_volume();
Thomas Cauwelier 24:d91e9b3b5bd5 83 break;
Thomas Cauwelier 24:d91e9b3b5bd5 84 case SEND_FILE:
Thomas Cauwelier 24:d91e9b3b5bd5 85 send_file();
Thomas Cauwelier 24:d91e9b3b5bd5 86 break;
Thomas Cauwelier 24:d91e9b3b5bd5 87 default:
Thomas Cauwelier 24:d91e9b3b5bd5 88 break;
Thomas Cauwelier 24:d91e9b3b5bd5 89 }
Thomas Cauwelier 24:d91e9b3b5bd5 90 }