]> rtime.felk.cvut.cz Git - sysless.git/blob - arch/arm/mach-lpc21xx/tools/tolpc/hiterm.c
cmdproc: Make backspace work even in sterm
[sysless.git] / arch / arm / mach-lpc21xx / tools / tolpc / hiterm.c
1 #include <stdio.h>
2 #include <string.h>
3 #include <termios.h>
4 #include <stdlib.h>
5 #include <sys/time.h>
6 #include <sys/types.h>
7 #include <asm/types.h>
8 #include <unistd.h>
9 #include <fcntl.h>
10 #include <errno.h>
11 #include <sys/stat.h>
12
13
14 #define DEBUG 0
15
16 int cnt;
17 char * arg[10];
18
19 unsigned char * bbuf=NULL;
20 long Len=0;
21
22 int tohit(int argc, char **argv);
23
24 void SaveBB(int fd,char *buf,int len)
25 {
26  char str[100];
27  int i;
28  int fd1;
29  
30  if (!bbuf){
31   printf("Error bufer empty\n");
32         return;
33  }
34  while(*buf && *buf!=' ') buf++;
35  while(*buf && *buf==' ') buf++;
36  i=0;
37  while(*buf && *buf!=' ' && *buf!=10 && *buf!=13) str[i++]=*buf++;
38  str[i]=0;
39  
40  if(i<1){
41   printf("Error bad parametr \n");
42         return;
43  }
44  if ((fd1 = open(str, O_CREAT | O_WRONLY, 0644)) == -1) {
45   printf("Error openning %s\n",str);
46         printf("%s\n",strerror(errno));
47         return;
48  }
49  i=write(fd1,bbuf,Len);
50  if(i<0){
51         printf("%s\n",strerror(errno));
52  }
53  else if(i!=Len){
54   printf("Error writing %s\n",str);
55  }
56  close(fd1);
57  printf("Write %d bytes\n",i);
58 }
59
60 void SaveBA(int fd,char *buf,int len)
61 {
62  char str[100];
63  int i;
64  FILE * F;
65  __s16 * x;
66  
67  if (!bbuf){
68   printf("Error bufer empty\n");
69         return;
70  }
71  while(*buf && *buf!=' ') buf++;
72  while(*buf && *buf==' ') buf++;
73  i=0;
74  while(*buf && *buf!=' ' && *buf!=10 && *buf!=13) str[i++]=*buf++;
75  str[i]=0;
76  
77  if(i<1){
78   printf("Error bad parametr \n");
79         return;
80  }
81  F=fopen(str,"w");
82  if (F==0) {
83   printf("Error openning %s\n",str);
84         printf("%s\n",strerror(errno));
85         return;
86  }
87  x=(__s16 *)bbuf;
88  for(i=0;i<(Len/2);i++){
89   fprintf(F,"%07d\n",*x);
90         x++;
91  }
92  fclose(F);
93  printf("Write %d num\n",i);
94 }
95
96
97 void Load(int fd,char *buf,int len,int fl)
98 {
99  int i;
100  int j;
101  char str[100];
102  char a1[]="7";
103  char * a[3];
104  
105  a[0]=NULL;
106  a[1]=a1;
107  a[2]=a1;
108  
109  buf[len]=' ';
110  buf[len+1]=0;
111  buf+=5;
112  if(*buf!=' ') buf++;
113  i=1;
114  arg[0]=NULL;
115  j=0;
116  while(*buf){
117   if(j>0 && *buf==' '){
118          str[j]=0;
119          j++;
120          if(i<cnt) free(arg[i]);
121          arg[i]=(char *)malloc(j);
122          do {
123           j--;
124           arg[i][j]=str[j];
125          }while(j);
126          i++;
127          if(i==10) i--;
128         }
129         else{
130          if(*buf!=' ' && *buf!=10 && *buf!=13) str[j++]=*buf;
131          if (j==100) j--;
132         } 
133         buf++;
134  }
135  if(i>1){
136   cnt=i;
137  }
138  for (i=0;i<cnt;i++){
139   printf("  A%d : %s\n",i,arg[i]);
140  }
141  if(cnt){
142   if(fl==0){
143          write(fd,"LOAD\n",5);
144          usleep(100000);
145          read(fd,str,100);
146         } 
147         tohit(cnt,arg);
148         tohit(3,a);
149         usleep(200000);
150         read(fd,str,100);
151  }
152  else{
153   printf("Bad Parametr\n");
154  }
155 }
156
157 char GName[100];
158 char GStart[20];
159 char GLen[20];
160 int GChan;
161 int GSt=0;
162 int Cb=0;
163
164 void Get(int fd,char *buf,int len)
165 {
166  char str[100];
167  int i;
168  
169  while(*buf && *buf!=' ') buf++;
170  while(*buf && *buf==' ') buf++;
171
172  i=0;
173  while(*buf && *buf!=',' && *buf!=' ' && *buf!=10 && *buf!=13) str[i++]=*buf++;
174  str[i]=0;
175  GChan=strtol(str,NULL,10);
176  while(*buf && (*buf==' ' || *buf==',')) buf++;
177
178  i=0;
179  while(*buf && *buf!=',' && *buf!=' ' && *buf!=10 && *buf!=13) GStart[i++]=*buf++;
180  GStart[i]=0;
181  while(*buf && (*buf==' ' || *buf==',')) buf++;
182
183  i=0;
184  while(*buf && *buf!=',' && *buf!=' ' && *buf!=10 && *buf!=13) GLen[i++]=*buf++;
185  GLen[i]=0;
186  while(*buf && (*buf==' ' || *buf==',')) buf++;
187
188  i=0;
189  while(*buf && *buf!=',' && *buf!=' ' && *buf!=10 && *buf!=13) GName[i++]=*buf++;
190  GName[i]=0;
191  
192  if(i<1){
193   printf("Error bad parametr \n");
194         return;
195  }
196  Cb=1;
197  GSt=0;
198  sprintf(str,"GET 0,%s,%s\n",GStart,GLen);
199  printf("%s",str);
200  write(fd,str,strlen(str));
201 }
202
203 void GetM(int fd,char *buf,int len)
204 {
205  char str[100];
206  int i;
207  
208  while(*buf && *buf!=' ') buf++;
209  while(*buf && *buf==' ') buf++;
210
211  i=0;
212  while(*buf && *buf!=',' && *buf!=' ' && *buf!=10 && *buf!=13) str[i++]=*buf++;
213  str[i]=0;
214  GChan=strtol(str,NULL,10);
215  while(*buf && (*buf==' ' || *buf==',')) buf++;
216
217  i=0;
218  while(*buf && *buf!=',' && *buf!=' ' && *buf!=10 && *buf!=13) GStart[i++]=*buf++;
219  GStart[i]=0;
220  while(*buf && (*buf==' ' || *buf==',')) buf++;
221
222  i=0;
223  while(*buf && *buf!=',' && *buf!=' ' && *buf!=10 && *buf!=13) GLen[i++]=*buf++;
224  GLen[i]=0;
225  while(*buf && (*buf==' ' || *buf==',')) buf++;
226
227  i=0;
228  while(*buf && *buf!=',' && *buf!=' ' && *buf!=10 && *buf!=13) GName[i++]=*buf++;
229  GName[i]=0;
230  
231  if(i<1){
232   printf("Error bad parametr \n");
233         return;
234  }
235  Cb=2;
236  GSt=0;
237  sprintf(str,"GET 0,%s,%s\n",GStart,GLen);
238  printf("%s",str);
239  write(fd,str,strlen(str));
240 }
241
242 void GetCB(int fd)
243 {
244  char str[100];
245  int i;
246  FILE * F;
247  __s16 * x;
248  
249  sprintf(str,"%s.%03d",GName,GSt);
250
251  F=fopen(str,"w");
252  if (F==0) {
253   printf("Error openning %s\n",str);
254         printf("%s\n",strerror(errno));
255         return;
256  }
257  x=(__s16 *)bbuf;
258  for(i=0;i<(Len/2);i++){
259   fprintf(F,"%07d\n",*x);
260         x++;
261  }
262  fclose(F);
263  printf("Write %d num\n",i);
264  GSt++;
265  if(GSt>GChan-1){
266   Cb=0;
267         GSt=0;
268         return;
269  }
270  sprintf(str,"GET %d,%s,%s\n",GSt,GStart,GLen);
271  printf("%s",str);
272  write(fd,str,strlen(str));
273 }
274
275 void GetMCB(int fd)
276 {
277  char str[100];
278  int i;
279  FILE * F;
280  __s16 * x;
281  
282  sprintf(str,"%s.dat",GName);
283  if(GSt==0)F=fopen(str,"w");
284  else F=fopen(str,"a");
285  if (F==0) {
286   printf("Error openning %s\n",str);
287         printf("%s\n",strerror(errno));
288         return;
289  }
290  x=(__s16 *)bbuf;
291  for(i=0;i<(Len/2);i++){
292   if(i==(Len/2)-1) fprintf(F,"%07d\n",*x);
293   else fprintf(F,"%07d ",*x);
294         x++;
295  }
296  fclose(F);
297 // printf("Write %d num\n",i);
298  GSt++;
299  if(GSt>GChan-1){
300         printf("Write %d chanels\n",GSt);
301   Cb=0;
302         GSt=0;
303         return;
304  }
305  sprintf(str,"GET %d,%s,%s\n",GSt,GStart,GLen);
306  printf("%s",str);
307  write(fd,str,strlen(str));
308 }
309
310 void LCmd(int fd,char* buf,int len)
311 {
312  buf[len]=0;
313  if((strstr(buf,"!loadb")==buf) || (strstr(buf,"!LOADB")==buf)) 
314   Load(fd,buf,len,1);
315  else if((strstr(buf,"!load")==buf) || (strstr(buf,"!LOAD")==buf)) 
316   Load(fd,buf,len,0);
317  else if((strstr(buf,"!savebuf")==buf) || (strstr(buf,"!SAVEBUF")==buf)) 
318   SaveBB(fd,buf,len);
319  else if((strstr(buf,"!saveasc")==buf) || (strstr(buf,"!SAVEASC")==buf)) 
320   SaveBA(fd,buf,len);
321  else if((strstr(buf,"!getm")==buf) || (strstr(buf,"!GETM")==buf)) 
322   Get(fd,buf,len);
323  else if((strstr(buf,"!get")==buf) || (strstr(buf,"!GET")==buf)) 
324   GetM(fd,buf,len);
325  else printf ("Unknown comand : %s\n",buf);
326 }
327
328 void CB(int fd)
329 {
330  if(Cb==1) GetCB(fd);
331  if(Cb==2) GetMCB(fd);
332 }
333
334
335 int main(int argc, char **argv) 
336 {
337  int ii;
338  int oi;
339  int i;
340  unsigned char ibuf[500];
341  unsigned char obuf[500];
342  unsigned char * sdev="/dev/ttyS1";
343  int fd=-1;
344  long len=0;
345  long dlen=0;
346  unsigned char *x;
347  
348  unsigned char * bb;
349  
350  cnt=0;
351  
352  if ((fd = open(sdev, O_RDWR | O_NONBLOCK)) == -1) {
353   printf("Error openning %s\n",sdev);
354         exit(-1);
355  }      
356  rs232_setmode(fd,38800,0,0);
357  
358  
359  ii=0;
360  oi=0;
361  while(1){
362   if(rs232_test(fd,10000)==1){
363          oi+=read(fd, obuf+oi, 500-oi);
364          if(obuf[oi-1]==0xa || obuf[oi-1]==0xd || oi>400){
365           obuf[oi]=0;
366                 if(dlen){
367                  if(oi<=dlen){
368                         memcpy(bb,obuf,oi);
369                         bb+=oi;
370                   dlen-=oi;
371                   oi=0;
372                  }
373                  else{
374                         memcpy(bb,obuf,dlen);
375                         bb+=dlen;
376                   x=obuf+dlen;
377                         dlen=0;
378                         i=0;
379                         while(x-obuf<oi){
380                    obuf[i++]=*x++;
381                         }
382                         oi=i;
383                         obuf[oi]=0;
384                  }
385                  if(!dlen) CB(fd);
386                 }
387                 else {
388            x=strstr(obuf,"061:");
389            if(x){
390                         x+=4;
391                         sscanf(x,"%ld",&Len);
392                         printf("len=%ld\n",Len);
393                         len=Len;
394                         if(bbuf) free(bbuf);
395                         bbuf=(unsigned char *)malloc(len);
396                         bb=bbuf;
397                         while(*x!=0xa && *x!=0xd && *x) x++;
398                         if(*x==0xd || *x==0xa) x++;
399                         i=0;
400                         while(x-obuf<oi){
401                    obuf[i++]=*x++;
402                         }
403                         oi=i;
404                         obuf[oi]=0;
405                  }
406            x=strstr(obuf,"062:");
407                  if(x){
408                   dlen=len;
409                         len=0;
410                         x+=4;
411                         if(oi-(x-obuf)>=dlen){
412                          memcpy(bb,x,dlen);
413                          bb+=dlen;
414                    x+=dlen;
415                          dlen=0;
416                          i=0;
417                          while(x-obuf<oi){
418                         obuf[i++]=*x++;
419                          }
420                          oi=i;
421                          obuf[oi]=0;
422                         }
423                         else{
424                          memcpy(bb,x,oi-(x-obuf));
425                          bb+=oi-(x-obuf);
426                    dlen-=oi-(x-obuf);
427                    oi=0;
428                         }
429                         if(!dlen) CB(fd);
430                  }
431                 } 
432                 write(0, obuf, oi);
433                 oi=0;
434          }      
435         }
436   if(rs232_test(1,10000)==1){
437          ii+=read(1, ibuf+ii, 500-ii);
438          if(ibuf[ii-1]==0xa || ibuf[ii-1]==0xd || ii>400){
439           if(ibuf[0]=='!'){
440                  LCmd(fd,ibuf,ii);
441                 }
442                 else{
443                  write(fd, ibuf, ii);
444                 } 
445                 ii=0;
446          }      
447         }
448  }
449 }
450