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