Input interface library for S88 decoders

Dependents:   DSGatewayMBED_Nucleo DSGatewayMBED_Nucleo_Step128

TrackReporterS88_DS.h

Committer:
yaasan
Date:
2015-01-31
Revision:
0:b32bb4602f54

File content as of revision 0:b32bb4602f54:

/*********************************************************************
 * Railuino - Hacking your Märklin
 *
 * Copyright (C) 2012 Joerg Pleumann
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library 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
 * LICENSE file for more details.
 */

#include <mbed.h>

#define bitWrite(b, c, bit)               b = bit ? (b | 1<<c) : (b & ~(1<<c))
#define bitRead(b, c)                    ((b & (1<<c)) >>c)
typedef unsigned char prog_uchar;
typedef unsigned char prog_uint8_t;
typedef unsigned int prog_uint16_t;
typedef unsigned int prog_uint32_t;
typedef unsigned char byte;
typedef bool boolean;
typedef unsigned char prog_uchar;
typedef signed char prog_char;
typedef signed long int word;

// ===================================================================
// === TrackReporterS88 DS ==============================================
// ===================================================================

/**
 * Implements the S88 bus protocol for reporting the state of tracks.
 * S88 is basically a long shift register where each bit corresponds
 * to a single contact on the track. Flip-flops on each S88 board make
 * sure activations are stored, so it is not necessary to query a
 * contact at the exact time it is activated. This implementation
 * allows a maximum of 512 bits or 32 full-width (16 bit) S88 boards.
 * The S88 standard recommends a maximum of 30 boards, so we should be
 * on the safe side.
 */
class TrackReporterS88_DS {

  private:

  /**
   * The number of contacts available.
   */
  int mSize;

  /**
   * The most recent contact values we know.
   */ 
  byte mSwitches[64];

  public:

  /**
   * Creates a new TrackReporter with the given number of modules
   * being attached. While this value can be safely set to the
   * maximum of 32, it makes sense to specify the actual number,
   * since this speeds up reporting. The method assumes 16 bit
   * modules. If you use 8 bit modules instead (or both) you need
   * to do the math yourself.
   */
  TrackReporterS88_DS(int modules);
  
  /**
   * Reads the current state of all contacts into the TrackReporter
   * and clears the flip-flops on all S88 boards. Call this method
   * periodically to have up-to-date values.
   */
  void refresh();
  void refresh(int inMaxSize);

  /**
   * Returns the state of an individual contact. Valid index values
   * are 1 to 512.
   */
  boolean getValue(int index);

  /**
   * Returns the state of contacts. Valid index values
   * are 0 to 63.
   */
  
  byte getByte(int index);


};