OpenCores
URL https://opencores.org/ocsvn/gecko3/gecko3/trunk

Subversion Repositories gecko3

[/] [gecko3/] [trunk/] [GECKO3COM/] [gecko3com-fw/] [examples/] [scpi_parser_full_spec.re] - Rev 33

Go to most recent revision | Compare with Previous | Blame | View Log

/* GECKO3COM
 *
 * Copyright (C) 2009 by
 *   ___    ____  _   _
 *  (  _`\ (  __)( ) ( )   
 *  | (_) )| (_  | |_| |   Berne University of Applied Sciences
 *  |  _ <'|  _) |  _  |   School of Engineering and
 *  | (_) )| |   | | | |   Information Technology
 *  (____/'(_)   (_) (_)
 *
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details. 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

/*********************************************************************/
/** \cond EXAMPLE \file     scpi_parser.re
 *********************************************************************
 * \brief     Parser for the SCPI commands. Excecutes the necessary 
 *            Function.
 *
 *            The SCPI Parser is developed as a set of regular 
 *            expressions and blocks of C code to excecute. \n
 *            We use the opensource programm re2c (http://re2c.org/) to
 *            generate the parser. With solution we have an easy to 
 *            maintain and extend parser definitions without the hassle 
 *            of optimizing the parser sourcecode by hand. \n \n
 *            Don't forget to use the "-s" option with re2c to generate
 *            nested ifs for some switches because sdcc hates long 
 *            switch case structures.
 *
 * \todo      use newer re2c to generate state event diagramm to include here
 *
 * \author    Christoph Zimmermann bfh.ch
 * \date      2009-02-04
 *
 * \endcond
*/

#include <stdint.h>
#include <ctype.h>

#include "scpi_parser.h"
#include "debugprint.h"


#define YYCTYPE         uint8_t
#define YYCURSOR        s->cur
#define YYLIMIT         s->lim
#define YYMARKER        s->ptr
#define YYFILL(n)       {YYCURSOR = fill(s, buffer, n);}
/*!max:re2c */          /* this will define YYMAXFILL */


uint8_t* fill(Scanner *s, int16_t *buffer, uint8_t n){
  uint8_t i = 0;

  for(i;i<n;i++) {
    buffer[i] = tolower(*(s->source));
    s->source++;
  }

  s->cur = buffer;
  s->lim = &buffer[n];

  return s->cur;    
}


int8_t scpi_scan(Scanner *s){

  int8_t buffer[YYMAXFILL];

  /** \cond SCANNER  
   * this is a ugly hack to avoid that the regular expressions are included in 
   * the doxygen documentation
  */

  /*!re2c       

  /* place here the regular expressions to detect the end of a message */

  /* FIXME end detection missing */
  "\n"                                  { /* end of message reached */
                                          return 99;
                                        }

  /* this set of regular expressions are for the mandatory IEEE488 commands */

  "*cls"                                { /* clear status command */

                                          return 1;  
                                        }

  "*ese"                                { /* standard event status enable command */

                                          return 1;  
                                        }

  "*ese?"                               { /* standard event status enable query */

                                          return 1;  
                                        }

  "*esr?"                               { /* standard event status register query */

                                          return 1;  
                                        }

  "*idn?"                               { /* identification query */

                                          return 1;  
                                        }

  "*opc"                                { /* operation complete command */

                                          return 1;  
                                        }

  "*opc?"                               { /* operation complete query */

                                          return 1;  
                                        }

  "*rst"                                { /* reset command */

                                          return 1;  
                                        }

  "*sre"                                { /* service request enable command */

                                          return 1;  
                                        }

  "*sre?"                               { /* service request enable query */

                                          return 1;  
                                        }

  "*stb?"                               { /* read status byte query */

                                          return 1;  
                                        }

  "*tst?"                               { /* self-test query */

                                          return 1;  
                                        }

  "*wai"                                { /* wait-to-continue command */

                                          return 1;  
                                        }



  /* this set of regular expressions are for the mandatory SCPI 99 commands */

  "syst:err?"|"syst:err:next?"          { /* gets an error message if ther is one */
                                        
                                          return 1;  
                                        }

  "syst:vers"                           { /* returns the firmware version number */
                                        
                                          return 1;  
                                        }

  "stat:oper?"|"stat:oper:even?"        { /* dfsg */
                                        
                                          return 1;  
                                        }

  "stat:oper:cond?"                     { // fsdgsg
                                        
                                          return 1;  
                                        }

  "stat:oper:enab"                      { // sfgsdf
                                        
                                          return 1;  
                                        }

  "stat:oper:enab?"                     { // sfgfsdg
                                        
                                          return 1;  
                                        }

  "stat:ques?"|"stat:ques:even?"        { // sfgfsdg
                                        
                                          return 1;  
                                        }

  "stat:ques:cond?"                     { // sfgsdfg
                                        
                                          return 1;  
                                        }

  "stat:ques:enab"                      { // sfgsdfg
                                        
                                          return 1;  
                                        }

  "stat:ques:enab?"                     { // sfgfg
                                        
                                          return 1;  
                                        }

  "stat:pres"                           { // sfgfg
                                        
                                          return 1;  
                                        }



  /* this set of regular expressions are for the device functions */


  "diag:mes?"                           { /* ask if there is a message to read available */
                                          print_info("scpi: diag:mes?\n"); 
                                          return 1;  
                                        }

  "diag:mes"                            { /* reads the message from the message buffer */
                                          print_info("scpi: diag:mes\n"); 
                                          return 1; 
                                        }

  "diag:gpif?"                          { /* reads the GPIF state */
                                          print_info("scpi: diag:gpif?\n"); 
                                          return 1; 
                                        }

*/

/** \endcond */
}

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.