monitor

Dependents:   09_PT1000 10_PT1000 11_PT1000

monitor.cpp

Committer:
rs27
Date:
2014-07-26
Revision:
0:f0fbbfdca478
Child:
1:19313470f629

File content as of revision 0:f0fbbfdca478:


#include <stdarg.h>
#include <ctype.h>
#include "monitor.h"

extern Serial pc;
extern Buffer <char> buf;

#define COMMAND_MAX    5
#define COMMAND_LEN    7
const char command[COMMAND_MAX][COMMAND_LEN] = {"DATE","DUMP","HELP","SET","TIME"};

//-----------------------------------------------------------------------------
// destructor

monitor::monitor(void)
{
      uint8_t i;
      
      for (i = 0; i < COM_LINE_LEN; com_line[i++] = 0);
      ComLinePtr = ComLineTop = 0;
      cr_flag = false;
      
      // 0 Kanal ist daktiv
      // 1 Rohdaten ausgeben
      // 2 Temperaturwert in Float Darstellung
      
      status[0] = 2;  // Temperaturwerte ausgeben 
      status[1] = 0;
      status[2] = 0;
      status[3] = 0;
      status[4] = 0;
      status[5] = 0;
      status[6] = 0;
      status[7] = 0;
      
}

//-----------------------------------------------------------------------------
// destructor

void monitor::parser (void)
{
  uint8_t i, ch, tch, top, bottom, len;
  int8_t res;

  // Zuerst wird der erste Buchstabe aus dem Eingabestring mit den ersten 
  // Buchstaben aus der Befehlstabelle verglichen                         

  bottom = 0;                                        // untere Suchgrenze 
  top = COMMAND_MAX;                                 // obere Suchgerenze 
  ch = com_line[0];                            // hole erstes Suchzeichen
  
  do 
  {
        i = (top + bottom) >> 1;    // suche in der Mitte des Feldes beginnen
        tch = command [i][0];                     // Vergleichszeichen laden 
        if (tch == ch) break;                             // Zeichen gefunden 
        if (tch > ch) top = i;                           // nach unten suchen 
        else bottom = i;                                  // nach oben suchen 
        if (bottom != 0 && top == bottom + 1) break;   // kein Buchstabe gef.
  
  } while (i > 0 && i < COMMAND_MAX - 1);

  if (tch != ch)
  {
        pc.printf("\nParser Kommando nicht gefunden\n");
        return;                              // Kommando nicht gefunden wurde 
  }
  
  // das erst Wort soll von den Übergabeparametern isoliert werden        
  
  for (i = 0; com_line[i] != ' ' &&  com_line[i] != 0; i++);
  len = i;

  
  if (i == 0) return;

  // die Übergabparameter ermitteln und in als Indexzeiger in            
  // 'ComLinePtr' abspeichern                                            

  for ( ; com_line[i] == ' ' && com_line[i] != 0; i++);
  ComLinePtr = i;
  
  // die binäre Suche nach den restlichen Zeichen wird hier fortgesetzt 

  do
  {
        i = (top + bottom) >> 1;                 // berechnen des Suchplatzes
        //printf_P (PSTR("\n\rVergleich 1 com_line = [%s] und Länge = [%d]"),com_line,len);
        //strcpy_P (temp, &command[i][0]);
        //printf_P (PSTR("\n\rVergleich 2 command[i] = [%s] und Index = [%d]"),temp,i);
        res = strncmp(com_line, &command[i][0], len);
        //printf_P (PSTR("\n\rVergleich 3 res = [%d]"),res);
        if (res == 0) break;                       // Zeichen gefunden 
        if (res > 0) 
            bottom = i;                            // nach unten suchen
        else 
            top = i;                               // nach oben suchen
        if (bottom != 0 && top == bottom + 1) break;
  
  } while (i > 0 && i < COMMAND_MAX - 1);

  
  if (res) 
  {
        pc.printf("\nParser Kommando nicht gefunden.\n");
  }
  else 
  {
        pc.printf("\nAufruf von Funktion %d",i);
        
        switch(i)                       // Programmaufruf
        {
          case 0: date(); break;
          case 1: dump(); break;
          case 2: help(); break;
          case 3: set(); break;
          case 4: time(); break;
        }                                   
  }
}



//-----------------------------------------------------------------------------
// eine Zeile aus dem Eingangsbuffer lesen 
  
void monitor::get_line(void)
{
    char ch;
    uint8_t i;
     
    get_ch();
    if (cr_flag)                            // Neue Eingabezeile  
    {
        if (com_line[0] != 0)
        {
            // uart_puts(com_line);         // zum Testen => später wird der parcer aufgerufen
            // Zeichenkette in Großbuchstaben umwandeln

            // printf_P (PSTR("\n monitor "));
            for (i = 0; com_line[i] != 0; i++)
            {
                ch = com_line[i];
                ch = toupper(ch);                          // Nur Großbuchstaben 
                com_line[i] = ch;
                // pc.printf(("\n[%02x] %c"),ch,ch);                
                if (ch == ' ') i = COM_LINE_LEN;
            }
            // pc.printf(("\n"));
            parser();                                   // Parcer wird aufgerufen
        }
 
        for (i=0; i < COM_LINE_LEN; com_line[i++] = 0);
        ComLinePtr = ComLineTop = 0;                         
        cr_flag = 0;
    }     
}

//-----------------------------------------------------------------------------
// eine Zeichen aus dem Eingangsbuffer lesen 

void monitor::get_ch (void)
{
    char ch;
  
    if (!buf.available()) return;               // kein Zeichen vorhanden 
     
    ch = buf.get();                             // hole das Zeichen  
    // printf("mon_line: %c %02x\n",ch,ch);     // nur zum Test
  
    switch(ch) 
    {
        case '\r':     // CARRIAGE RETURN  
            cr_flag = true;
            break;

        case '\n':      // LF empfangen
            cr_flag = true;
            break;

        default:                                 // Normales Zeichen  
            if (~iscntrl(ch)) 
            {
                com_line[ComLinePtr] = ch;       // Zeichen einfuegen 
                ComLinePtr++;
            }
            break;

    }   // Ende SWITCH
    
    if (ComLinePtr >= 80) cr_flag = 1;           // Zeilenüberlauf ?  
    
}

//-----------------------------------------------------------------------------
// monitor Aufruf

void monitor::date(void)
{
  pc.printf("\nin date");
}

//-----------------------------------------------------------------------------
// monitor Aufruf

void monitor::dump(void)
{
  pc.printf("\nin dump");
}

//-----------------------------------------------------------------------------
// monitor Aufruf

void monitor::help(void)
{
  pc.printf("\n -- help ------------------------");
  pc.printf("\n set index [val] Sensor auswaehlen");
  pc.printf("\n");
}

//-----------------------------------------------------------------------------
// monitor Aufruf

void monitor::set(void)
{
    int n, pos, val;

    n = sscanf(&com_line[ComLinePtr],"%d %d",&pos,&val);
    
    switch (n)
    {
      case -1: pc.printf("\nbitte index [wert] angeben");
              pc.printf("\n Index >> Sonsor 0 bis 7");
              pc.printf("\n wert  >> 0 = inaktiv, 1 = Rohwerte, 2 = errechneter Wert");
              break;
      
      case 1: pc.printf("\nread status[%d] = %d",pos,status[pos]);
              break;
              
      case 2: status[pos] = val;
              pc.printf("\nset status[%d] = %d",pos,status[pos]);
              break;
     } // end switch
}

//-----------------------------------------------------------------------------
// monitor Aufruf

void monitor::time(void)
{
  pc.printf("\nin timer");
}