source: branches/juciphox/lib/ubasic/ubasic.c @ 461

Revision 461, 57.7 KB checked in by phyrephox, 5 years ago (diff)

+ new OSD Element - Temperature

+ video quality control added. when enabled (in video overrides), by the use of the up/down button you can increase or decrease movie quality OR bitrate (depends on what you enabled in the video override menu) - WHILE you are recording!

  • changed Fast video control so that it isnt enabled at default, only works on a few cameras (pause and unpause movie by pressing left/right while recording) - needs further development
  • when using fast video control switch and the pause function now the remaining time calculation is reset, so it reflects the change in bitrate faster
  • changed a few default conf values (symbols now enabled at default, because symbol file now is served together with binary)

+ introduced new versioning system: 0.10 now, X.10 will be major release (and probably without bugs, with proper documentation, scripts, optimized etc), 0.X0 will be something like "new features, a bit ironing out etc", 0.1X will be just bugfixes and really small changes
+ added vers.req to svn, will be included in zipfile when autobuilded, will definitly be useful...
+ wrote two sample readmes, one for dryos, one for vxworks, they are included in the batch-zip-complete archives, in respect to OS version. these are just drafts, need input from you. yeah you heard me, from YOU!
+ added version.txt that will also be included in said archive, reflecting latest changes. it is not cleaned up as of now, probably never will be, but gives a rough overview over latest development
+ added ubasic statement case/select switch by CHDKLover from here: http://chdk.setepontos.com/index.php/topic,1995.0.html as of now i chose the "safe" method, the multi statement, due to people not reacting. hopefully they test it in this build so we can decide on one option!

  • renamed get_movie_state to get_movie_status in ubasic

+ added command get_temperature (example: "get_temperature 0", 0 returns optical, 1 returns CCD and 2 returns battery temp)
+ added a few grids from the wiki
+ changed makefile bigtime: now with new command batch-zip-complete you now have an environment to compile a complete CHDK archive for each cam including binaries, readmes (according to OS), scripts, version history and so on. it is planned that the archive will be crammed with useful information (readmes, howtos - into the books folder), grids, scripts (working ones, universal ones, and also code fragments that will serve as examples), curves, symbols, fonts (copyright!?) and so on. as of now i just added a few of these, and some dummy texts so that zip file will accept the folders. again i need YOU to help on developing a good structure and good scripts, readmes and so on. with this build, people no longer need to sift through the wiki or the forum to find all the good stuff. at least i do hope so.

  • changed random command, now you can supply two values min & max.

example: "playsound random 3 6" will play the sounds 3,4,5,6 in random order (if repeated in a while loop)

+ added ewavrs sx100 patch from here: http://tools.assembla.com/chdk/changeset/460 (adjustable alt button)
+ added new command playsound. can and should be used from ubasic, via "playsound 0", where 0 is the startup sound. there are sounds ranging from 0 to 7, 7 being a nasty long beep. the first few sounds can only be played if they are NOT muted by the camera, the other beeps will be played though (cam must be unmuted though, didnt test it with the nasty error beep though i gotta admit). this feature will lead to many more features, for example anti theft protection together with DGs Disco lights ;)

0 = startup sound, 1 = shutter sound, 2 = button press sound, 3 = selftimer, 4 = short beep, 5 = af confirmation, 6 = error beep, 7 = long beeeeeeeeeeeeeeeeeeep (nasty!)

  • adjusted makefile.inc so that all cameras are in it now (defaulted to my s3is by the way, not that it should matter)

+ added whoever's fix for ixus950's touchwheel behaviour from here: http://chdk.setepontos.com/index.php/topic,2024.0.html

  • lng files (german & english), also copied to new folder CHDK\LANG (for gmake batch-zip-complete)

thanks to Ewavr, Hacki, reyalp, ljl, jucifer and all the guys hanging out in the irc chan ;)

ps: i hope i didnt forget anything or anyone.

p.p.s: introducing with this build we might actually have an autobuild server... wait and see in the forums...

