Initial commit
[jamendo] / branches / nota-show-app / src / ts7200 / ts7200_server.c
diff --git a/branches/nota-show-app/src/ts7200/ts7200_server.c b/branches/nota-show-app/src/ts7200/ts7200_server.c
new file mode 100644 (file)
index 0000000..4880c64
--- /dev/null
@@ -0,0 +1,214 @@
+/***************************************************************************
+ *            ts7200_server.c
+ *
+ *  Wed Nov 18 10:46:06 2009
+ *  Copyright  2009  Bartlomiej Swiercz
+ *  <bartlomiej.swiercz@teleca.com>
+ ****************************************************************************/
+
+#include <stdio.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <fcntl.h>
+#include <string.h>
+#include "ts7200_client.h"
+
+typedef enum { GREEN, RED } led_color_t;
+volatile unsigned int *PEDR, *PEDDR;
+int fd_mem;
+
+void initTS7200()
+{
+    unsigned char *start;
+    int fd_mem = open( "/dev/mem", O_RDWR );
+    start = mmap( 0, getpagesize(), PROT_READ|PROT_WRITE, MAP_SHARED, fd_mem, 0x80840000 );
+    PEDR =  (unsigned int *) (start + 0x20); //port e data
+    PEDDR = (unsigned int *) (start + 0x24); //port e direction
+    *PEDDR = 0xff; //all output (just 2 bits)
+
+    printf( "TS-7200 initialized\n" );
+}
+
+void freeTS7200()
+{
+    *PEDR = 0x00;
+    close( fd_mem );
+}
+
+void switchOnLed( led_color_t color )
+{
+    switch( color )
+    {
+        case GREEN:
+            *PEDR |= 0x01;
+            printf( "Green led switched on\n" );
+            break;
+        case RED:
+            *PEDR |= 0x02;
+            printf( "Red led switched on\n" );
+            break;
+        default:
+            printf( "Unknown led!\n" );
+    }
+}
+
+void switchOffLed( led_color_t color )
+{
+    switch( color )
+    {
+        case GREEN:
+            *PEDR &= 0xfe;
+            printf( "Green led switched off\n" );
+            break;
+        case RED:
+            *PEDR &= 0xfd;
+            printf( "Red led switched off\n" );
+            break;
+        default:
+            printf( "Unknown led!\n" );
+    }
+}
+
+int openNota( int *sock, nota_addr_t *addr )
+{
+    int err;
+    *sock = Hsocket( Hgetinstance(), AF_NOTA, SOCK_STREAM, 0 );
+    if(sock < 0)
+    {
+        perror( "Hsocket" );
+        return -1;
+    }
+
+    err = Hbind( Hgetinstance(), *sock, (struct sockaddr*) addr, sizeof(*addr) );
+    if( err != 0 ) 
+    {
+        Hclose( Hgetinstance(), *sock );
+        perror( "Hbind" );
+        return -1;
+    }
+
+    return 0;
+}
+
+int waitForConnection( int sock )
+{
+    int err, client;
+    err = Hlisten( Hgetinstance(), sock, 1 );
+    if(err != 0) {
+        Hclose( Hgetinstance(), sock );
+        perror( "Hlisten" );
+        return -1;
+    }
+
+    client = Haccept( Hgetinstance(), sock, NULL, NULL );
+    if( client < 0 ) 
+    {
+        Hclose( Hgetinstance(), sock );
+        perror( "Haccept" );
+        return -1;
+    }
+    return client;
+}
+
+char processCmd( char cmd )
+{
+    switch( cmd )
+    {
+        case 'P':
+            switchOffLed( GREEN );
+            switchOffLed( RED );
+            break;
+        case 'F':
+            switchOnLed( RED );
+            break;
+        default:
+            cmd = '?';
+    }
+
+    return cmd;
+}
+
+void startServer( nota_addr_t *addr )
+{
+    int sock, client, err;
+    char buf;
+
+    if (openNota( &sock, addr ) != 0)
+    {
+        printf( "openNota error!\n" );
+        return;
+    }
+    printf( "Waiting for connection ...\n" );
+    switchOnLed( GREEN );
+    
+    client = waitForConnection( sock );
+    if (client <= 0)
+    {
+        printf( "waitForConnection error!\n" );
+        return;
+    }
+
+    printf( "Server started and connected\n" );
+
+    while( 1 )
+    {
+
+        err = Hrecv( Hgetinstance(), client, &buf, 1, 0 );
+        if(err != 1) {
+            perror( "Hrecv" );
+            break;
+        }
+        printf( "Recived: %c\n", buf );
+
+        buf = processCmd( buf );
+
+        err = Hsend( Hgetinstance(), client, &buf, 1, 0 );
+        if(err != 1) {
+            perror( "Hsend" );
+            break;
+        }
+
+        break;
+    }
+
+    Hclose( Hgetinstance(), client );
+    Hclose( Hgetinstance(), sock );
+
+}
+
+int main( int argc, char *argv[] )
+{
+    int sid;
+
+    if (argc != 2)
+    {
+        printf( "Usage: ./test_server sid\n" );
+        exit( 1 );
+    }
+    
+    sid = atoi( argv[1] );
+
+    nota_addr_t addr;
+    addr.sid = sid;
+    addr.port = DEFAULT_PORT;
+
+    initTS7200();
+    switchOnLed( GREEN );
+    switchOffLed( RED );
+//    sleep( 1 );
+
+    printf( "Test server is registered with sid: %d\n", sid );
+
+    while( 1 )
+    {
+        switchOffLed( GREEN );
+        startServer( &addr );
+    }
+
+    freeTS7200();
+
+    return 0;
+}