Initial commit
[jamendo] / branches / nota-show-app / src / ts7200 / ts7200_server.c
1 /***************************************************************************
2  *            ts7200_server.c
3  *
4  *  Wed Nov 18 10:46:06 2009
5  *  Copyright  2009  Bartlomiej Swiercz
6  *  <bartlomiej.swiercz@teleca.com>
7  ****************************************************************************/
8
9 #include <stdio.h>
10 #include <errno.h>
11 #include <unistd.h>
12 #include <stdlib.h>
13 #include <sys/types.h>
14 #include <sys/mman.h>
15 #include <fcntl.h>
16 #include <string.h>
17 #include "ts7200_client.h"
18
19 typedef enum { GREEN, RED } led_color_t;
20 volatile unsigned int *PEDR, *PEDDR;
21 int fd_mem;
22
23 void initTS7200()
24 {
25     unsigned char *start;
26     int fd_mem = open( "/dev/mem", O_RDWR );
27     start = mmap( 0, getpagesize(), PROT_READ|PROT_WRITE, MAP_SHARED, fd_mem, 0x80840000 );
28     PEDR =  (unsigned int *) (start + 0x20); //port e data
29     PEDDR = (unsigned int *) (start + 0x24); //port e direction
30     *PEDDR = 0xff; //all output (just 2 bits)
31
32     printf( "TS-7200 initialized\n" );
33 }
34
35 void freeTS7200()
36 {
37     *PEDR = 0x00;
38     close( fd_mem );
39 }
40
41 void switchOnLed( led_color_t color )
42 {
43     switch( color )
44     {
45         case GREEN:
46             *PEDR |= 0x01;
47             printf( "Green led switched on\n" );
48             break;
49         case RED:
50             *PEDR |= 0x02;
51             printf( "Red led switched on\n" );
52             break;
53         default:
54             printf( "Unknown led!\n" );
55     }
56 }
57
58 void switchOffLed( led_color_t color )
59 {
60     switch( color )
61     {
62         case GREEN:
63             *PEDR &= 0xfe;
64             printf( "Green led switched off\n" );
65             break;
66         case RED:
67             *PEDR &= 0xfd;
68             printf( "Red led switched off\n" );
69             break;
70         default:
71             printf( "Unknown led!\n" );
72     }
73 }
74
75 int openNota( int *sock, nota_addr_t *addr )
76 {
77     int err;
78     *sock = Hsocket( Hgetinstance(), AF_NOTA, SOCK_STREAM, 0 );
79     if(sock < 0)
80     {
81         perror( "Hsocket" );
82         return -1;
83     }
84
85     err = Hbind( Hgetinstance(), *sock, (struct sockaddr*) addr, sizeof(*addr) );
86     if( err != 0 ) 
87     {
88         Hclose( Hgetinstance(), *sock );
89         perror( "Hbind" );
90         return -1;
91     }
92
93     return 0;
94 }
95
96 int waitForConnection( int sock )
97 {
98     int err, client;
99     err = Hlisten( Hgetinstance(), sock, 1 );
100     if(err != 0) {
101         Hclose( Hgetinstance(), sock );
102         perror( "Hlisten" );
103         return -1;
104     }
105
106     client = Haccept( Hgetinstance(), sock, NULL, NULL );
107     if( client < 0 ) 
108     {
109         Hclose( Hgetinstance(), sock );
110         perror( "Haccept" );
111         return -1;
112     }
113     return client;
114 }
115
116 char processCmd( char cmd )
117 {
118     switch( cmd )
119     {
120         case 'P':
121             switchOffLed( GREEN );
122             switchOffLed( RED );
123             break;
124         case 'F':
125             switchOnLed( RED );
126             break;
127         default:
128             cmd = '?';
129     }
130
131     return cmd;
132 }
133
134 void startServer( nota_addr_t *addr )
135 {
136     int sock, client, err;
137     char buf;
138
139     if (openNota( &sock, addr ) != 0)
140     {
141         printf( "openNota error!\n" );
142         return;
143     }
144     printf( "Waiting for connection ...\n" );
145     switchOnLed( GREEN );
146     
147     client = waitForConnection( sock );
148     if (client <= 0)
149     {
150         printf( "waitForConnection error!\n" );
151         return;
152     }
153
154     printf( "Server started and connected\n" );
155
156     while( 1 )
157     {
158
159         err = Hrecv( Hgetinstance(), client, &buf, 1, 0 );
160         if(err != 1) {
161             perror( "Hrecv" );
162             break;
163         }
164         printf( "Recived: %c\n", buf );
165
166         buf = processCmd( buf );
167
168         err = Hsend( Hgetinstance(), client, &buf, 1, 0 );
169         if(err != 1) {
170             perror( "Hsend" );
171             break;
172         }
173
174         break;
175     }
176
177     Hclose( Hgetinstance(), client );
178     Hclose( Hgetinstance(), sock );
179
180 }
181
182 int main( int argc, char *argv[] )
183 {
184     int sid;
185
186     if (argc != 2)
187     {
188         printf( "Usage: ./test_server sid\n" );
189         exit( 1 );
190     }
191     
192     sid = atoi( argv[1] );
193
194     nota_addr_t addr;
195     addr.sid = sid;
196     addr.port = DEFAULT_PORT;
197
198     initTS7200();
199     switchOnLed( GREEN );
200     switchOffLed( RED );
201 //    sleep( 1 );
202
203     printf( "Test server is registered with sid: %d\n", sid );
204
205     while( 1 )
206     {
207         switchOffLed( GREEN );
208         startServer( &addr );
209     }
210
211     freeTS7200();
212
213     return 0;
214 }