kstmApp/src/drvAsynI2C.cpp
author Heinz Junkes <junkes@fhi-berlin.mpg.de>
Mon, 27 Jun 2016 18:08:05 +0200
changeset 3 ec018606c207
permissions -rw-r--r--
add PVs for PhotonSTM
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
     1
//******************************************************************************
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
     2
// Copyright (C) 2015 Florian Feldbauer <florian@ep1.ruhr-uni-bochum.de>
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
     3
//                    - University Mainz, Institute foer nuc
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
     4
//
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
     5
// This file is part of drvAsynCan
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
     6
//
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
     7
// drvAsynCan is free software; you can redistribute it and/or modify
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
     8
// it under the terms of the GNU General Public License as published by
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
     9
// the Free Software Foundation; either version 3 of the License, or
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    10
// (at your option) any later version.
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    11
//
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    12
// drvAsynCan is distributed in the hope that it will be useful,
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    13
// but WITHOUT ANY WARRANTY; without even the implied warranty of
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    14
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    15
// GNU General Public License for more details.
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    16
//
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    17
// You should have received a copy of the GNU General Public License
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    18
// along with this program; if not, write to the Free Software
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    19
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    20
//
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    21
// brief   AsynPortDriver for PANDA Raspberry Pi CAN interface
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    22
//
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    23
// version 3.0.0; Jul. 29, 2014
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    24
//******************************************************************************
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    25
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    26
//_____ I N C L U D E S _______________________________________________________
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    27
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    28
// ANSI C includes
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    29
#include <cstdio>
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    30
#include <cstdlib>
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    31
#include <cstring>
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    32
#include <cerrno>
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    33
#include <fcntl.h>
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    34
#include <linux/i2c-dev.h>
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    35
//#include <linux/i2c.h>
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    36
#include <sys/ioctl.h>
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    37
#include <sys/types.h>
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    38
//#include <sys/select.h>
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    39
#include <sys/stat.h>
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    40
#include <unistd.h>
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    41
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    42
// EPICS includes
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    43
#include <epicsEvent.h>
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    44
#include <epicsExport.h>
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    45
#include <epicsMutex.h>
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    46
#include <epicsString.h>
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    47
#include <epicsThread.h>
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    48
#include <epicsTime.h>
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    49
#include <epicsTimer.h>
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    50
#include <epicsTypes.h>
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    51
#include <iocsh.h>
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    52
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    53
// local includes
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    54
#include "drvAsynI2C.h"
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    55
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    56
//_____ D E F I N I T I O N S __________________________________________________
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    57
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    58
//_____ G L O B A L S __________________________________________________________
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    59
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    60
//_____ L O C A L S ____________________________________________________________
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    61
static epicsTimerId       i2c_timer;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    62
static epicsTimerQueueId  i2c_timerQueue;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    63
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    64
//_____ F U N C T I O N S ______________________________________________________
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    65
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    66
//------------------------------------------------------------------------------
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    67
//! @brief       Timeout handler for I2C communication 
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    68
//------------------------------------------------------------------------------
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    69
static void timeoutHandler( void *ptr ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    70
  drvAsynI2C *pi2c = static_cast<drvAsynI2C*>( ptr );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    71
  pi2c->timeout();
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    72
}
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    73
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    74
//------------------------------------------------------------------------------
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    75
//! @brief       Called when asyn clients call pasynOctet->read().
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    76
//! @param [in]  pasynUser  pasynUser structure that encodes the reason and address.
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    77
//! @param [out] value      Address of the string to read.
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    78
//! @param [in]  maxChars   Maximum number of characters to read.
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    79
//! @param [out] nActual    Number of characters actually read.
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    80
//! @param [out] eomReason  Reason that read terminated.
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    81
//! @return      in case of no error occured asynSuccess is returned. Otherwise
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    82
//!              asynError or asynTimeout is returned. A error message is stored
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    83
//!              in pasynUser->errorMessage.
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    84
//! @sa          writeOctet
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    85
//!
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    86
//! Read a byte stream from the I2C bus.
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    87
//! To set the correct slave address the pasynOctet->write() call has to be used.
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    88
//! If the slave has multiple registers, use the write call to setup slave
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    89
//! address and register address, followed by this read call.
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    90
///------------------------------------------------------------------------------
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    91
asynStatus drvAsynI2C::readOctet( asynUser *pasynUser, char *value, size_t maxChars,
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    92
                                  size_t *nActual, int *eomReason ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    93
  if( _fd < 0 ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    94
    epicsSnprintf( pasynUser->errorMessage, pasynUser->errorMessageSize,
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    95
                   "%s: %s disconnected:", portName, _deviceName );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    96
    return asynError;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    97
  }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    98
  if( maxChars <= 0 ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
    99
    epicsSnprintf( pasynUser->errorMessage, pasynUser->errorMessageSize,
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   100
                   "%s: %s maxchars %d Why <=0?", portName, _deviceName, (int)maxChars );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   101
    return asynError;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   102
  }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   103
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   104
  int thisRead = 0;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   105
  int nRead = 0;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   106
  bool timerStarted = false;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   107
  asynStatus status = asynSuccess;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   108
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   109
  _timeout = false;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   110
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   111
  if( eomReason ) *eomReason = 0;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   112
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   113
  for(;;) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   114
    if( !timerStarted && pasynUser->timeout > 0 ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   115
      epicsTimerStartDelay( i2c_timer, pasynUser->timeout );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   116
      timerStarted = true;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   117
    }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   118
    thisRead = read( _fd, value, maxChars );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   119
    if( thisRead > 0 ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   120
      nRead = thisRead;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   121
      break;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   122
    } else {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   123
      if( thisRead < 0 && ( errno != EWOULDBLOCK )
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   124
                       && ( errno != EINTR )
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   125
                       && ( errno != EAGAIN ) ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   126
        epicsSnprintf( pasynUser->errorMessage, pasynUser->errorMessageSize,
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   127
                       "%s: %s read error: %s",
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   128
                       portName, _deviceName, strerror( errno ) );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   129
        status = asynError;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   130
        break;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   131
      }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   132
    }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   133
    if( _timeout ) break;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   134
  }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   135
  if( timerStarted ) epicsTimerCancel( i2c_timer );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   136
  if( _timeout && asynSuccess == status ) status = asynTimeout;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   137
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   138
/*
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   139
  int mytimeout = (int)( pasynUser->timeout * 1.e6 );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   140
  if ( 0 > mytimeout ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   141
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   142
    nbytes = read( _fd, value, maxChars );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   143
    if ( 0 > nbytes ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   144
      epicsSnprintf( pasynUser->errorMessage, pasynUser->errorMessageSize, 
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   145
                     "Error receiving message from device '%s': %d %s", 
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   146
                     _deviceName, errno, strerror( errno ) );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   147
      return asynError;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   148
    }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   149
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   150
  } else {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   151
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   152
    fd_set fdRead;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   153
    struct timeval t;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   154
    
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   155
    // calculate timeout values
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   156
    t.tv_sec  = mytimeout / 1000000L;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   157
    t.tv_usec = mytimeout % 1000000L;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   158
    
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   159
    FD_ZERO( &fdRead );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   160
    FD_SET( _fd, &fdRead );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   161
    
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   162
    // wait until timeout or a message is ready to get read
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   163
    int err = select( _fd + 1, &fdRead, NULL, NULL, &t );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   164
    
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   165
    // the only one file descriptor is ready for read
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   166
    if ( 0 < err ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   167
      nbytes = read( _fd, value, maxChars );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   168
      if ( 0 > nbytes ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   169
        epicsSnprintf( pasynUser->errorMessage, pasynUser->errorMessageSize, 
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   170
                       "Error receiving message from device '%s': %d %s", 
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   171
                       _deviceName, errno, strerror( errno ) );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   172
        return asynError;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   173
      }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   174
    }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   175
    
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   176
    // nothing is ready, timeout occured
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   177
    if ( 0 == err ) return asynTimeout;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   178
    if ( 0 > err )  {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   179
      epicsSnprintf( pasynUser->errorMessage, pasynUser->errorMessageSize, 
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   180
                     "Error receiving message from device '%s': %d %s", 
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   181
                     _deviceName, errno, strerror( errno ) );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   182
      return asynError;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   183
    }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   184
  }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   185
*/
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   186
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   187
  *nActual = nRead;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   188
  if( eomReason && *nActual >= maxChars ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   189
    *eomReason = ASYN_EOM_CNT;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   190
  }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   191
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   192
  asynPrint( pasynUser, ASYN_TRACEIO_DRIVER, 
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   193
             "%s: read %lu bytes from %s, return %s\n",
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   194
             portName, (unsigned long)*nActual, _deviceName,
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   195
             pasynManager->strStatus( status ) );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   196
  
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   197
  return status; 
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   198
}
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   199
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   200
//------------------------------------------------------------------------------
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   201
//! @brief       Called when asyn clients call pasynOctet->write().
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   202
//! @param [in]  pasynUser  pasynUser structure that encodes the reason and address.
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   203
//! @param [in]  value      Address of the string to write.
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   204
//! @param [in]  nChars     Number of characters to write.
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   205
//! @param [out] nActual    Number of characters actually written.
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   206
//! @return      in case of no error occured asynSuccess is returned. Otherwise
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   207
//!              asynError or asynTimeout is returned. A error message is stored
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   208
//!              in pasynUser->errorMessage.
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   209
//!
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   210
//! Write a byte stream to the i2c bus. First byte holds the slave address, followed
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   211
//! by the acutal data to send.
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   212
//! Example: Setting the configuration register of the AD7998 to convert all
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   213
//! 8 channels and use the BUSY output:
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   214
//! value = 0x20 0x02 0x0ffa
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   215
//! Depending on the slave device, multiple write commands can be concatenated
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   216
///------------------------------------------------------------------------------
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   217
asynStatus drvAsynI2C::writeOctet( asynUser *pasynUser, char const *value, size_t maxChars,
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   218
                                   size_t *nActual ){
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   219
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   220
  int thisWrite = 0;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   221
  bool timerStarted = false;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   222
  asynStatus status = asynSuccess;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   223
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   224
  if( _fd < 0 ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   225
    epicsSnprintf( pasynUser->errorMessage, pasynUser->errorMessageSize,
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   226
                   "%s: %s disconnected:", portName, _deviceName );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   227
    return asynError;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   228
  }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   229
  asynPrint( pasynUser, ASYN_TRACEIO_DRIVER, 
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   230
             "drvAsynI2C::writeOctet: trying to send %u bytes\n",
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   231
             maxChars );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   232
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   233
  if( 0 == maxChars ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   234
    *nActual = 0;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   235
    return asynSuccess;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   236
  }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   237
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   238
  _timeout = false;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   239
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   240
  printf( "drvAsynI2C::writeOctet: sending: ");
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   241
  for( size_t viech = 0; viech < maxChars; ++viech ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   242
    printf( "0x%02x", value[viech] );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   243
  }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   244
  printf( "\n" );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   245
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   246
  int addr = value[0];
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   247
  if( addr != _slaveAddress ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   248
    // set slave address
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   249
   if( ioctl( _fd, I2C_SLAVE, addr ) < 0 ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   250
     epicsSnprintf( pasynUser->errorMessage, pasynUser->errorMessageSize,
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   251
                    "%s: %s Can't set slave address: %s",
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   252
                    portName, _deviceName, strerror( errno ) );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   253
     return asynError;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   254
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   255
    _slaveAddress = addr;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   256
   }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   257
  }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   258
  ++value;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   259
  int nleft = maxChars - 1;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   260
  if( 0 < nleft ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   261
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   262
    if( pasynUser->timeout > 0 ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   263
      epicsTimerStartDelay( i2c_timer, pasynUser->timeout );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   264
      timerStarted = true;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   265
    }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   266
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   267
    for(;;) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   268
      thisWrite = write( _fd, value, nleft );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   269
      if ( 0 < thisWrite ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   270
        nleft -= thisWrite;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   271
        if( 0 == nleft ) break;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   272
        value += thisWrite;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   273
      }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   274
      if( _timeout || 0 == pasynUser->timeout ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   275
        status = asynTimeout;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   276
        break;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   277
      }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   278
      if( 0 > thisWrite && ( errno != EWOULDBLOCK )
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   279
                        && ( errno != EINTR )
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   280
                        && ( errno != EAGAIN ) ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   281
        epicsSnprintf( pasynUser->errorMessage, pasynUser->errorMessageSize,
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   282
                       "%s: %s write error: %s",
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   283
                       portName, _deviceName, strerror( errno ) );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   284
        status = asynError;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   285
        break;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   286
      }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   287
    }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   288
    if( timerStarted ) epicsTimerCancel( i2c_timer );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   289
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   290
  }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   291
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   292
  *nActual = maxChars - nleft;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   293
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   294
  asynPrint( pasynUser, ASYN_TRACEIO_DRIVER, 
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   295
             "%s: wrote %lu bytes to %s, return %s\n",
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   296
             portName, (unsigned long)*nActual, _deviceName,
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   297
             pasynManager->strStatus( status ) );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   298
  
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   299
  return status; 
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   300
}
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   301
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   302
//------------------------------------------------------------------------------
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   303
//! @brief       Connect driver to device
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   304
//! @param [in]  pasynUser  pasynUser structure that encodes the reason and address.
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   305
//! @return      in case of no error occured asynSuccess is returned. Otherwise
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   306
//!              asynError or asynTimeout is returned. A error message is stored
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   307
//!              in pasynUser->errorMessage.
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   308
///------------------------------------------------------------------------------
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   309
asynStatus drvAsynI2C::connect( asynUser *pasynUser ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   310
  if( _fd >= 0 ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   311
    epicsSnprintf( pasynUser->errorMessage,pasynUser->errorMessageSize,
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   312
                   "%s: Link to %s already open!", portName, _deviceName );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   313
    return asynError;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   314
  }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   315
  asynPrint( pasynUser, ASYN_TRACEIO_DRIVER,
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   316
             "%s: Open connection to %s\n", portName, _deviceName );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   317
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   318
  if( ( _fd = open( _deviceName, O_RDWR ) ) < 0 ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   319
    epicsSnprintf( pasynUser->errorMessage,pasynUser->errorMessageSize,
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   320
                   "%s: Can't open %s: %s", portName, _deviceName, strerror( errno ) );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   321
    return asynError;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   322
  }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   323
  if( ioctl( _fd, I2C_FUNCS, &_i2cfuncs ) < 0 ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   324
    epicsSnprintf( pasynUser->errorMessage,pasynUser->errorMessageSize,
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   325
                   "%s: Can't get functionality of %s: %s", portName, _deviceName, strerror( errno ) );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   326
    return asynError;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   327
  }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   328
  pasynManager->exceptionConnect( pasynUser );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   329
  return asynSuccess;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   330
}
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   331
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   332
//------------------------------------------------------------------------------
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   333
//! @brief       Disconnect driver from device
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   334
//! @param [in]  pasynUser  pasynUser structure that encodes the reason and address.
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   335
//! @return      in case of no error occured asynSuccess is returned. Otherwise
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   336
//!              asynError or asynTimeout is returned. A error message is stored
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   337
//!              in pasynUser->errorMessage.
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   338
///------------------------------------------------------------------------------
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   339
asynStatus drvAsynI2C::disconnect( asynUser *pasynUser ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   340
  asynPrint( pasynUser, ASYN_TRACEIO_DRIVER,
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   341
             "%s: disconnect %s\n", portName, _deviceName );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   342
  epicsTimerCancel( i2c_timer );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   343
  if( _fd >= 0 ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   344
    close( _fd );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   345
    _fd = -1;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   346
    pasynManager->exceptionDisconnect(pasynUser);
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   347
  } 
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   348
  return asynSuccess;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   349
}
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   350
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   351
//------------------------------------------------------------------------------
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   352
//! @brief       Standard C'tor.
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   353
//! @param [in]  portName The name of the asynPortDriver to be created.
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   354
//! @param [in]  ttyName  The name of the device
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   355
//------------------------------------------------------------------------------
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   356
drvAsynI2C::drvAsynI2C( const char *portName, const char *ttyName ) 
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   357
  : asynPortDriver( portName,
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   358
                    0, // maxAddr
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   359
                    0, // paramTableSize
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   360
                    asynCommonMask | asynOctetMask | asynDrvUserMask, // Interface mask
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   361
                    asynCommonMask | asynOctetMask,  // Interrupt mask
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   362
                    ASYN_CANBLOCK, // asynFlags
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   363
                    1,  // Autoconnect
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   364
                    0,  // Default priority
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   365
                    0 ) // Default stack size
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   366
{
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   367
  _deviceName = epicsStrDup( ttyName );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   368
  _fd = -1;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   369
  _slaveAddress = 0;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   370
//  if( ( _fd = open( _deviceName, O_RDWR ) ) < 0 ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   371
//    std::cerr << "Cannot open port" << std::endl;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   372
//    return;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   373
//  }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   374
//  if( ioctl( _fd, I2C_FUNCS, &_i2cfuncs ) < 0 ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   375
//    std::cerr << "Cannont get I2C_FUNCS" << std::endl;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   376
//    return;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   377
//  }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   378
}
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   379
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   380
// Configuration routines.  Called directly, or from the iocsh function below 
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   381
extern "C" {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   382
  //----------------------------------------------------------------------------
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   383
  //! @brief       EPICS iocsh callable function to call constructor
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   384
  //!              for the drvAsynI2C class.
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   385
  //! @param [in]  portName The name of the asyn port driver to be created.
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   386
  //! @param [in]  ttyName  The name of the interface 
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   387
  //----------------------------------------------------------------------------
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   388
  int drvAsynI2CConfigure( const char *portName, const char *ttyName ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   389
    if( !portName ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   390
      printf( "Port name missing.\n" );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   391
      return -1;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   392
    }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   393
    if( !ttyName ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   394
      printf( "TTY name missing.\n" );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   395
      return -1;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   396
    }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   397
    drvAsynI2C* pi2c = new drvAsynI2C( portName, ttyName );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   398
    i2c_timerQueue = epicsTimerQueueAllocate( 1, epicsThreadPriorityScanLow );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   399
    i2c_timer = epicsTimerQueueCreateTimer( i2c_timerQueue, timeoutHandler, pi2c );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   400
    if( !i2c_timer ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   401
      printf( "drvAsynI2C: Can't create timer.\n");
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   402
      return -1;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   403
    }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   404
    return( asynSuccess );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   405
  }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   406
  static const iocshArg initI2CArg0 = { "portName", iocshArgString };
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   407
  static const iocshArg initI2CArg1 = { "ttyName",  iocshArgString };
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   408
  static const iocshArg * const initI2CArgs[] = { &initI2CArg0, &initI2CArg1 };
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   409
  static const iocshFuncDef initI2CFuncDef = { "drvAsynI2CConfigure", 2, initI2CArgs };
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   410
  static void initI2CCallFunc( const iocshArgBuf *args ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   411
    drvAsynI2CConfigure( args[0].sval, args[1].sval );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   412
  }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   413
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   414
  //----------------------------------------------------------------------------
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   415
  //! @brief   Register functions to EPICS
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   416
  //----------------------------------------------------------------------------
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   417
  void drvAsynI2CRegister( void ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   418
    static int firstTime = 1;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   419
    if ( firstTime ) {
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   420
      iocshRegister( &initI2CFuncDef, initI2CCallFunc );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   421
      firstTime = 0;
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   422
    }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   423
  }
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   424
  
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   425
  epicsExportRegistrar( drvAsynI2CRegister );
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   426
}
ec018606c207 add PVs for PhotonSTM
Heinz Junkes <junkes@fhi-berlin.mpg.de>
parents:
diff changeset
   427