Line 
1/*
2 * Copyright (c) 2006, Adam Dunkels
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the author nor the names of its contributors
14 *    may be used to endorse or promote products derived from this software
15 *    without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 */
30
31#if DEBUG
32#define DEBUG_PRINTF(...)  printf(__VA_ARGS__)
33#else
34#define DEBUG_PRINTF(...)
35#endif
36
37#ifdef TEST
38#include "../../include/ubasic.h"
39#include "../../include/platform.h"
40#include "../../include/script.h"
41#include <string.h>
42#include <fcntl.h>
43#include <io.h>
44#else
45#include "ubasic.h"
46#include "platform.h"
47#include "script.h"
48#include "camera.h"
49#endif
50//#include "platform.h"
51#include "tokenizer.h"
52#include "shot_histogram.h"
53#include "../../include/conf.h"
54
55#include "camera_functions.h"
56
57#include "stdlib.h" /* exit() */
58
59#define INCLUDE_OLD_GET__SYNTAX
60
61#ifdef DEBUG
62#include <stdio.h>
63#endif
64
65static char const *program_ptr;
66#define MAX_STRINGLEN 40
67static char string[MAX_STRINGLEN];
68
69#define MAX_GOSUB_STACK_DEPTH 10
70static short gosub_stack[MAX_GOSUB_STACK_DEPTH];
71static int gosub_stack_ptr;
72
73#define MAX_IF_STACK_DEPTH 4
74static short if_stack[MAX_IF_STACK_DEPTH];
75static int if_stack_ptr;
76
77struct select_state {
78  int select_value;
79  short case_run;
80};
81#define MAX_SELECT_STACK_DEPTH 4
82static struct select_state select_stack[MAX_SELECT_STACK_DEPTH];
83static int select_stack_ptr;
84
85
86
87#define MAX_WHILE_STACK_DEPTH 4
88static short while_stack[MAX_WHILE_STACK_DEPTH];
89static int while_stack_ptr;
90
91#define MAX_DO_STACK_DEPTH 4
92static short do_stack[MAX_DO_STACK_DEPTH];
93static int do_stack_ptr;
94
95struct for_state {
96  short line_after_for;
97  short for_variable;
98  int to;
99  int step;
100};
101#define MAX_FOR_STACK_DEPTH 4
102static struct for_state for_stack[MAX_FOR_STACK_DEPTH];
103static int for_stack_ptr;
104
105#define MAX_VARNUM 52
106static int variables[MAX_VARNUM];
107
108static int ended;
109
110static int expr(void);
111static void line_statement(void);
112static void statement(void);
113static int relation(void);
114
115int ubasic_error;
116const char *ubasic_errstrings[UBASIC_E_ENDMARK] =
117{
118    "No err",
119    "Parse err",
120    "Unk stmt",
121    "Unk key",
122    "Unk label",
123    "Stack ful",
124    "bad return",
125    "Unk err"
126};
127
128/*---------------------------------------------------------------------------*/
129int
130ubasic_linenumber()
131{
132  return tokenizer_line_number();
133}
134
135/*---------------------------------------------------------------------------*/
136void
137ubasic_init(const char *program)
138{
139  program_ptr = program;
140  for_stack_ptr = gosub_stack_ptr = while_stack_ptr = do_stack_ptr = if_stack_ptr = 0;
141  tokenizer_init(program);
142  ended = 0;
143  ubasic_error = UBASIC_E_NONE;
144}
145/*---------------------------------------------------------------------------*/
146static void
147accept(int token)
148{
149  if(token != tokenizer_token()) {
150    DEBUG_PRINTF("Token not what was expected (expected %d, got %d)\n",
151                 token, tokenizer_token());
152    tokenizer_error_print();
153     tokenizer_next();
154     ended = 1;
155     ubasic_error = UBASIC_E_PARSE;
156     return;
157  }
158  DEBUG_PRINTF("Expected %d, got it\n", token);
159  tokenizer_next();
160}
161/*---------------------------------------------------------------------------*/
162static void
163accept_cr()
164{
165    while(tokenizer_token() != TOKENIZER_CR &&
166            tokenizer_token() != TOKENIZER_ENDOFINPUT)
167      tokenizer_next();
168    accept(TOKENIZER_CR);
169}
170/*---------------------------------------------------------------------------*/
171static int
172varfactor(void)
173{
174  int r;
175  DEBUG_PRINTF("varfactor: obtaining %d from variable %d\n", variables[tokenizer_variable_num()], tokenizer_variable_num());
176  r = ubasic_get_variable(tokenizer_variable_num());
177  accept(TOKENIZER_VARIABLE);
178  return r;
179}
180/*---------------------------------------------------------------------------*/
181static int
182factor(void)
183{
184  int r;
185
186  DEBUG_PRINTF("factor: token %d\n", tokenizer_token());
187  switch(tokenizer_token()) {
188  case TOKENIZER_NUMBER:
189    r = tokenizer_num();
190    DEBUG_PRINTF("factor: number %d\n", r);
191    accept(TOKENIZER_NUMBER);
192    break;
193  case TOKENIZER_LEFTPAREN:
194    accept(TOKENIZER_LEFTPAREN);
195    r = relation();
196    accept(TOKENIZER_RIGHTPAREN);
197    break;
198  case TOKENIZER_PLUS:
199    accept(TOKENIZER_PLUS);
200    r = factor();
201    break;
202  case TOKENIZER_MINUS:
203    accept(TOKENIZER_MINUS);
204    r = - factor();
205    break;
206  case TOKENIZER_LNOT:
207    accept(TOKENIZER_LNOT);
208    r = ! relation();
209    break;
210case TOKENIZER_GET_VBATT:
211    accept(TOKENIZER_GET_VBATT);
212    r = (unsigned short) stat_get_vbatt();
213    break;
214 case TOKENIZER_GET_DAY_SECONDS:
215    accept(TOKENIZER_GET_DAY_SECONDS);
216    r = shooting_get_day_seconds();
217    break;
218 case TOKENIZER_GET_TICK_COUNT:
219    accept(TOKENIZER_GET_TICK_COUNT);
220    r = shooting_get_tick_count();     
221   break;
222 case TOKENIZER_GET_RAW_NR:
223    accept(TOKENIZER_GET_RAW_NR);
224    r = ubasic_camera_get_nr();     
225    break;
226 case TOKENIZER_IS_KEY:
227    accept(TOKENIZER_IS_KEY);
228    tokenizer_string(string, sizeof(string));
229    tokenizer_next();
230    r = ubasic_camera_is_clicked(string);
231    break;
232case TOKENIZER_SCRIPT_AUTOSTARTED:
233    accept(TOKENIZER_SCRIPT_AUTOSTARTED);
234    r = ubasic_camera_script_autostart();
235    break;
236case TOKENIZER_GET_SCRIPT_AUTOSTART:
237    accept(TOKENIZER_GET_SCRIPT_AUTOSTART);
238    r = conf.script_startup;
239    break;
240case TOKENIZER_GET_USB_POWER:
241    accept(TOKENIZER_GET_USB_POWER);
242    r = get_usb_power(0);     
243    break;
244case TOKENIZER_GET_EXP_COUNT:
245    accept(TOKENIZER_GET_EXP_COUNT);
246    r = get_exposure_counter();
247    break;
248case TOKENIZER_IS_PRESSED:
249    accept(TOKENIZER_IS_PRESSED);
250    tokenizer_string(string, sizeof(string));
251    tokenizer_next();
252    r = ubasic_camera_is_pressed(string);
253    break;
254  case TOKENIZER_RANDOM:
255    accept(TOKENIZER_RANDOM);
256    int min = expr();
257    int max = expr();
258    srand((int)shooting_get_bv96()+(unsigned short)stat_get_vbatt()+get_tick_count());
259    ubasic_camera_sleep(rand()%10);
260    r = min + rand()%(max-min+1);
261  break;
262  case TOKENIZER_GET_MOVIE_STATUS:
263    accept(TOKENIZER_GET_MOVIE_STATUS);
264    r = movie_status;
265   break;
266  case TOKENIZER_GET_DRIVE_MODE:
267    accept(TOKENIZER_GET_DRIVE_MODE);
268    r = shooting_get_prop(PROPCASE_DRIVE_MODE);
269   break;
270  case TOKENIZER_GET_FOCUS_MODE:
271    accept(TOKENIZER_GET_FOCUS_MODE);
272    r = shooting_get_prop(PROPCASE_FOCUS_MODE);
273   break;
274        case TOKENIZER_GET_DISPLAY_MODE:
275    accept(TOKENIZER_GET_DISPLAY_MODE);
276    r = shooting_get_prop(PROPCASE_DISPLAY_MODE);
277   break;
278  case TOKENIZER_GET_FLASH_MODE:
279    accept(TOKENIZER_GET_FLASH_MODE);
280    r = shooting_get_prop(PROPCASE_FLASH_MODE);
281   break;
282  case TOKENIZER_GET_SHOOTING:
283    accept(TOKENIZER_GET_SHOOTING);
284    r = shooting_get_prop(PROPCASE_SHOOTING);
285   break;
286  case TOKENIZER_GET_FLASH_READY:
287    accept(TOKENIZER_GET_FLASH_READY);
288    r = shooting_get_prop(PROPCASE_IS_FLASH_READY);
289   break;
290  case TOKENIZER_GET_IS_MODE:
291    accept(TOKENIZER_GET_IS_MODE);
292    r = shooting_get_prop(PROPCASE_IS_MODE);
293   break;
294  case TOKENIZER_GET_EV:
295    accept(TOKENIZER_GET_EV);
296    r = shooting_get_prop(PROPCASE_EV_CORRECTION_1);
297   break;
298  case TOKENIZER_GET_ORIENTATION_SENSOR:
299    accept(TOKENIZER_GET_ORIENTATION_SENSOR);
300    r = shooting_get_prop(PROPCASE_ORIENTATION_SENSOR);
301   break;
302  case TOKENIZER_GET_ZOOM_STEPS:
303    accept(TOKENIZER_GET_ZOOM_STEPS);
304    r = zoom_points;
305   break;
306  case TOKENIZER_GET_ND_PRESENT:
307    accept(TOKENIZER_GET_ND_PRESENT);
308    #if !CAM_HAS_ND_FILTER
309    r = 0;
310    #endif
311    #if CAM_HAS_ND_FILTER && !CAM_HAS_IRIS_DIAPHRAGM
312    r = 1;
313    #endif
314    #if CAM_HAS_ND_FILTER && CAM_HAS_IRIS_DIAPHRAGM
315    r = 2;
316    #endif
317   break;
318  case TOKENIZER_GET_PROPSET:
319    accept(TOKENIZER_GET_PROPSET);
320    #if CAM_PROPSET == 1
321    r = 1;
322    #elif CAM_PROPSET == 2
323    r = 2;
324    #endif
325   break;
326  case TOKENIZER_GET_TV96:
327    accept(TOKENIZER_GET_TV96);
328    r = shooting_get_tv96();
329    break;
330  case TOKENIZER_GET_USER_TV96:
331    accept(TOKENIZER_GET_USER_TV96);
332    r = shooting_get_user_tv96();
333    break;   
334  case TOKENIZER_GET_USER_TV_ID:
335    accept(TOKENIZER_GET_USER_TV_ID);
336    r = shooting_get_user_tv_id();
337    break;
338  case TOKENIZER_GET_AV96:
339    accept(TOKENIZER_GET_AV96);
340    r = shooting_get_av96();
341    break; 
342  case TOKENIZER_GET_USER_AV96:
343    accept(TOKENIZER_GET_USER_AV96);
344    r = shooting_get_user_av96();
345    break;   
346  case TOKENIZER_GET_USER_AV_ID:
347    accept(TOKENIZER_GET_USER_AV_ID);
348    r = shooting_get_user_av_id();
349    break;
350  case TOKENIZER_GET_ZOOM:
351    accept(TOKENIZER_GET_ZOOM);
352    r = shooting_get_zoom();
353    break;
354  case TOKENIZER_GET_FOCUS:
355    accept(TOKENIZER_GET_FOCUS);
356    r = shooting_get_subject_distance();
357    break;
358  case TOKENIZER_GET_NEAR_LIMIT:
359    accept(TOKENIZER_GET_NEAR_LIMIT);
360    r = shooting_get_near_limit_of_acceptable_sharpness();
361    break;
362  case TOKENIZER_GET_FAR_LIMIT:
363    accept(TOKENIZER_GET_FAR_LIMIT);
364    r = shooting_get_far_limit_of_acceptable_sharpness();
365    break; 
366   case TOKENIZER_GET_DOF:
367    accept(TOKENIZER_GET_DOF);
368    r = shooting_get_depth_of_field();
369    break;
370  case TOKENIZER_GET_HYPERFOCAL_DIST:
371    accept(TOKENIZER_GET_HYPERFOCAL_DIST);
372    r = shooting_get_hyperfocal_distance();
373    break; 
374  case TOKENIZER_GET_ISO_MARKET:
375    accept(TOKENIZER_GET_ISO_MARKET);
376    r = (int)shooting_get_iso_market();
377    break;
378  case TOKENIZER_GET_ISO_REAL:
379    accept(TOKENIZER_GET_ISO_REAL);
380    r = (int)shooting_get_iso_real();
381    break;
382  case TOKENIZER_GET_BV96:
383    accept(TOKENIZER_GET_BV96);
384    r = (int)shooting_get_bv96();
385    break; 
386  case TOKENIZER_GET_SV96:
387    accept(TOKENIZER_GET_SV96);
388    r = (int)shooting_get_sv96();
389    break;   
390  case TOKENIZER_GET_ISO_MODE:
391    accept(TOKENIZER_GET_ISO_MODE);
392    r = shooting_get_iso_mode();
393    break;
394  case TOKENIZER_GET_DISK_SIZE:
395    accept(TOKENIZER_GET_DISK_SIZE);
396    r = GetTotalCardSpaceKb();
397    break;
398  case TOKENIZER_GET_FREE_DISK_SPACE:
399    accept(TOKENIZER_GET_FREE_DISK_SPACE);
400    r = GetFreeCardSpaceKb();
401    break;
402
403  case TOKENIZER_GET_JPG_COUNT:
404    accept(TOKENIZER_GET_JPG_COUNT);
405    r = GetJpgCount();
406    break;
407  case TOKENIZER_GET_RAW_COUNT:
408    accept(TOKENIZER_GET_RAW_COUNT);
409    r = GetRawCount();
410    break;
411  case TOKENIZER_GET_PROP:
412    accept(TOKENIZER_GET_PROP);
413    int var = expr();
414    r = shooting_get_prop(var);
415    break;
416  case TOKENIZER_GET_HISTO_RANGE:
417    accept(TOKENIZER_GET_HISTO_RANGE);
418    int from = expr();
419    int to = expr();
420    if (shot_histogram_enabled) r = (unsigned short)shot_histogram_get_range(from, to);
421    else r = -1;
422    break;
423  case TOKENIZER_GET_TEMPERATURE:
424    accept(TOKENIZER_GET_TEMPERATURE);
425    int temp = expr();
426    switch (temp)
427    {
428        case 0:
429                r = get_optical_temp();
430                break;
431        case 1:
432                r = get_ccd_temp();
433                break;
434        case 2:
435                r = get_battery_temp();
436                break;
437  }
438    break;
439 case TOKENIZER_GET_RAW:
440    accept(TOKENIZER_GET_RAW);
441    r = conf.save_raw;     
442    break;
443  default:
444    r = varfactor();
445    break;
446  }
447  return r;
448}
449/*---------------------------------------------------------------------------*/
450static int
451term(void)
452{
453  int f1, f2;
454  int op;
455
456  f1 = factor();
457  op = tokenizer_token();
458  DEBUG_PRINTF("term: token %d\n", op);
459  while(op == TOKENIZER_ASTR ||
460        op == TOKENIZER_SLASH ||
461        op == TOKENIZER_LT ||
462        op == TOKENIZER_GT ||
463        op == TOKENIZER_GE ||
464        op == TOKENIZER_LE ||
465        op == TOKENIZER_NE ||
466        op == TOKENIZER_EQ ||
467        op == TOKENIZER_XOR ||
468        op == TOKENIZER_OR ||
469        op == TOKENIZER_MOD) {
470    tokenizer_next();
471    f2 = factor();
472    DEBUG_PRINTF("term: %d %d %d\n", f1, op, f2);
473    switch(op) {
474    case TOKENIZER_ASTR:
475      f1 = f1 * f2;
476      break;
477    case TOKENIZER_SLASH:
478      f1 = f1 / f2;
479      break;
480    case TOKENIZER_MOD:
481      f1 = f1 % f2;
482      break;
483    case TOKENIZER_LT:
484      f1 = f1 < f2;
485      break;
486    case TOKENIZER_GT:
487      f1 = f1 > f2;
488      break;
489    case TOKENIZER_EQ:
490      f1 = f1 == f2;
491      break;
492    case TOKENIZER_NE:
493      f1 = f1 != f2;
494      break;
495    case TOKENIZER_LE:
496      f1 = f1 <= f2;
497      break;
498    case TOKENIZER_GE:
499      f1 = f1 >= f2;
500      break;
501    case TOKENIZER_OR:
502      f1 = f1 | f2;
503      break;
504    case TOKENIZER_XOR:
505      f1 = f1 ^ f2;
506      break;
507    }
508    op = tokenizer_token();
509  }
510  DEBUG_PRINTF("term: %d\n", f1);
511  return f1;
512}
513/*---------------------------------------------------------------------------*/
514static int
515expr(void)
516{
517  int t1, t2;
518  int op;
519 
520  t1 = term();
521  op = tokenizer_token();
522  DEBUG_PRINTF("expr: token %d\n", op);
523  while(op == TOKENIZER_PLUS ||
524        op == TOKENIZER_MINUS ||
525        op == TOKENIZER_AND ||
526        op == TOKENIZER_LOR ||
527        op == TOKENIZER_XOR) {
528    tokenizer_next();
529    t2 = term();
530    DEBUG_PRINTF("expr: %d %d %d\n", t1, op, t2);
531    switch(op) {
532    case TOKENIZER_PLUS:
533      t1 = t1 + t2;
534      break;
535    case TOKENIZER_MINUS:
536      t1 = t1 - t2;
537      break;
538    case TOKENIZER_AND:
539      t1 = t1 & t2;
540      break;
541    case TOKENIZER_LOR:
542      t1 = t1 || t2;
543      break;
544    }
545    op = tokenizer_token();
546  }
547  DEBUG_PRINTF("expr: %d\n", t1);
548  return t1;
549}
550/*---------------------------------------------------------------------------*/
551static int
552relation(void)
553{
554  int r1, r2;
555  int op;
556 
557  r1 = expr();
558  op = tokenizer_token();
559  DEBUG_PRINTF("relation: token %d\n", op);
560  while(op == TOKENIZER_LAND) {
561    tokenizer_next();
562    r2 = expr();
563    DEBUG_PRINTF("relation: %d %d %d\n", r1, op, r2);
564    switch(op) {
565    case TOKENIZER_LAND:
566      r1 = r1 && r2;
567      break;
568    }
569    op = tokenizer_token();
570  }
571  return r1;
572}
573
574#if 0
575/*---------------------------------------------------------------------------*/
576static void
577jump_linenum(int linenum)
578{
579  tokenizer_init(program_ptr);
580  while(tokenizer_num() != linenum) {
581    do {
582      do {
583        tokenizer_next();
584      } while(tokenizer_token() != TOKENIZER_CR &&
585              tokenizer_token() != TOKENIZER_ENDOFINPUT);
586      if(tokenizer_token() == TOKENIZER_CR) {
587        tokenizer_next();
588      }
589    } while(tokenizer_token() != TOKENIZER_NUMBER);
590    DEBUG_PRINTF("jump_linenum: Found line %d\n", tokenizer_num());
591  }
592}
593#endif
594
595/*---------------------------------------------------------------------------*/
596static void
597jump_line(int linenum)
598{
599  tokenizer_init(program_ptr);
600  while(tokenizer_line_number() != linenum) {
601    tokenizer_next();
602  }
603  /* swallow the CR that would be read next */
604  accept(TOKENIZER_CR);
605
606}
607/*---------------------------------------------------------------------------*/
608// TODO: error handling?
609int
610jump_label(char * label)
611{
612  char currLabel[MAX_STRINGLEN];
613  tokenizer_init(program_ptr);
614  currLabel[0] = 0;
615  while(tokenizer_token() != TOKENIZER_ENDOFINPUT) {
616    tokenizer_next();
617    if (tokenizer_token() == TOKENIZER_LABEL) {
618      tokenizer_label(currLabel, sizeof(currLabel));
619      tokenizer_next();
620      if(strcmp(label, currLabel) == 0) {
621        accept(TOKENIZER_CR);
622        DEBUG_PRINTF("jump_linenum: Found line %d\n", tokenizer_line_number());
623        break;
624      }
625    }
626  }
627  if (tokenizer_token() == TOKENIZER_ENDOFINPUT) {
628    if (state_kbd_script_run == 1) { 
629      DEBUG_PRINTF("Label %s not found", label);
630      ubasic_error = UBASIC_E_UNK_LABEL;
631    }
632      return 0;
633  } else {
634      return 1;
635  }
636}
637/*---------------------------------------------------------------------------*/
638static void
639goto_statement(void)
640{
641  accept(TOKENIZER_GOTO);
642  if(tokenizer_token() == TOKENIZER_STRING) {
643    tokenizer_string(string, sizeof(string));
644    tokenizer_next();
645    jump_label(string);
646  } else {
647    DEBUG_PRINTF("ubasic.c: goto_statement(): no label specified\n");
648    ended = 1;
649    ubasic_error = UBASIC_E_UNK_LABEL;
650  }
651}
652/*---------------------------------------------------------------------------*/
653static void
654print_screen_statement(void)
655{
656  int val;
657  accept(TOKENIZER_PRINT_SCREEN);
658  val = expr();
659  accept(TOKENIZER_CR);
660  script_print_screen_statement(val);
661}
662/*---------------------------------------------------------------------------*/
663static void
664print_statement(void)
665{
666  static char buf[128];
667
668  buf[0]=0;
669  accept(TOKENIZER_PRINT);
670  do {
671    DEBUG_PRINTF("Print loop\n");
672    if(tokenizer_token() == TOKENIZER_STRING) {
673      tokenizer_string(string, sizeof(string));
674      sprintf(buf+strlen(buf), "%s", string);
675      tokenizer_next();
676    } else if(tokenizer_token() == TOKENIZER_COMMA) {
677      strcat(buf, " ");
678      tokenizer_next();
679    } else if(tokenizer_token() == TOKENIZER_SEMICOLON) {
680      tokenizer_next();
681    } else {
682      sprintf(buf+strlen(buf), "%d", expr());
683    }
684  } while(tokenizer_token() != TOKENIZER_CR && tokenizer_token() != TOKENIZER_ENDOFINPUT && tokenizer_token() != TOKENIZER_ELSE);
685  script_console_add_line(buf);
686  DEBUG_PRINTF("End of print\n");
687  accept_cr();
688}
689/*---------------------------------------------------------------------------*/
690static void
691if_statement(void)
692{
693  int r, else_cntr,endif_cntr;
694 
695  accept(TOKENIZER_IF);
696
697  r = relation(); /*relation(); */
698 // printf("if_statement: relation %d\n", r);
699  accept(TOKENIZER_THEN);
700  if (tokenizer_token() == TOKENIZER_CR) { 
701        if(if_stack_ptr < MAX_IF_STACK_DEPTH) {
702         if_stack[if_stack_ptr] = r;
703         if_stack_ptr++;
704        }
705          accept(TOKENIZER_CR);
706          if(r) {
707                return;
708          }
709          else {
710                else_cntr=endif_cntr=0;
711                  tokenizer_next();       
712                while(((tokenizer_token() != TOKENIZER_ELSE &&  tokenizer_token() != TOKENIZER_ENDIF)
713                       || else_cntr || endif_cntr) && tokenizer_token() != TOKENIZER_ENDOFINPUT){
714                  if( tokenizer_token() == TOKENIZER_IF) {else_cntr+=1;endif_cntr+=1;}             
715                  if( tokenizer_token() == TOKENIZER_ELSE) {
716                          else_cntr--;           
717                  }
718                  if( tokenizer_token() == TOKENIZER_ENDIF)  {
719                    endif_cntr--;
720            if (endif_cntr != else_cntr) else_cntr--;
721                  }   
722                  tokenizer_next();                                                         
723                 }
724            if(tokenizer_token() == TOKENIZER_ELSE) {
725                return;
726                }
727          }                                                 
728          accept(TOKENIZER_ENDIF);
729          accept(TOKENIZER_CR);                       
730          if(if_stack_ptr > 0) {
731             if_stack_ptr--;
732          }
733  }else {
734          if(r) {
735            statement();
736          } else {
737            do {
738              tokenizer_next();
739            } while(tokenizer_token() != TOKENIZER_ELSE &&
740                    tokenizer_token() != TOKENIZER_CR &&
741                    tokenizer_token() != TOKENIZER_ENDOFINPUT);
742            if(tokenizer_token() == TOKENIZER_ELSE) {
743              tokenizer_next();
744              statement();
745            } else if(tokenizer_token() == TOKENIZER_CR) {
746              tokenizer_next();
747            }
748          }
749  }
750}
751/*---------------------------------------------------------------------------*/
752static void
753else_statement(void)
754{
755  int r=0, endif_cntr;
756 
757  accept(TOKENIZER_ELSE);
758
759  if(if_stack_ptr > 0) {
760    r = if_stack[if_stack_ptr-1];
761  }
762 // printf("if_statement: relation %d\n", r);
763  if (tokenizer_token() == TOKENIZER_CR) { 
764          accept(TOKENIZER_CR);
765          if(!r) {
766                return;
767          }
768          else {                                     
769                endif_cntr=0;
770                tokenizer_next();       
771                while(((tokenizer_token() != TOKENIZER_ENDIF )
772                       || endif_cntr) && tokenizer_token() != TOKENIZER_ENDOFINPUT){
773                  if( tokenizer_token() == TOKENIZER_IF) {endif_cntr+=1;}                   
774                  if( tokenizer_token() == TOKENIZER_ENDIF)  {
775                    endif_cntr--;
776                  }   
777                  tokenizer_next();                                                         
778                 }
779          }                                                 
780//        accept(TOKENIZER_ENDIF);
781//        accept(TOKENIZER_CR);                       
782  }
783}
784/*---------------------------------------------------------------------------*/
785static void
786endif_statement(void)
787{
788        accept(TOKENIZER_ENDIF);
789        accept(TOKENIZER_CR);                 
790    if(if_stack_ptr > 0) {
791        if_stack_ptr--;
792    }
793}
794/*---------------------------------------------------------------------------*/
795
796/*---------------------------------------------------------------------------*/
797/* SELECT-STATEMENT                                                          */
798
799static void
800dec_select_stack(void)
801{
802  if(select_stack_ptr > 0) {
803      select_stack_ptr--;
804  } else {
805    DEBUG_PRINTF("select_statement: SELECT-Stack fail\n");
806    ended = 1;
807    ubasic_error = UBASIC_E_UNKNOWN_ERROR;  //besser neuer Fehler UBASIC_E_SELECT_STACK_EXHAUSTED,
808  }
809}
810/*---------------------------------------------------------------------------*/
811static void
812end_select(void)
813{
814  if(select_stack_ptr > 0) {
815    accept(TOKENIZER_END_SELECT);
816    accept(TOKENIZER_CR);
817    dec_select_stack();
818  } else {
819    DEBUG_PRINTF("ubasic.c: end_select(): end_select without select-statement\n");
820    ended = 1;
821    ubasic_error = UBASIC_E_PARSE;
822  }
823}
824/*---------------------------------------------------------------------------*/
825static void
826case_statement(void)
827{
828  int select_value, case_value_1, case_value_2, case_value_eq;
829  short case_run, case_goto = 0, case_gosub = 0;
830 
831  accept(TOKENIZER_CASE);
832  if(select_stack_ptr > 0) {
833    select_value = select_stack[select_stack_ptr - 1].select_value;
834    case_run = select_stack[select_stack_ptr - 1].case_run;
835 
836    if (!case_run) {
837      case_value_1 = expr();
838      case_value_eq = (select_value == case_value_1);
839      if (case_value_eq) { DEBUG_PRINTF("case_statement: case_value_eq %d, case_value %d\n", case_value_eq, case_value_1); } 
840
841      if(tokenizer_token() == TOKENIZER_TO) {
842        accept(TOKENIZER_TO);
843        case_value_2 = expr();
844        if (case_value_1 < case_value_2) {
845          case_value_eq = ((select_value >= case_value_1) && (select_value <= case_value_2));
846          DEBUG_PRINTF("case_statement: case_value %d to %d\n", case_value_1, case_value_2);
847        } else {
848          case_value_eq = ((select_value >= case_value_2) && (select_value <= case_value_1));
849          DEBUG_PRINTF("case_statement: case_value %d to %d\n", case_value_2, case_value_1);
850        }
851      } else if (tokenizer_token() == TOKENIZER_COMMA) {
852        do {
853          accept(TOKENIZER_COMMA);
854          if (case_value_eq) {
855            case_value_2 = expr();
856          } else {
857            case_value_1 = expr();
858            case_value_eq = (select_value == case_value_1);
859          }
860        } while (tokenizer_token() == TOKENIZER_COMMA);
861        DEBUG_PRINTF("case_statement: case_value_eq %d, case_value_comma %d\n", case_value_eq, case_value_1);
862      }
863     
864      accept(TOKENIZER_SEMICOLON);
865      if (case_value_eq) {
866        case_goto = (tokenizer_token() == TOKENIZER_GOTO);
867        case_gosub = (tokenizer_token() == TOKENIZER_GOSUB);
868        statement();
869        DEBUG_PRINTF("case_statement: case execute\n");
870        case_run = 1;
871        select_stack[select_stack_ptr - 1].case_run = case_run;
872      } else {
873        DEBUG_PRINTF("case_statement: case jump; case_run: %d\n", case_run);
874        accept_cr();
875      }
876    } else {accept_cr();}
877    if (case_goto) { dec_select_stack(); } else {
878      if (!case_gosub) {
879        if ((tokenizer_token() != TOKENIZER_CASE) && (tokenizer_token() != TOKENIZER_CASE_ELSE) &&
880           (tokenizer_token() != TOKENIZER_END_SELECT)) {
881           DEBUG_PRINTF("ubasic.c: select_statement(): don't found case, case_else or end_select\n");
882           ended = 1;
883           ubasic_error = UBASIC_E_PARSE;
884        } else {
885          if (tokenizer_token() == TOKENIZER_END_SELECT) { end_select(); }
886        }
887      } 
888    }
889  } else {
890    DEBUG_PRINTF("case_statement: SELECT-Stack fail\n");
891    ended = 1;
892    ubasic_error = UBASIC_E_UNKNOWN_ERROR;  //besser neuer Fehler UBASIC_E_SELECT_STACK_EXHAUSTED,
893  }
894}
895/*---------------------------------------------------------------------------*/
896static void
897case_else_statement(void)
898{
899  short case_goto = 0, case_gosub = 0;
900 
901  accept(TOKENIZER_CASE_ELSE);
902  if(select_stack_ptr > 0) {
903    if (!select_stack[select_stack_ptr - 1].case_run) {
904      case_goto = (tokenizer_token() == TOKENIZER_GOTO);
905      case_gosub = (tokenizer_token() == TOKENIZER_GOSUB);
906      statement();
907      DEBUG_PRINTF("case_else_statement: case_else execute\n");
908    } else {
909      DEBUG_PRINTF("case_else_statement: case_else jump; case_run: %d\n", select_stack[select_stack_ptr - 1].case_run);
910      accept_cr();
911    }
912    if (case_goto) { dec_select_stack(); } else {
913      if (!case_gosub) {
914        if (tokenizer_token() != TOKENIZER_END_SELECT) {
915          DEBUG_PRINTF("ubasic.c: select_statement(): don't found end_select\n");
916          ended = 1;
917          ubasic_error = UBASIC_E_PARSE;
918        } else { end_select(); }
919      }
920    }
921  } else {
922    DEBUG_PRINTF("case_else_statement: SELECT-Stack fault\n");
923    ended = 1;
924    ubasic_error = UBASIC_E_UNKNOWN_ERROR;  //besser neuer Fehler UBASIC_E_SELECT_STACK_EXHAUSTED,
925  }
926}
927/*---------------------------------------------------------------------------*/
928static void
929select_statement(void)
930{
931 
932  int select_value;
933 
934  accept(TOKENIZER_SELECT);
935  select_value = expr(); 
936  accept(TOKENIZER_CR);
937 
938  if(select_stack_ptr < MAX_SELECT_STACK_DEPTH) {
939    select_stack[select_stack_ptr].select_value = select_value;
940    select_stack[select_stack_ptr].case_run = 0;
941    DEBUG_PRINTF("select_statement: new select, value %d\n",select_stack[select_stack_ptr].select_value);
942    select_stack_ptr++;
943    if (tokenizer_token() != TOKENIZER_CASE) {
944      DEBUG_PRINTF("ubasic.c: select_statement(): don't found case-statement\n");
945      ended = 1;
946      ubasic_error = UBASIC_E_PARSE;
947    }
948    //NEU f?r diekten "case"-befehl
949    else { case_statement(); }
950    //---------------------------
951  } else {
952    DEBUG_PRINTF("select_statement: SELECT-stack depth exceeded\n");
953    ended = 1;
954    ubasic_error = UBASIC_E_UNKNOWN_ERROR;  //besser neuer Fehler UBASIC_E_SELECT_STACK_EXHAUSTED,
955  }
956}
957/* SELECT-STATEMENT END                                                      */
958
959/*---------------------------------------------------------------------------*/
960static void
961let_statement(void)
962{
963 
964  int var;
965
966  var = tokenizer_variable_num();
967
968  accept(TOKENIZER_VARIABLE);
969  accept(TOKENIZER_EQ);
970  ubasic_set_variable(var, expr());
971  DEBUG_PRINTF("let_statement: assign %d to %d\n", variables[var], var);
972  accept_cr();
973}
974/*---------------------------------------------------------------------------*/
975static void
976rem_statement(void)
977{
978  accept(TOKENIZER_REM);
979  DEBUG_PRINTF("rem_statement\n");
980  accept(TOKENIZER_CR);
981}
982/*---------------------------------------------------------------------------*/
983static void
984cls_statement(void)
985{
986  accept(TOKENIZER_CLS);
987  script_console_clear();
988  DEBUG_PRINTF("cls_statement\n");
989  accept(TOKENIZER_CR);
990}
991/*---------------------------------------------------------------------------*/
992static void
993gosub_statement(void)
994{
995  accept(TOKENIZER_GOSUB);
996  if(tokenizer_token() == TOKENIZER_STRING) {
997    tokenizer_string(string, sizeof(string));
998    do {
999    tokenizer_next();
1000    } while(tokenizer_token() != TOKENIZER_CR);
1001    accept(TOKENIZER_CR);
1002    if(gosub_stack_ptr < MAX_GOSUB_STACK_DEPTH) {
1003/*    tokenizer_line_number_inc();*/
1004      gosub_stack[gosub_stack_ptr] = tokenizer_line_number();
1005      gosub_stack_ptr++;
1006      jump_label(string);
1007    } else {
1008      DEBUG_PRINTF("gosub_statement: gosub stack exhausted\n");
1009      ended = 1;
1010      ubasic_error = UBASIC_E_GOSUB_STACK_EXHAUSTED;
1011    }
1012  } else {
1013    DEBUG_PRINTF("ubasic.c: goto_statement(): no label specified\n");
1014    ended = 1;
1015    ubasic_error = UBASIC_E_UNK_LABEL;
1016  }
1017}
1018/*---------------------------------------------------------------------------*/
1019static void
1020return_statement(void)
1021{
1022  accept(TOKENIZER_RETURN);
1023  if(gosub_stack_ptr > 0) {
1024    gosub_stack_ptr--;
1025    jump_line(gosub_stack[gosub_stack_ptr]);
1026  } else {
1027    DEBUG_PRINTF("return_statement: non-matching return\n");
1028    ended = 1;
1029    ubasic_error = UBASIC_E_UNMATCHED_RETURN;
1030  }
1031}
1032/*---------------------------------------------------------------------------*/
1033static void
1034next_statement(void)
1035{
1036  int var, value;
1037 
1038  accept(TOKENIZER_NEXT);
1039  var = tokenizer_variable_num();
1040  accept(TOKENIZER_VARIABLE);
1041  if(for_stack_ptr > 0 &&
1042     var == for_stack[for_stack_ptr - 1].for_variable) {
1043    value = ubasic_get_variable(var) + for_stack[for_stack_ptr - 1].step;
1044    ubasic_set_variable(var, value);
1045   
1046    if(((for_stack[for_stack_ptr - 1].step > 0) && (value <= for_stack[for_stack_ptr - 1].to)) ||
1047       ((for_stack[for_stack_ptr - 1].step < 0) && (value >= for_stack[for_stack_ptr - 1].to)))
1048        jump_line(for_stack[for_stack_ptr - 1].line_after_for);
1049    else {
1050      for_stack_ptr--;
1051      accept(TOKENIZER_CR);
1052    }
1053  } else {
1054    DEBUG_PRINTF("next_statement: non-matching next (expected %d, found %d)\n", for_stack[for_stack_ptr - 1].for_variable, var);
1055    accept(TOKENIZER_CR);
1056  }
1057
1058}
1059/*---------------------------------------------------------------------------*/
1060static void
1061for_statement(void)
1062{
1063  int for_variable, to, step;
1064 
1065  accept(TOKENIZER_FOR);
1066  for_variable = tokenizer_variable_num();
1067  accept(TOKENIZER_VARIABLE);
1068  accept(TOKENIZER_EQ);
1069  ubasic_set_variable(for_variable, expr());
1070  accept(TOKENIZER_TO);
1071  to = expr();                     
1072  step = 1;
1073  if (tokenizer_token() != TOKENIZER_CR) {
1074          accept(TOKENIZER_STEP);
1075          step = expr();         
1076  }
1077  accept(TOKENIZER_CR);
1078
1079  if(for_stack_ptr < MAX_FOR_STACK_DEPTH) {
1080    for_stack[for_stack_ptr].line_after_for = tokenizer_line_number();
1081    for_stack[for_stack_ptr].for_variable = for_variable;
1082    for_stack[for_stack_ptr].to = to;
1083    for_stack[for_stack_ptr].step = step;
1084    DEBUG_PRINTF("for_statement: new for, var %d to %d\n",
1085                 for_stack[for_stack_ptr].for_variable,
1086                 for_stack[for_stack_ptr].to);
1087                 
1088    for_stack_ptr++;
1089  } else {
1090    DEBUG_PRINTF("for_statement: for stack depth exceeded\n");
1091  }
1092}
1093/*---------------------------------------------------------------------------*/
1094static void
1095do_statement(void)
1096{
1097  accept(TOKENIZER_DO);
1098  accept(TOKENIZER_CR);
1099  if(do_stack_ptr < MAX_DO_STACK_DEPTH) {
1100     do_stack[do_stack_ptr] = tokenizer_line_number();
1101     do_stack_ptr++;
1102  }
1103}
1104/*---------------------------------------------------------------------------*/
1105static void
1106until_statement(void)
1107{
1108  int r;
1109 
1110  accept(TOKENIZER_UNTIL);
1111  r = relation();
1112  if(!r) {
1113    if(do_stack_ptr > 0) {
1114      jump_line(do_stack[do_stack_ptr-1]);
1115    }
1116  }
1117  else {
1118    do_stack_ptr--;
1119        accept_cr();
1120  }
1121
1122}
1123/*---------------------------------------------------------------------------*/
1124static void
1125while_statement(void)
1126{
1127  int r, while_cntr;
1128 
1129  accept(TOKENIZER_WHILE);
1130  if(while_stack_ptr < MAX_WHILE_STACK_DEPTH) {
1131    if ((while_stack_ptr == 0)||((while_stack_ptr > 0) && (while_stack[while_stack_ptr-1] != tokenizer_line_number()))){
1132      while_stack[while_stack_ptr] = tokenizer_line_number();
1133      while_stack_ptr++;
1134    }
1135  }
1136  r = relation();
1137  if(!r) {
1138        while_cntr=0;
1139    while((tokenizer_token() != TOKENIZER_WEND  || while_cntr ) &&
1140            tokenizer_token() != TOKENIZER_ENDOFINPUT){   
1141            if (tokenizer_token() == TOKENIZER_WHILE) while_cntr+=1;
1142            if (tokenizer_token() == TOKENIZER_WEND) while_cntr-=1;           
1143          tokenizer_next();
1144        } 
1145    while_stack_ptr--;
1146   
1147    accept(TOKENIZER_WEND);
1148    accept(TOKENIZER_CR);       
1149  }
1150  else  {
1151        accept_cr();       
1152  }
1153}
1154/*---------------------------------------------------------------------------*/
1155static void
1156wend_statement(void)
1157{
1158  accept(TOKENIZER_WEND);
1159  if(while_stack_ptr > 0) {
1160    jump_line(while_stack[while_stack_ptr-1]);
1161  }
1162  else {
1163        accept_cr();
1164  }
1165}
1166/*---------------------------------------------------------------------------*/
1167static void
1168end_statement(void)
1169{
1170  accept(TOKENIZER_END);
1171  ended = 1;
1172}
1173/*---------------------------------------------------------------------------*/
1174static void
1175click_statement(void)
1176{
1177  accept(TOKENIZER_CLICK);
1178  tokenizer_string(string, sizeof(string));
1179  ubasic_camera_click(string);
1180  tokenizer_next();
1181  DEBUG_PRINTF("End of click\n");
1182  accept_cr();
1183}
1184/*---------------------------------------------------------------------------*/
1185static void
1186press_statement(void)
1187{
1188  accept(TOKENIZER_PRESS);
1189  tokenizer_string(string, sizeof(string));
1190  ubasic_camera_press(string);
1191  tokenizer_next();
1192  DEBUG_PRINTF("End of press\n");
1193  accept_cr();
1194}
1195/*---------------------------------------------------------------------------*/
1196static void
1197release_statement(void)
1198{
1199  accept(TOKENIZER_RELEASE);
1200  tokenizer_string(string, sizeof(string));
1201  ubasic_camera_release(string);
1202  tokenizer_next();
1203  DEBUG_PRINTF("End of release\n");
1204  accept_cr();
1205}
1206/*---------------------------------------------------------------------------*/
1207static void
1208sleep_statement(void)
1209{
1210  int val;
1211  accept(TOKENIZER_SLEEP);
1212  val = expr();
1213  ubasic_camera_sleep(val);
1214  DEBUG_PRINTF("End of sleep\n");
1215  accept_cr();
1216}
1217/*---------------------------------------------------------------------------*/
1218static void
1219shoot_statement(void)
1220{
1221  accept(TOKENIZER_SHOOT);
1222  ubasic_camera_shoot();
1223  DEBUG_PRINTF("End of shoot\n");
1224  accept_cr();
1225}
1226
1227/*---------------------------------------------------------------------------*/
1228
1229#ifdef INCLUDE_OLD_GET__SYNTAX
1230
1231static void get_tv96_statement()
1232{
1233    int var;
1234    accept(TOKENIZER_GET_TV96);
1235    var = tokenizer_variable_num();
1236    accept(TOKENIZER_VARIABLE);
1237    ubasic_set_variable(var, shooting_get_tv96());
1238    accept_cr();
1239}
1240
1241static void get_user_tv96_statement()
1242{
1243    int var;
1244    accept(TOKENIZER_GET_USER_TV96);
1245    var = tokenizer_variable_num();
1246    accept(TOKENIZER_VARIABLE);
1247    ubasic_set_variable(var, shooting_get_user_tv96());
1248    accept_cr();
1249}
1250
1251
1252static void get_user_tv_id_statement()
1253{
1254    int var;
1255    accept(TOKENIZER_GET_USER_TV_ID);
1256    var = tokenizer_variable_num();
1257    accept(TOKENIZER_VARIABLE);
1258    ubasic_set_variable(var, shooting_get_user_tv_id());
1259    accept_cr();
1260}
1261
1262static void get_av96_statement()
1263{
1264    int var;
1265    accept(TOKENIZER_GET_AV96);
1266    var = tokenizer_variable_num();
1267    accept(TOKENIZER_VARIABLE);
1268    ubasic_set_variable(var, shooting_get_av96());
1269    accept_cr();
1270}
1271
1272static void get_user_av96_statement()
1273{
1274    int var;
1275    accept(TOKENIZER_GET_USER_AV96);
1276    var = tokenizer_variable_num();
1277    accept(TOKENIZER_VARIABLE);
1278    ubasic_set_variable(var, shooting_get_user_av96());
1279    accept_cr();
1280}
1281
1282static void get_user_av_id_statement()
1283{
1284    int var;
1285    accept(TOKENIZER_GET_USER_AV_ID);
1286    var = tokenizer_variable_num();
1287    accept(TOKENIZER_VARIABLE);
1288    ubasic_set_variable(var, shooting_get_user_av_id());
1289    accept_cr();
1290}
1291
1292static void get_zoom_statement()
1293{
1294    int var;
1295    accept(TOKENIZER_GET_ZOOM);
1296    var = tokenizer_variable_num();
1297    accept(TOKENIZER_VARIABLE);
1298    ubasic_set_variable(var, shooting_get_zoom());
1299    accept_cr();
1300}
1301
1302static void get_focus_statement()
1303{
1304    int var;
1305    accept(TOKENIZER_GET_FOCUS);
1306    var = tokenizer_variable_num();
1307    accept(TOKENIZER_VARIABLE);
1308    ubasic_set_variable(var, shooting_get_subject_distance());
1309    accept_cr();
1310}
1311
1312static void get_near_limit_statement()
1313{
1314    int var;
1315    accept(TOKENIZER_GET_NEAR_LIMIT);
1316    var = tokenizer_variable_num();
1317    accept(TOKENIZER_VARIABLE);
1318    ubasic_set_variable(var, shooting_get_near_limit_of_acceptable_sharpness());
1319    accept_cr();
1320}
1321
1322static void get_far_limit_statement()
1323{
1324    int var;
1325    accept(TOKENIZER_GET_FAR_LIMIT);
1326    var = tokenizer_variable_num();
1327    accept(TOKENIZER_VARIABLE);
1328    ubasic_set_variable(var, shooting_get_far_limit_of_acceptable_sharpness());
1329    accept_cr();
1330}
1331
1332static void get_dof_statement()
1333{
1334    int var;
1335    accept(TOKENIZER_GET_DOF);
1336    var = tokenizer_variable_num();
1337    accept(TOKENIZER_VARIABLE);
1338    ubasic_set_variable(var, shooting_get_depth_of_field());
1339    accept_cr();
1340}
1341
1342static void get_hyperfocal_distance_statement()
1343{
1344    int var;
1345    accept(TOKENIZER_GET_HYPERFOCAL_DIST);
1346    var = tokenizer_variable_num();
1347    accept(TOKENIZER_VARIABLE);
1348    ubasic_set_variable(var, shooting_get_hyperfocal_distance());
1349    accept_cr();
1350}
1351
1352static void get_disk_size_statement()
1353{
1354    int var;
1355    accept(TOKENIZER_GET_DISK_SIZE);
1356    var = tokenizer_variable_num();
1357    accept(TOKENIZER_VARIABLE);
1358    ubasic_set_variable(var, GetTotalCardSpaceKb());
1359    accept_cr();
1360}
1361
1362static void get_free_disk_space_statement()
1363{
1364    int var;
1365    accept(TOKENIZER_GET_FREE_DISK_SPACE);
1366    var = tokenizer_variable_num();
1367    accept(TOKENIZER_VARIABLE);
1368    ubasic_set_variable(var, GetFreeCardSpaceKb());
1369    accept_cr();
1370}
1371
1372static void get_jpg_count_statement()
1373{
1374    int var;
1375    accept(TOKENIZER_GET_JPG_COUNT);
1376    var = tokenizer_variable_num();
1377    accept(TOKENIZER_VARIABLE);
1378    ubasic_set_variable(var, GetJpgCount());
1379    accept_cr();
1380}
1381
1382static void get_raw_count_statement()
1383{
1384    int var;
1385    accept(TOKENIZER_GET_RAW_COUNT);
1386    var = tokenizer_variable_num();
1387    accept(TOKENIZER_VARIABLE);
1388    ubasic_set_variable(var, GetRawCount());
1389    accept_cr();
1390}
1391
1392static void get_vbatt_statement()
1393{
1394    int var;
1395    accept(TOKENIZER_GET_VBATT);
1396    var = tokenizer_variable_num();
1397    accept(TOKENIZER_VARIABLE);
1398    ubasic_set_variable(var, (unsigned short)stat_get_vbatt());
1399       
1400    accept_cr();
1401}
1402
1403static void get_prop_statement()
1404{
1405    int var, var1;
1406    accept(TOKENIZER_GET_PROP);
1407    var = expr();
1408    var1 = tokenizer_variable_num();
1409    accept(TOKENIZER_VARIABLE);
1410    ubasic_set_variable(var1, shooting_get_prop(var));
1411       
1412    accept_cr();
1413}
1414
1415static void get_iso_market_statement()
1416{
1417    int var;
1418    accept(TOKENIZER_GET_ISO_MARKET);
1419    var = tokenizer_variable_num();
1420    accept(TOKENIZER_VARIABLE);
1421    ubasic_set_variable(var, (int)shooting_get_iso_market());
1422    accept_cr();
1423}
1424
1425static void get_iso_real_statement()
1426{
1427    int var;
1428    accept(TOKENIZER_GET_ISO_REAL);
1429    var = tokenizer_variable_num();
1430    accept(TOKENIZER_VARIABLE);
1431    ubasic_set_variable(var, (int)shooting_get_iso_real());
1432    accept_cr();
1433}
1434
1435static void get_bv96_statement()
1436{
1437    int var;
1438    accept(TOKENIZER_GET_BV96);
1439    var = tokenizer_variable_num();
1440    accept(TOKENIZER_VARIABLE);
1441    ubasic_set_variable(var, (int)shooting_get_bv96());
1442    accept_cr();
1443}
1444
1445static void get_sv96_statement()
1446{
1447    int var;
1448    accept(TOKENIZER_GET_SV96);
1449    var = tokenizer_variable_num();
1450    accept(TOKENIZER_VARIABLE);
1451    ubasic_set_variable(var, (int)shooting_get_sv96());
1452    accept_cr();
1453}
1454
1455static void get_iso_mode_statement()
1456{
1457    int var;
1458    accept(TOKENIZER_GET_ISO_MODE);
1459    var = tokenizer_variable_num();
1460    accept(TOKENIZER_VARIABLE);
1461    ubasic_set_variable(var, shooting_get_iso_mode());
1462    accept_cr();
1463}
1464
1465#endif
1466
1467
1468static void set_tv96_statement()
1469{
1470    int to;
1471    accept(TOKENIZER_SET_TV96);
1472    to = expr();
1473    shooting_set_tv96((short int)to, SET_LATER);
1474    accept_cr();
1475}
1476
1477static void play_sound_statement()
1478{
1479    int to;
1480    accept(TOKENIZER_PLAY_SOUND);
1481    to = expr();
1482    play_sound(to);
1483    accept_cr();
1484}
1485static void set_shutter_speed_statement()
1486{
1487    int to;
1488    accept(TOKENIZER_SET_SHUTTER_SPEED);
1489    to = expr();
1490    shooting_set_shutter_speed_ubasic(to, SET_LATER);
1491    accept_cr();
1492}
1493
1494static void set_tv96_direct_statement()
1495{
1496    int to;
1497    accept(TOKENIZER_SET_TV96_DIRECT);
1498    to = expr();
1499    shooting_set_tv96_direct((short int)to, SET_LATER);
1500    accept_cr();
1501}
1502
1503static void set_user_tv96_statement()
1504{
1505    int to;
1506    accept(TOKENIZER_SET_USER_TV96);
1507    to = expr();
1508    shooting_set_user_tv96((short int)to);
1509    accept_cr();
1510}
1511
1512static void set_user_tv_by_id_statement()
1513{
1514    int to;
1515    accept(TOKENIZER_SET_USER_TV_BY_ID);
1516    to = expr();
1517    shooting_set_user_tv_by_id(to);
1518    accept_cr();
1519}
1520
1521static void set_user_tv_by_id_rel_statement()
1522{
1523    int to;
1524    accept(TOKENIZER_SET_USER_TV_BY_ID_REL);
1525    to = expr();
1526    shooting_set_user_tv_by_id_rel(to);
1527    accept_cr();
1528}
1529
1530static void set_sv96_statement()
1531{
1532    int to;
1533    accept(TOKENIZER_SET_SV96);
1534    to = expr();
1535    shooting_set_sv96((short int)to, SET_LATER);
1536    accept_cr();
1537}
1538
1539
1540/*---------------------------------------------------------------------------*/
1541
1542
1543static void set_av96_statement()
1544{
1545    int to;
1546    accept(TOKENIZER_SET_AV96);
1547    to = expr();
1548    shooting_set_av96((short int)to, SET_LATER);
1549    accept_cr();
1550}
1551
1552static void set_av96_direct_statement()
1553{
1554    int to;
1555    accept(TOKENIZER_SET_AV96_DIRECT);
1556    to = expr();
1557    shooting_set_av96_direct((short int)to, SET_LATER);
1558    accept_cr();
1559}
1560
1561static void set_user_av96_statement()
1562{
1563    int to;
1564    accept(TOKENIZER_SET_USER_AV96);
1565    to = expr();
1566    shooting_set_user_av96((short int)to);
1567    accept_cr();
1568}
1569
1570static void set_user_av_by_id_statement()
1571{
1572    int to;
1573    accept(TOKENIZER_SET_USER_AV_BY_ID);
1574    to = expr();
1575    shooting_set_user_av_by_id(to);
1576    accept_cr();
1577}
1578
1579static void set_user_av_by_id_rel_statement()
1580{
1581    int to;
1582    accept(TOKENIZER_SET_USER_AV_BY_ID_REL);
1583    to = expr();
1584    shooting_set_user_av_by_id_rel(to);
1585    accept_cr();
1586}
1587
1588/*---------------------------------------------------------------------------*/
1589
1590static void set_zoom_statement()
1591{
1592    int to;
1593    accept(TOKENIZER_SET_ZOOM);
1594    to = expr();
1595    shooting_set_zoom(to);
1596    accept_cr();
1597}
1598
1599static void set_zoom_rel_statement()
1600{
1601    int to;
1602    accept(TOKENIZER_SET_ZOOM_REL);
1603    to = expr();
1604    shooting_set_zoom_rel(to);
1605    accept_cr();
1606}
1607
1608static void set_zoom_speed_statement()
1609{
1610    int to;
1611    accept(TOKENIZER_SET_ZOOM_SPEED);
1612    to = expr();
1613    shooting_set_zoom_speed(to);
1614    accept_cr();
1615}
1616
1617/*---------------------------------------------------------------------------*/
1618
1619
1620static void set_ev_statement()
1621        {
1622            int to;
1623            accept(TOKENIZER_SET_EV);
1624            to = expr();
1625                shooting_set_prop(PROPCASE_EV_CORRECTION_1, to);
1626                shooting_set_prop(PROPCASE_EV_CORRECTION_2, to);
1627            accept_cr();
1628        }
1629
1630static void set_movie_status_statement()
1631{
1632    int to;
1633    accept(TOKENIZER_SET_MOVIE_STATUS);
1634    to = expr();
1635if (to==1) {
1636        if (movie_status == 4) {
1637        movie_status = 1;
1638}}
1639if (to==2) {
1640        if (movie_status == 1) {
1641        movie_status = 4;
1642}
1643}
1644if (to==3) {
1645        if (movie_status == 1 || 4) {
1646        movie_status = 5;
1647}}
1648
1649
1650    accept_cr();
1651}
1652
1653static void set_focus_statement()
1654{
1655    int to;
1656    accept(TOKENIZER_SET_FOCUS);
1657    to = expr();
1658    int m=mode_get()&MODE_SHOOTING_MASK;
1659    int mode_video=((m==MODE_VIDEO_STD) ||
1660                            (m==MODE_VIDEO_SPEED) || 
1661                            (m==MODE_VIDEO_COMPACT) ||
1662                            (m==MODE_VIDEO_MY_COLORS) ||
1663                            (m==MODE_VIDEO_COLOR_ACCENT));
1664#if CAM_HAS_MANUAL_FOCUS
1665    if (shooting_get_focus_mode() || (mode_video)) shooting_set_focus(to, SET_NOW);
1666    else shooting_set_focus(to, SET_LATER);
1667#else
1668    if (mode_video) shooting_set_focus(to, SET_NOW);
1669    else shooting_set_focus(to, SET_LATER);   
1670#endif   
1671    accept_cr();
1672}
1673
1674static void set_led_statement()
1675{
1676    int to, to1, to2;
1677    accept(TOKENIZER_SET_LED);
1678    to = expr();
1679    to1 = expr();
1680        to2 = 200;
1681        if (tokenizer_token() != TOKENIZER_CR && tokenizer_token() != TOKENIZER_ELSE ) {
1682                to2 = expr();
1683    }
1684        ubasic_set_led(to, to1, to2);
1685    accept_cr();
1686}
1687static void set_prop_statement()
1688{
1689    int to, to1;
1690    accept(TOKENIZER_SET_PROP);
1691    to = expr();
1692    to1 = expr();
1693        shooting_set_prop(to, to1);
1694    accept_cr();
1695}
1696
1697
1698
1699/*---------------------------------------------------------------------------*/
1700//ARM Begin
1701
1702
1703/*static void set_iso_market_statement()
1704{
1705    int to;
1706    accept(TOKENIZER_SET_ISO_MARKET);
1707    to = expr();
1708    shooting_set_iso_market(to);
1709    accept_cr();
1710}
1711
1712static void set_iso_real_delta_from_base_statement()
1713{
1714    int to;
1715    accept(TOKENIZER_SET_ISO_DL_F_B);
1716    to = expr();
1717    shooting_set_iso_real_delta_from_base(to);
1718    accept_cr();
1719}*/
1720
1721static void set_iso_real_statement()
1722{
1723    short int to;
1724    accept(TOKENIZER_SET_ISO_REAL);
1725    to = expr();
1726    shooting_set_iso_real(to, SET_LATER);
1727    accept_cr();
1728}
1729
1730//ARM End
1731
1732
1733static void set_iso_mode_statement()
1734{
1735    int to;
1736    accept(TOKENIZER_SET_ISO_MODE);
1737    to = expr();
1738    shooting_set_iso_mode(to);
1739    accept_cr();
1740}
1741static void set_raw_statement()
1742{
1743    int to;
1744    accept(TOKENIZER_SET_RAW);
1745    to = expr();
1746    ubasic_camera_set_raw(to);
1747    accept_cr();
1748}
1749static void set_raw_nr_statement()
1750{
1751    int to;
1752    accept(TOKENIZER_SET_RAW_NR);
1753    to = expr();
1754    ubasic_camera_set_nr(to);
1755    accept_cr();
1756}
1757
1758static void set_nd_filter_statement()
1759{
1760    int to;
1761    accept(TOKENIZER_SET_ND_FILTER);
1762    to = expr();
1763    shooting_set_nd_filter_state(to, SET_LATER);
1764    accept_cr();
1765}
1766
1767
1768static void set_autostart_statement()
1769{
1770    int to;
1771    accept(TOKENIZER_SET_SCRIPT_AUTOSTART);
1772    to = expr();
1773        if (to >= 0 && to <= 2) conf.script_startup=to;
1774        conf_save();
1775    accept_cr();
1776}
1777static void exit_alt_statement()
1778{
1779    int to;
1780    accept(TOKENIZER_EXIT_ALT);
1781    to = expr();
1782    exit_alt(to);
1783    accept_cr();
1784}
1785/*---------------------------------------------------------------------------*/
1786
1787static void wait_click_statement()
1788{
1789    int timeout=0;
1790    accept(TOKENIZER_WAIT_CLICK);
1791    if (tokenizer_token() != TOKENIZER_CR &&
1792        tokenizer_token() != TOKENIZER_ELSE ) {
1793        timeout = expr();
1794    }
1795    ubasic_camera_wait_click(timeout);
1796    accept_cr();
1797}
1798
1799static void is_key_statement(void)
1800{
1801    int var;
1802    accept(TOKENIZER_IS_KEY);
1803    var = tokenizer_variable_num();
1804    accept(TOKENIZER_VARIABLE);
1805    tokenizer_string(string, sizeof(string));
1806    tokenizer_next();
1807    ubasic_set_variable(var, ubasic_camera_is_clicked(string));
1808    DEBUG_PRINTF("End of is_key\n");
1809    accept_cr();
1810}
1811
1812static void wheel_left_statement(void){
1813  accept(TOKENIZER_WHEEL_LEFT);
1814#if defined (CAMERA_g7) || defined (CAMERA_sx100is)
1815  JogDial_CCW();
1816#endif
1817  accept_cr();
1818}
1819
1820
1821static void wheel_right_statement(void){
1822  accept(TOKENIZER_WHEEL_RIGHT);
1823#if defined (CAMERA_g7) || defined (CAMERA_sx100is)
1824  JogDial_CW();
1825#endif
1826  accept_cr();
1827}
1828
1829
1830static void shutdown_statement(void){
1831  accept(TOKENIZER_SHUT_DOWN);
1832  camera_shutdown_in_a_second();
1833  accept_cr();
1834}
1835
1836/*---------------------------------------------------------------------------*/
1837
1838static void md_get_cell_diff_statement()
1839{
1840    int var, col, row;
1841    accept(TOKENIZER_MD_GET_CELL_DIFF);
1842
1843                col=expr();tokenizer_next();
1844
1845                row=expr();tokenizer_next();
1846
1847    var = tokenizer_variable_num();
1848    accept(TOKENIZER_VARIABLE);
1849       
1850    ubasic_set_variable(var, md_get_cell_diff(col,row));
1851    accept_cr();
1852}
1853
1854static void md_detect_motion_statement()
1855{
1856
1857 int columns;
1858 int rows;
1859 int pixel_measure_mode;
1860 int detection_timeout;
1861 int measure_interval;
1862 int threshold;
1863 int draw_grid=0;
1864 int clipping_region_mode=0;
1865 int clipping_region_row1=0;
1866 int clipping_region_column1=0;
1867 int clipping_region_row2=0;
1868 int clipping_region_column2=0;
1869 int ret_var_num;
1870 int parameters=0;
1871 int pixels_step=1;
1872 int msecs_before_trigger=0;
1873
1874 //static char buf[128];
1875
1876    accept(TOKENIZER_MD_DETECT_MOTION);
1877
1878//              sprintf(buf,"token: %d",tokenizer_token()); script_console_add_line(buf);
1879                columns=expr();tokenizer_next();
1880
1881//              sprintf(buf,"tk: %d",tokenizer_token()); script_console_add_line(buf);
1882                rows=expr();tokenizer_next();
1883
1884//              sprintf(buf,"tk %d",tokenizer_token()); script_console_add_line(buf);
1885                pixel_measure_mode=expr();tokenizer_next();
1886
1887                detection_timeout=expr();tokenizer_next();
1888
1889//              printf("token: %d",tokenizer_token());
1890                measure_interval=expr();tokenizer_next();
1891
1892//              printf("token: %d",tokenizer_token());
1893                threshold=expr();tokenizer_next();
1894
1895//              printf("token: %d",tokenizer_token());
1896                draw_grid=expr();tokenizer_next();
1897
1898//              printf("token: %d",tokenizer_token());
1899    ret_var_num = tokenizer_variable_num();
1900
1901//              printf("%d,%d,%d,%d",columns,rows,pixel_measure_mode, detection_timeout);
1902
1903    accept(TOKENIZER_VARIABLE);
1904
1905
1906    if (tokenizer_token() != TOKENIZER_CR && tokenizer_token() != TOKENIZER_ELSE) {
1907                        // eat COMA     
1908//                      tokenizer_next();
1909                }
1910
1911
1912               
1913    if (tokenizer_token() != TOKENIZER_CR && tokenizer_token() != TOKENIZER_ELSE) {
1914                                tokenizer_next();
1915        clipping_region_mode = expr();
1916    }
1917    if (tokenizer_token() != TOKENIZER_CR && tokenizer_token() != TOKENIZER_ELSE ) {
1918                                tokenizer_next();
1919        clipping_region_column1 = expr();
1920    }
1921    if (tokenizer_token() != TOKENIZER_CR && tokenizer_token() != TOKENIZER_ELSE ) {
1922                                tokenizer_next();
1923        clipping_region_row1 = expr();
1924    }
1925    if (tokenizer_token() != TOKENIZER_CR && tokenizer_token() != TOKENIZER_ELSE ) {
1926                                tokenizer_next();
1927        clipping_region_column2 = expr();
1928    }
1929    if (tokenizer_token() != TOKENIZER_CR && tokenizer_token() != TOKENIZER_ELSE ) {
1930                                tokenizer_next();
1931        clipping_region_row2 = expr();
1932    }
1933    if (tokenizer_token() != TOKENIZER_CR && tokenizer_token() != TOKENIZER_ELSE ) {
1934                                tokenizer_next();
1935        parameters = expr();
1936    }
1937    if (tokenizer_token() != TOKENIZER_CR && tokenizer_token() != TOKENIZER_ELSE ) {
1938                                tokenizer_next();
1939        pixels_step = expr();
1940    }
1941
1942    if (tokenizer_token() != TOKENIZER_CR && tokenizer_token() != TOKENIZER_ELSE ) {
1943                                tokenizer_next();
1944        msecs_before_trigger = expr();
1945    }
1946                       
1947
1948    accept_cr();
1949
1950//              sprintf(buf,"[%dx%d] md:%d tmout:%d", columns, rows, pixel_measure_mode, detection_timeout);
1951//              script_console_add_line(buf);
1952
1953//              sprintf(buf,"int:%d trsh:%d g:%d vr:%d", measure_interval, threshold, draw_grid, ret_var_num);
1954//              script_console_add_line(buf);
1955
1956//              sprintf(buf,"clip %d [%d,%d][%d,%d]", clipping_region_mode, clipping_region_column1, clipping_region_row1, clipping_region_column2,clipping_region_row2);
1957//              script_console_add_line(buf);
1958
1959        md_init_motion_detector(
1960                        columns, rows, pixel_measure_mode, detection_timeout,
1961                        measure_interval, threshold, draw_grid, ret_var_num,
1962                        clipping_region_mode,
1963                        clipping_region_column1, clipping_region_row1,
1964                        clipping_region_column2, clipping_region_row2,
1965                        parameters, pixels_step, msecs_before_trigger
1966        );
1967}
1968
1969/*---------------------------------------------------------------------------*/
1970
1971static void shot_histo_enable_statement()
1972{
1973    int to;
1974    accept(TOKENIZER_SHOT_HISTO_ENABLE);
1975    to = expr();
1976    shot_histogram_enabled = to;
1977    accept_cr();
1978}
1979
1980
1981static void
1982statement(void)
1983{
1984  ubasic_token token;
1985
1986  token = tokenizer_token();
1987
1988  switch(token) {
1989
1990  case TOKENIZER_PRINT_SCREEN:
1991    print_screen_statement();
1992    break;
1993  case TOKENIZER_PRINT:
1994    print_statement();
1995    break;
1996
1997  case TOKENIZER_SLEEP:
1998    sleep_statement();
1999    break;
2000  case TOKENIZER_CLICK:
2001    click_statement();
2002    break;
2003  case TOKENIZER_PRESS:
2004    press_statement();
2005    break;
2006  case TOKENIZER_RELEASE:
2007    release_statement();
2008    break;
2009  case TOKENIZER_SHOOT:
2010    shoot_statement();
2011    break;
2012#ifdef INCLUDE_OLD_GET__SYNTAX
2013  case TOKENIZER_GET_TV96:
2014    get_tv96_statement();
2015    break;
2016  case TOKENIZER_GET_USER_TV96:
2017    get_user_tv96_statement();
2018    break;   
2019  case TOKENIZER_GET_USER_TV_ID:
2020    get_user_tv_id_statement();
2021    break;
2022  case TOKENIZER_GET_AV96:
2023    get_av96_statement();
2024    break; 
2025  case TOKENIZER_GET_USER_AV96:
2026    get_user_av96_statement();
2027    break;   
2028  case TOKENIZER_GET_USER_AV_ID:
2029    get_user_av_id_statement();
2030    break;
2031  case TOKENIZER_GET_ZOOM:
2032    get_zoom_statement();
2033    break;
2034  case TOKENIZER_GET_FOCUS:
2035    get_focus_statement();
2036    break;
2037  case TOKENIZER_GET_NEAR_LIMIT:
2038    get_near_limit_statement();
2039    break;
2040  case TOKENIZER_GET_FAR_LIMIT:
2041    get_far_limit_statement();
2042    break; 
2043  case TOKENIZER_GET_DOF:
2044    get_dof_statement();
2045    break;
2046  case TOKENIZER_GET_HYPERFOCAL_DIST:
2047    get_hyperfocal_distance_statement();
2048    break; 
2049  case TOKENIZER_GET_ISO_MARKET:
2050    get_iso_market_statement();
2051    break;
2052  case TOKENIZER_GET_ISO_REAL:
2053    get_iso_real_statement();
2054    break;
2055  case TOKENIZER_GET_BV96:
2056    get_bv96_statement();
2057    break; 
2058  case TOKENIZER_GET_SV96:
2059    get_sv96_statement();
2060    break;   
2061  case TOKENIZER_GET_ISO_MODE:
2062    get_iso_mode_statement();
2063    break;
2064  case TOKENIZER_GET_VBATT:
2065    get_vbatt_statement();
2066    break;
2067  case TOKENIZER_GET_DISK_SIZE:
2068    get_disk_size_statement();
2069    break;
2070  case TOKENIZER_GET_FREE_DISK_SPACE:
2071    get_free_disk_space_statement();
2072    break;
2073  case TOKENIZER_GET_JPG_COUNT:
2074    get_jpg_count_statement();
2075    break;
2076  case TOKENIZER_GET_RAW_COUNT:
2077    get_raw_count_statement();
2078    break;
2079  case TOKENIZER_GET_PROP:
2080    get_prop_statement();
2081    break;
2082#endif
2083  case TOKENIZER_SET_TV96_DIRECT:
2084    set_tv96_direct_statement();
2085    break;   
2086  case TOKENIZER_SET_TV96:
2087    set_tv96_statement();
2088    break; 
2089  case TOKENIZER_PLAY_SOUND:
2090    play_sound_statement();
2091    break; 
2092  case TOKENIZER_SET_SHUTTER_SPEED:
2093    set_shutter_speed_statement();
2094    break;   
2095  case TOKENIZER_SET_USER_TV96:
2096    set_user_tv96_statement();
2097    break;   
2098  case TOKENIZER_SET_USER_TV_BY_ID:
2099    set_user_tv_by_id_statement();
2100    break;
2101  case TOKENIZER_SET_USER_TV_BY_ID_REL:
2102    set_user_tv_by_id_rel_statement();
2103    break;
2104  case TOKENIZER_SET_AV96_DIRECT:
2105    set_av96_direct_statement();
2106    break;   
2107  case TOKENIZER_SET_AV96:
2108    set_av96_statement();
2109    break; 
2110   
2111  case TOKENIZER_SET_USER_AV96:
2112    set_user_av96_statement();
2113    break;   
2114  case TOKENIZER_SET_USER_AV_BY_ID:
2115    set_user_av_by_id_statement();
2116    break;
2117  case TOKENIZER_SET_USER_AV_BY_ID_REL:
2118    set_user_av_by_id_rel_statement();
2119    break;
2120   
2121  case TOKENIZER_SET_ND_FILTER:
2122    set_nd_filter_statement();
2123    break; 
2124 
2125  case TOKENIZER_SET_ZOOM:
2126    set_zoom_statement();
2127    break;
2128  case TOKENIZER_SET_ZOOM_REL:
2129    set_zoom_rel_statement();
2130    break;
2131  case TOKENIZER_SET_ZOOM_SPEED:
2132    set_zoom_speed_statement();
2133    break;
2134
2135  case TOKENIZER_SET_FOCUS:
2136    set_focus_statement();
2137    break;
2138  //ARM Begin
2139  /*case TOKENIZER_SET_ISO_MARKET:
2140    set_iso_market_statement();
2141    break;
2142  case TOKENIZER_SET_ISO_DL_F_B:
2143    set_iso_real_delta_from_base_statement();
2144    break;*/ 
2145  case TOKENIZER_SET_ISO_REAL:
2146    set_iso_real_statement();
2147    break;
2148  case TOKENIZER_SET_SV96:
2149    set_sv96_statement();
2150    break; 
2151 
2152  //ARM End
2153 
2154   
2155
2156  case TOKENIZER_SET_ISO_MODE:
2157    set_iso_mode_statement();
2158    break;
2159
2160  case TOKENIZER_SET_PROP:
2161    set_prop_statement();
2162    break;
2163  case TOKENIZER_SET_LED:
2164    set_led_statement();
2165    break;
2166
2167  case TOKENIZER_SET_EV:
2168        set_ev_statement();
2169   break;
2170   
2171    case TOKENIZER_SET_MOVIE_STATUS:
2172        set_movie_status_statement();
2173   break;
2174
2175  case TOKENIZER_WAIT_CLICK:
2176    wait_click_statement();
2177    break;
2178  case TOKENIZER_IS_KEY:
2179    is_key_statement();
2180    break;
2181
2182  case TOKENIZER_WHEEL_LEFT:
2183    wheel_left_statement();
2184    break;
2185  case TOKENIZER_WHEEL_RIGHT:
2186    wheel_right_statement();
2187    break;
2188
2189  case TOKENIZER_IF:
2190    if_statement();
2191    break;
2192  case TOKENIZER_ELSE:
2193    else_statement();
2194    break;
2195  case TOKENIZER_ENDIF:
2196    endif_statement();
2197    break;
2198  case TOKENIZER_SELECT:
2199    select_statement();
2200    break;
2201  case TOKENIZER_CASE:
2202    case_statement();
2203    break;
2204  case TOKENIZER_CASE_ELSE:
2205    case_else_statement();
2206    break;
2207  case TOKENIZER_GOTO:
2208    goto_statement();
2209    break;
2210  case TOKENIZER_GOSUB:
2211    gosub_statement();
2212    break;
2213  case TOKENIZER_RETURN:
2214    return_statement();
2215    break;
2216  case TOKENIZER_FOR:
2217    for_statement();
2218    break;
2219  case TOKENIZER_NEXT:
2220    next_statement();
2221    break;
2222  case TOKENIZER_DO:
2223    do_statement();
2224    break;
2225  case TOKENIZER_UNTIL:
2226    until_statement();
2227    break;
2228  case TOKENIZER_WHILE:
2229    while_statement();
2230    break;
2231  case TOKENIZER_WEND:
2232    wend_statement();
2233    break;
2234  case TOKENIZER_END:
2235    end_statement();
2236    break;
2237  case TOKENIZER_LET:
2238    accept(TOKENIZER_LET);
2239    /* Fall through. */
2240  case TOKENIZER_VARIABLE:
2241    let_statement();
2242    break;
2243  case TOKENIZER_REM:
2244    rem_statement();
2245    break;
2246  case TOKENIZER_CLS:
2247    cls_statement();
2248    break;
2249  case TOKENIZER_SET_RAW:
2250    set_raw_statement();
2251    break;
2252  case TOKENIZER_SET_RAW_NR:
2253    set_raw_nr_statement();
2254    break;
2255  case TOKENIZER_SET_SCRIPT_AUTOSTART:
2256    set_autostart_statement();
2257    break;
2258  case TOKENIZER_EXIT_ALT:
2259    exit_alt_statement();
2260    break;
2261  case TOKENIZER_SHUT_DOWN:
2262    shutdown_statement();
2263    break;
2264
2265// >> mx3 . motion detector
2266        case   TOKENIZER_MD_DETECT_MOTION:
2267                md_detect_motion_statement();
2268                break;
2269        case  TOKENIZER_MD_GET_CELL_DIFF:
2270                md_get_cell_diff_statement();
2271                break;
2272// << mx3 . motion_detector
2273
2274  case TOKENIZER_SHOT_HISTO_ENABLE:
2275    shot_histo_enable_statement();
2276    break;
2277
2278  default:
2279    DEBUG_PRINTF("ubasic.c: statement(): not implemented %d\n", token);
2280    ended = 1;
2281    ubasic_error = UBASIC_E_UNK_STATEMENT;
2282  }
2283}
2284/*---------------------------------------------------------------------------*/
2285static void
2286line_statement(void)
2287{
2288  /* line numbers have been removed */
2289  DEBUG_PRINTF("----------- Line number %d ---------\n", tokenizer_line_number());
2290  /*    current_linenum = tokenizer_num();*/
2291  if (tokenizer_token() == TOKENIZER_LABEL) {
2292#ifdef DEBUG
2293      tokenizer_label(string, sizeof(string));
2294      DEBUG_PRINTF("line_statement: label: %s\n", string );
2295#endif
2296      accept(TOKENIZER_LABEL);
2297      accept(TOKENIZER_CR);
2298      return;
2299  }
2300  statement();
2301  return;
2302}
2303/*---------------------------------------------------------------------------*/
2304void
2305ubasic_run(void)
2306{
2307  if(tokenizer_finished()) {
2308    DEBUG_PRINTF("uBASIC program finished\n");
2309    return;
2310  }
2311
2312  line_statement();
2313}
2314/*---------------------------------------------------------------------------*/
2315int
2316ubasic_finished(void)
2317{
2318  return ended || tokenizer_finished();
2319}
2320/*---------------------------------------------------------------------------*/
2321void
2322ubasic_set_variable(int varnum, int value)
2323{
2324  if(varnum >= 0 && varnum < MAX_VARNUM) {
2325    variables[varnum] = value;
2326  }
2327}
2328/*---------------------------------------------------------------------------*/
2329int
2330ubasic_get_variable(int varnum)
2331{
2332  if(varnum >= 0 && varnum < MAX_VARNUM) {
2333    return variables[varnum];
2334  }
2335  return 0;
2336}
2337/*---------------------------------------------------------------------------*/
2338void
2339ubasic_end() {
2340}
2341/*---------------------------------------------------------------------------*/
2342
2343
2344
2345
2346
2347
2348
Note: See TracBrowser for help on using the repository browser.