MODSERIAL with support for more devices

Fork of MODSERIAL by Erik -

Committer:
AjK
Date:
Thu Jan 20 11:57:32 2011 +0000
Revision:
12:8c7394e2ae7f
Child:
13:70bb7c1769fa
1.12 See ChangeLog

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AjK 12:8c7394e2ae7f 1 /*
AjK 12:8c7394e2ae7f 2 Copyright (c) 2011 Andy Kirkham
AjK 12:8c7394e2ae7f 3
AjK 12:8c7394e2ae7f 4 Permission is hereby granted, free of charge, to any person obtaining a copy
AjK 12:8c7394e2ae7f 5 of this software and associated documentation files (the "Software"), to deal
AjK 12:8c7394e2ae7f 6 in the Software without restriction, including without limitation the rights
AjK 12:8c7394e2ae7f 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
AjK 12:8c7394e2ae7f 8 copies of the Software, and to permit persons to whom the Software is
AjK 12:8c7394e2ae7f 9 furnished to do so, subject to the following conditions:
AjK 12:8c7394e2ae7f 10
AjK 12:8c7394e2ae7f 11 The above copyright notice and this permission notice shall be included in
AjK 12:8c7394e2ae7f 12 all copies or substantial portions of the Software.
AjK 12:8c7394e2ae7f 13
AjK 12:8c7394e2ae7f 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
AjK 12:8c7394e2ae7f 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
AjK 12:8c7394e2ae7f 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AjK 12:8c7394e2ae7f 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
AjK 12:8c7394e2ae7f 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
AjK 12:8c7394e2ae7f 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
AjK 12:8c7394e2ae7f 20 THE SOFTWARE.
AjK 12:8c7394e2ae7f 21
AjK 12:8c7394e2ae7f 22 @file example2.cpp
AjK 12:8c7394e2ae7f 23 @purpose Demos a simple messaging system.
AjK 12:8c7394e2ae7f 24 @version see ChangeLog.c
AjK 12:8c7394e2ae7f 25 @date Jan 2011
AjK 12:8c7394e2ae7f 26 @author Andy Kirkham
AjK 12:8c7394e2ae7f 27 */
AjK 12:8c7394e2ae7f 28
AjK 12:8c7394e2ae7f 29 /*
AjK 12:8c7394e2ae7f 30 This example demostrates a simple "messaging" system. You can use it with
AjK 12:8c7394e2ae7f 31 a terminal program to test it out or write a cusom C#/C++/VB/etc program
AjK 12:8c7394e2ae7f 32 to read and write messages to or from the Mbed. The default buad rate in
AjK 12:8c7394e2ae7f 33 this example is 115200.
AjK 12:8c7394e2ae7f 34
AjK 12:8c7394e2ae7f 35 In this example, the LEDs are controlled and pins p21 to p24 are set as
AjK 12:8c7394e2ae7f 36 InterruptIn and send messages out when their value changes.
AjK 12:8c7394e2ae7f 37
AjK 12:8c7394e2ae7f 38 To use, hook up the MBed USB and open your fav terminal. All messages
AjK 12:8c7394e2ae7f 39 end with the \n character, don't forget to hit carriage return!.
AjK 12:8c7394e2ae7f 40 As an example:-
AjK 12:8c7394e2ae7f 41
AjK 12:8c7394e2ae7f 42 to switch on LED1 send LED1:1\n, off is LED1:0\n and toggle is LED1:2\n
AjK 12:8c7394e2ae7f 43 to switch on LED2 send LED2:1\n, off is LED2:0\n and toggle is LED2:2\n
AjK 12:8c7394e2ae7f 44 to switch on LED3 send LED3:1\n, off is LED3:0\n and toggle is LED3:2\n
AjK 12:8c7394e2ae7f 45 to switch on LED4 send LED4:1\n, off is LED4:0\n and toggle is LED4:2\n
AjK 12:8c7394e2ae7f 46
AjK 12:8c7394e2ae7f 47 When a pin change on p21 to p24 happens, a message is sent. As an example
AjK 12:8c7394e2ae7f 48 when p21 goes low PIN21:0\n is sent, when goes high PIN21:1\n is sent.
AjK 12:8c7394e2ae7f 49
AjK 12:8c7394e2ae7f 50 Note, the InterruptIn pins p21 to p24 are setup to have pullups. This means
AjK 12:8c7394e2ae7f 51 they are high. To activate them use a wire to short the pin to 0volts.
AjK 12:8c7394e2ae7f 52
AjK 12:8c7394e2ae7f 53 If you find that p21 to p24 sent a lot of on/off/on/off then it's probably
AjK 12:8c7394e2ae7f 54 due to "bounce". If you are connecting a mechanical switch to a pin you
AjK 12:8c7394e2ae7f 55 may prefer to use the PinDetect library rather than using InterruptIn.
AjK 12:8c7394e2ae7f 56 @see http://mbed.org/users/AjK/libraries/PinDetect/latest
AjK 12:8c7394e2ae7f 57
AjK 12:8c7394e2ae7f 58 */
AjK 12:8c7394e2ae7f 59
AjK 12:8c7394e2ae7f 60
AjK 12:8c7394e2ae7f 61 #ifdef COMPILE_EXAMPLE1_CODE_MODSERIAL
AjK 12:8c7394e2ae7f 62
AjK 12:8c7394e2ae7f 63 #include "mbed.h"
AjK 12:8c7394e2ae7f 64 #include "MODSERIAL.h"
AjK 12:8c7394e2ae7f 65
AjK 12:8c7394e2ae7f 66 #define MESSAGE_BUFFER_SIZE 32
AjK 12:8c7394e2ae7f 67
AjK 12:8c7394e2ae7f 68 DigitalOut led1(LED1);
AjK 12:8c7394e2ae7f 69 DigitalOut led2(LED2);
AjK 12:8c7394e2ae7f 70 DigitalOut led3(LED3);
AjK 12:8c7394e2ae7f 71 DigitalOut led4(LED4);
AjK 12:8c7394e2ae7f 72
AjK 12:8c7394e2ae7f 73 InterruptIn P21(p21);
AjK 12:8c7394e2ae7f 74 InterruptIn P22(p22);
AjK 12:8c7394e2ae7f 75 InterruptIn P23(p23);
AjK 12:8c7394e2ae7f 76 InterruptIn P24(p24);
AjK 12:8c7394e2ae7f 77
AjK 12:8c7394e2ae7f 78 MODSERIAL messageSystem(USBTX, USBRX);
AjK 12:8c7394e2ae7f 79 char messageBufferIncoming[MESSAGE_BUFFER_SIZE];
AjK 12:8c7394e2ae7f 80 char messageBufferOutgoing[MESSAGE_BUFFER_SIZE];
AjK 12:8c7394e2ae7f 81 bool messageReceived;
AjK 12:8c7394e2ae7f 82
AjK 12:8c7394e2ae7f 83 uint32_t pinChanged, pinAction;
AjK 12:8c7394e2ae7f 84
AjK 12:8c7394e2ae7f 85 void messageReceive(void) {
AjK 12:8c7394e2ae7f 86 messageSystem.move(messageBufferIncoming, MESSAGE_BUFFER_SIZE);
AjK 12:8c7394e2ae7f 87 messageReceived = true;
AjK 12:8c7394e2ae7f 88 }
AjK 12:8c7394e2ae7f 89
AjK 12:8c7394e2ae7f 90 void messageProcess(void) {
AjK 12:8c7394e2ae7f 91 if (!strncmp(messageBufferIncoming, "LED1:1", sizeof("LED1:1")-1)) led1 = 1;
AjK 12:8c7394e2ae7f 92 else if (!strncmp(messageBufferIncoming, "LED1:0", sizeof("LED1:0")-1)) led1 = 0;
AjK 12:8c7394e2ae7f 93 else if (!strncmp(messageBufferIncoming, "LED1:2", sizeof("LED1:2")-1)) led1 = !led1;
AjK 12:8c7394e2ae7f 94
AjK 12:8c7394e2ae7f 95 else if (!strncmp(messageBufferIncoming, "LED2:1", sizeof("LED2:1")-1)) led2 = 1;
AjK 12:8c7394e2ae7f 96 else if (!strncmp(messageBufferIncoming, "LED2:0", sizeof("LED2:0")-1)) led2 = 0;
AjK 12:8c7394e2ae7f 97 else if (!strncmp(messageBufferIncoming, "LED2:2", sizeof("LED2:2")-1)) led2 = !led2;
AjK 12:8c7394e2ae7f 98
AjK 12:8c7394e2ae7f 99 else if (!strncmp(messageBufferIncoming, "LED3:1", sizeof("LED3:1")-1)) led3 = 1;
AjK 12:8c7394e2ae7f 100 else if (!strncmp(messageBufferIncoming, "LED3:0", sizeof("LED3:0")-1)) led3 = 0;
AjK 12:8c7394e2ae7f 101 else if (!strncmp(messageBufferIncoming, "LED3:2", sizeof("LED3:2")-1)) led3 = !led3;
AjK 12:8c7394e2ae7f 102
AjK 12:8c7394e2ae7f 103 else if (!strncmp(messageBufferIncoming, "LED4:1", sizeof("LED4:1")-1)) led4 = 1;
AjK 12:8c7394e2ae7f 104 else if (!strncmp(messageBufferIncoming, "LED4:0", sizeof("LED4:0")-1)) led4 = 0;
AjK 12:8c7394e2ae7f 105 else if (!strncmp(messageBufferIncoming, "LED4:2", sizeof("LED4:2")-1)) led4 = !led4;
AjK 12:8c7394e2ae7f 106
AjK 12:8c7394e2ae7f 107 messageReceived = false;
AjK 12:8c7394e2ae7f 108 }
AjK 12:8c7394e2ae7f 109
AjK 12:8c7394e2ae7f 110 #define PIN_MESSAGE_SEND(x,y) sprintf(messageBufferOutgoing,"PIN%02d:%d\n",x,y);messageSystem.puts(messageBufferOutgoing);
AjK 12:8c7394e2ae7f 111
AjK 12:8c7394e2ae7f 112 void pin21Rise(void) { PIN_MESSAGE_SEND(21, 1); }
AjK 12:8c7394e2ae7f 113 void pin21Fall(void) { PIN_MESSAGE_SEND(21, 0); }
AjK 12:8c7394e2ae7f 114 void pin22Rise(void) { PIN_MESSAGE_SEND(22, 1); }
AjK 12:8c7394e2ae7f 115 void pin22Fall(void) { PIN_MESSAGE_SEND(22, 0); }
AjK 12:8c7394e2ae7f 116 void pin23Rise(void) { PIN_MESSAGE_SEND(23, 1); }
AjK 12:8c7394e2ae7f 117 void pin23Fall(void) { PIN_MESSAGE_SEND(23, 0); }
AjK 12:8c7394e2ae7f 118 void pin24Rise(void) { PIN_MESSAGE_SEND(24, 1); }
AjK 12:8c7394e2ae7f 119 void pin24Fall(void) { PIN_MESSAGE_SEND(24, 0); }
AjK 12:8c7394e2ae7f 120
AjK 12:8c7394e2ae7f 121 int main() {
AjK 12:8c7394e2ae7f 122
AjK 12:8c7394e2ae7f 123 messageReceived = false;
AjK 12:8c7394e2ae7f 124 messageSystem.baud(115200);
AjK 12:8c7394e2ae7f 125 messageSystem.attach(&messageReceive, MODSERIAL::RxAutoDetect);
AjK 12:8c7394e2ae7f 126 messageSystem.autoDectectChar('\n');
AjK 12:8c7394e2ae7f 127
AjK 12:8c7394e2ae7f 128 pinChanged = pinAction = 0;
AjK 12:8c7394e2ae7f 129
AjK 12:8c7394e2ae7f 130 // Enable pullup resistors on pins.
AjK 12:8c7394e2ae7f 131 P21.mode(PullUp); P22.mode(PullUp); P23.mode(PullUp); P24.mode(PullUp);
AjK 12:8c7394e2ae7f 132
AjK 12:8c7394e2ae7f 133 // Fix Mbed library bug, see http://mbed.org/forum/bugs-suggestions/topic/1498
AjK 12:8c7394e2ae7f 134 LPC_GPIOINT->IO2IntClr = (1UL << 5) | (1UL << 4) | (1UL << 3) | (1UL << 2);
AjK 12:8c7394e2ae7f 135
AjK 12:8c7394e2ae7f 136 // Attach callbacks.
AjK 12:8c7394e2ae7f 137 P21.rise(&pin21Rise); P21.fall(&pin21Fall);
AjK 12:8c7394e2ae7f 138 P22.rise(&pin22Rise); P22.fall(&pin22Fall);
AjK 12:8c7394e2ae7f 139 P23.rise(&pin23Rise); P23.fall(&pin23Fall);
AjK 12:8c7394e2ae7f 140 P24.rise(&pin24Rise); P24.fall(&pin24Fall);
AjK 12:8c7394e2ae7f 141
AjK 12:8c7394e2ae7f 142 while(1) {
AjK 12:8c7394e2ae7f 143 // Process incoming messages.
AjK 12:8c7394e2ae7f 144 if (messageReceived) messageProcess();
AjK 12:8c7394e2ae7f 145 }
AjK 12:8c7394e2ae7f 146 }
AjK 12:8c7394e2ae7f 147
AjK 12:8c7394e2ae7f 148 #endif