this program can by compiled and run on several mbeds in a network. The mbed ID is automatically generated. This program is a small test to see if it works. To test the firmware you will need two ( or more ) mbed modules connected to the same network. Pin p5 should be connected with a push button to 3v3 and a resistor of 10k to ground. If the button is pressed the mbed will broadcast a message on ip 239, 192, 1, 100 on port 50000. All mbeds are listening to this ip address and port so they will pick up this message. If the message says MBED xyz LED ON, led1 will id on. If the message says MBED LED OFF, led1 will be off. It\\\'s that simple. So with one mbed you can turn the other mbeds led on or off.

Dependencies:   EthernetNetIf NTPClient_NetServices mbed

Committer:
Schueler
Date:
Mon Feb 14 08:10:14 2011 +0000
Revision:
3:3c33a398189e
Parent:
2:ae37f80efd23
1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Schueler 3:3c33a398189e 1 #include "system.h"
Schueler 0:c111a981bfb8 2
Schueler 0:c111a981bfb8 3
Schueler 1:2e2d0b0b57e0 4 void Alive() // ticker routine
Schueler 1:2e2d0b0b57e0 5 {
Schueler 1:2e2d0b0b57e0 6 SendAlive = 1;
Schueler 1:2e2d0b0b57e0 7 }
Schueler 1:2e2d0b0b57e0 8
Schueler 1:2e2d0b0b57e0 9 void button_pressed() // irq routine for button
Schueler 1:2e2d0b0b57e0 10 {
Schueler 1:2e2d0b0b57e0 11 ButtonPressed = 1;
Schueler 0:c111a981bfb8 12 }
Schueler 0:c111a981bfb8 13
Schueler 0:c111a981bfb8 14
Schueler 0:c111a981bfb8 15 void onUDPSocketEvent(UDPSocketEvent e)
Schueler 0:c111a981bfb8 16 {
Schueler 0:c111a981bfb8 17 switch(e)
Schueler 0:c111a981bfb8 18 {
Schueler 0:c111a981bfb8 19 case UDPSOCKET_READABLE: //The only event for now
Schueler 0:c111a981bfb8 20 char buf[64] = {0};
Schueler 0:c111a981bfb8 21 Host host;
Schueler 0:c111a981bfb8 22 while( int len = udp.recvfrom( buf, 63, &host ) )
Schueler 0:c111a981bfb8 23 {
Schueler 0:c111a981bfb8 24 if( len <= 0 )
Schueler 0:c111a981bfb8 25 break;
Schueler 0:c111a981bfb8 26
Schueler 0:c111a981bfb8 27 // should implement a parser...
Schueler 0:c111a981bfb8 28 // but this will do the trick for the moment
Schueler 0:c111a981bfb8 29 if ( strncmp ( buf, "MBED", 4 ) == 0 )
Schueler 0:c111a981bfb8 30 {
Schueler 1:2e2d0b0b57e0 31 //pc.printf ("message from %d.%d.%d.%d: %s\n", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3], buf );
Schueler 0:c111a981bfb8 32
Schueler 2:ae37f80efd23 33 mbed_client = 0;
Schueler 1:2e2d0b0b57e0 34 for ( int i = 5; i < 8; i++ )
Schueler 0:c111a981bfb8 35 {
Schueler 1:2e2d0b0b57e0 36 if ( ( buf[i] >= '0' ) & ( buf[i] <= '9' ) ) { mbed_client *=10; mbed_client += ( buf[i] - '0' ); }
Schueler 0:c111a981bfb8 37 }
Schueler 0:c111a981bfb8 38 if ( strstr (buf, "ALIVE") != NULL )
Schueler 0:c111a981bfb8 39 {
Schueler 2:ae37f80efd23 40 pc.printf ("MBED %d is alive\n\r", mbed_client );
Schueler 0:c111a981bfb8 41 }
Schueler 0:c111a981bfb8 42 if ( strstr (buf, "LED") != NULL )
Schueler 0:c111a981bfb8 43 {
Schueler 2:ae37f80efd23 44 pc.printf ("Message for MBED %d\n\r", mbed_client );
Schueler 0:c111a981bfb8 45 if ( strstr (buf, "ON") != NULL ) { led = 1; }
Schueler 0:c111a981bfb8 46 if ( strstr (buf, "OFF") != NULL ) { led = 0; }
Schueler 0:c111a981bfb8 47 }
Schueler 0:c111a981bfb8 48 }
Schueler 0:c111a981bfb8 49 }
Schueler 0:c111a981bfb8 50 break;
Schueler 0:c111a981bfb8 51 }
Schueler 0:c111a981bfb8 52 }
Schueler 0:c111a981bfb8 53
Schueler 0:c111a981bfb8 54 int main() {
Schueler 0:c111a981bfb8 55 char pos = 0;
Schueler 0:c111a981bfb8 56 pc.baud(115200);
Schueler 3:3c33a398189e 57 pc.printf("Ethernet...\n\r");
Schueler 0:c111a981bfb8 58 EthernetErr ethErr = eth.setup();
Schueler 0:c111a981bfb8 59 if(ethErr)
Schueler 0:c111a981bfb8 60 {
Schueler 3:3c33a398189e 61 pc.printf("Error %d in setup.\n\r", ethErr);
Schueler 0:c111a981bfb8 62 return -1;
Schueler 0:c111a981bfb8 63 }
Schueler 1:2e2d0b0b57e0 64 pc.printf(" OK\n\r");
Schueler 1:2e2d0b0b57e0 65 IpAddr ethIp = eth.getIp();
Schueler 2:ae37f80efd23 66 mbed_id = ethIp[3];
Schueler 2:ae37f80efd23 67 sprintf( strAlive, "MBED %d ALIVE\0", mbed_id );
Schueler 2:ae37f80efd23 68
Schueler 1:2e2d0b0b57e0 69 pc.printf( "%s\n\r", strAlive );
Schueler 3:3c33a398189e 70
Schueler 3:3c33a398189e 71 /* Set up NTP */
Schueler 3:3c33a398189e 72 // lcd.printf("Setting up NTP\n");
Schueler 3:3c33a398189e 73 Host server(IpAddr(), 123, "0.uk.pool.ntp.org");
Schueler 3:3c33a398189e 74 ntp.setTime(server);
Schueler 3:3c33a398189e 75 /* Temporary variables for control loop */
Schueler 3:3c33a398189e 76 time_t rtc_time = time(NULL);
Schueler 3:3c33a398189e 77 int minute = -1;
Schueler 3:3c33a398189e 78
Schueler 3:3c33a398189e 79
Schueler 1:2e2d0b0b57e0 80 // set Alive Broadcast to 10 seconds
Schueler 1:2e2d0b0b57e0 81 AliveTicker.attach(&Alive, 10);
Schueler 0:c111a981bfb8 82 Host multicast(IpAddr(239, 192, 1, 100), 50000, NULL); //Join multicast group on port 50000
Schueler 0:c111a981bfb8 83
Schueler 0:c111a981bfb8 84 udp.setOnEvent(&onUDPSocketEvent);
Schueler 0:c111a981bfb8 85
Schueler 0:c111a981bfb8 86 udp.bind(multicast);
Schueler 0:c111a981bfb8 87
Schueler 1:2e2d0b0b57e0 88 udp.sendto( strAlive, strlen(strAlive), &multicast );
Schueler 0:c111a981bfb8 89
Schueler 0:c111a981bfb8 90 button.rise(&button_pressed);
Schueler 3:3c33a398189e 91 while( 1 ) // Never Ending Story by Michael Ende
Schueler 0:c111a981bfb8 92 {
Schueler 0:c111a981bfb8 93 Net::poll();
Schueler 1:2e2d0b0b57e0 94 if ( SendAlive == 1 ) { udp.sendto( strAlive, strlen(strAlive), &multicast ); SendAlive = 0; } // Send Alive Signal
Schueler 1:2e2d0b0b57e0 95
Schueler 1:2e2d0b0b57e0 96 if( ButtonPressed != 0 )
Schueler 0:c111a981bfb8 97 {
Schueler 0:c111a981bfb8 98 char strout[20];
Schueler 0:c111a981bfb8 99 pos = !pos;
Schueler 2:ae37f80efd23 100 if ( pos == 0 ) sprintf( strout, "MBED %d LED OFF\0", mbed_client ); else sprintf( strout, "MBED %d LED ON\0", mbed_client );
Schueler 0:c111a981bfb8 101 udp.sendto( strout, strlen(strout), &multicast );
Schueler 1:2e2d0b0b57e0 102 //pc.printf("%s\n", str);
Schueler 1:2e2d0b0b57e0 103 ButtonPressed = 0;
Schueler 0:c111a981bfb8 104 }
Schueler 3:3c33a398189e 105
Schueler 3:3c33a398189e 106 /* Update current time */
Schueler 3:3c33a398189e 107 rtc_time = time(NULL);
Schueler 3:3c33a398189e 108 cTime = localtime(&rtc_time);
Schueler 3:3c33a398189e 109 if (cTime->tm_min != minute)
Schueler 3:3c33a398189e 110 {
Schueler 3:3c33a398189e 111 pc.printf("*** %d:%d ***\n\r", cTime->tm_hour, cTime->tm_min);
Schueler 3:3c33a398189e 112 minute = cTime->tm_min;
Schueler 3:3c33a398189e 113 /* Update time from NTP server if it's midnight UTC */
Schueler 3:3c33a398189e 114 if ((cTime->tm_min == 0) && (cTime->tm_hour == 0))
Schueler 3:3c33a398189e 115 {
Schueler 3:3c33a398189e 116 Host server(IpAddr(), 123, "0.uk.pool.ntp.org");
Schueler 3:3c33a398189e 117 ntp.setTime(server);
Schueler 3:3c33a398189e 118 }
Schueler 3:3c33a398189e 119 }
Schueler 3:3c33a398189e 120
Schueler 0:c111a981bfb8 121 }
Schueler 0:c111a981bfb8 122
Schueler 0:c111a981bfb8 123
Schueler 0:c111a981bfb8 124 }