Page MenuHomec4science

yocto_currentloopoutput.py
No OneTemporary

File Metadata

Created
Thu, Nov 28, 23:28

yocto_currentloopoutput.py

#*********************************************************************
#*
#* $Id: yocto_currentloopoutput.py 23243 2016-02-23 14:13:12Z seb $
#*
#* Implements yFindCurrentLoopOutput(), the high-level API for CurrentLoopOutput functions
#*
#* - - - - - - - - - License information: - - - - - - - - -
#*
#* Copyright (C) 2011 and beyond by Yoctopuce Sarl, Switzerland.
#*
#* Yoctopuce Sarl (hereafter Licensor) grants to you a perpetual
#* non-exclusive license to use, modify, copy and integrate this
#* file into your software for the sole purpose of interfacing
#* with Yoctopuce products.
#*
#* You may reproduce and distribute copies of this file in
#* source or object form, as long as the sole purpose of this
#* code is to interface with Yoctopuce products. You must retain
#* this notice in the distributed source file.
#*
#* You should refer to Yoctopuce General Terms and Conditions
#* for additional information regarding your rights and
#* obligations.
#*
#* THE SOFTWARE AND DOCUMENTATION ARE PROVIDED 'AS IS' WITHOUT
#* WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING
#* WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, FITNESS
#* FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO
#* EVENT SHALL LICENSOR BE LIABLE FOR ANY INCIDENTAL, SPECIAL,
#* INDIRECT OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA,
#* COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR
#* SERVICES, ANY CLAIMS BY THIRD PARTIES (INCLUDING BUT NOT
#* LIMITED TO ANY DEFENSE THEREOF), ANY CLAIMS FOR INDEMNITY OR
#* CONTRIBUTION, OR OTHER SIMILAR COSTS, WHETHER ASSERTED ON THE
#* BASIS OF CONTRACT, TORT (INCLUDING NEGLIGENCE), BREACH OF
#* WARRANTY, OR OTHERWISE.
#*
#*********************************************************************/
__docformat__ = 'restructuredtext en'
from yocto_api import *
#--- (YCurrentLoopOutput class start)
#noinspection PyProtectedMember
class YCurrentLoopOutput(YFunction):
"""
The Yoctopuce application programming interface allows you to change the value of the 4-20mA
output as well as to know the current loop state.
"""
#--- (end of YCurrentLoopOutput class start)
#--- (YCurrentLoopOutput return codes)
#--- (end of YCurrentLoopOutput return codes)
#--- (YCurrentLoopOutput dlldef)
#--- (end of YCurrentLoopOutput dlldef)
#--- (YCurrentLoopOutput definitions)
CURRENT_INVALID = YAPI.INVALID_DOUBLE
CURRENTTRANSITION_INVALID = YAPI.INVALID_STRING
CURRENTATSTARTUP_INVALID = YAPI.INVALID_DOUBLE
LOOPPOWER_NOPWR = 0
LOOPPOWER_LOWPWR = 1
LOOPPOWER_POWEROK = 2
LOOPPOWER_INVALID = -1
#--- (end of YCurrentLoopOutput definitions)
def __init__(self, func):
super(YCurrentLoopOutput, self).__init__(func)
self._className = 'CurrentLoopOutput'
#--- (YCurrentLoopOutput attributes)
self._callback = None
self._current = YCurrentLoopOutput.CURRENT_INVALID
self._currentTransition = YCurrentLoopOutput.CURRENTTRANSITION_INVALID
self._currentAtStartUp = YCurrentLoopOutput.CURRENTATSTARTUP_INVALID
self._loopPower = YCurrentLoopOutput.LOOPPOWER_INVALID
#--- (end of YCurrentLoopOutput attributes)
#--- (YCurrentLoopOutput implementation)
def _parseAttr(self, member):
if member.name == "current":
self._current = round(member.ivalue * 1000.0 / 65536.0) / 1000.0
return 1
if member.name == "currentTransition":
self._currentTransition = member.svalue
return 1
if member.name == "currentAtStartUp":
self._currentAtStartUp = round(member.ivalue * 1000.0 / 65536.0) / 1000.0
return 1
if member.name == "loopPower":
self._loopPower = member.ivalue
return 1
super(YCurrentLoopOutput, self)._parseAttr(member)
def set_current(self, newval):
"""
Changes the current loop, the valid range is from 3 to 21mA. If the loop is
not propely powered, the target current is not reached and
loopPower is set to LOWPWR.
@param newval : a floating point number corresponding to the current loop, the valid range is from 3 to 21mA
@return YAPI.SUCCESS if the call succeeds.
On failure, throws an exception or returns a negative error code.
"""
rest_val = str(int(round(newval * 65536.0, 1)))
return self._setAttr("current", rest_val)
def get_current(self):
"""
Returns the loop current set point in mA.
@return a floating point number corresponding to the loop current set point in mA
On failure, throws an exception or returns YCurrentLoopOutput.CURRENT_INVALID.
"""
if self._cacheExpiration <= YAPI.GetTickCount():
if self.load(YAPI.DefaultCacheValidity) != YAPI.SUCCESS:
return YCurrentLoopOutput.CURRENT_INVALID
return self._current
def get_currentTransition(self):
if self._cacheExpiration <= YAPI.GetTickCount():
if self.load(YAPI.DefaultCacheValidity) != YAPI.SUCCESS:
return YCurrentLoopOutput.CURRENTTRANSITION_INVALID
return self._currentTransition
def set_currentTransition(self, newval):
rest_val = newval
return self._setAttr("currentTransition", rest_val)
def set_currentAtStartUp(self, newval):
"""
Changes the loop current at device start up. Remember to call the matching
module saveToFlash() method, otherwise this call has no effect.
@param newval : a floating point number corresponding to the loop current at device start up
@return YAPI.SUCCESS if the call succeeds.
On failure, throws an exception or returns a negative error code.
"""
rest_val = str(int(round(newval * 65536.0, 1)))
return self._setAttr("currentAtStartUp", rest_val)
def get_currentAtStartUp(self):
"""
Returns the current in the loop at device startup, in mA.
@return a floating point number corresponding to the current in the loop at device startup, in mA
On failure, throws an exception or returns YCurrentLoopOutput.CURRENTATSTARTUP_INVALID.
"""
if self._cacheExpiration <= YAPI.GetTickCount():
if self.load(YAPI.DefaultCacheValidity) != YAPI.SUCCESS:
return YCurrentLoopOutput.CURRENTATSTARTUP_INVALID
return self._currentAtStartUp
def get_loopPower(self):
"""
Returns the loop powerstate. POWEROK: the loop
is powered. NOPWR: the loop in not powered. LOWPWR: the loop is not
powered enough to maintain the current required (insufficient voltage).
@return a value among YCurrentLoopOutput.LOOPPOWER_NOPWR, YCurrentLoopOutput.LOOPPOWER_LOWPWR and
YCurrentLoopOutput.LOOPPOWER_POWEROK corresponding to the loop powerstate
On failure, throws an exception or returns YCurrentLoopOutput.LOOPPOWER_INVALID.
"""
if self._cacheExpiration <= YAPI.GetTickCount():
if self.load(YAPI.DefaultCacheValidity) != YAPI.SUCCESS:
return YCurrentLoopOutput.LOOPPOWER_INVALID
return self._loopPower
@staticmethod
def FindCurrentLoopOutput(func):
"""
Retrieves a 4-20mA output for a given identifier.
The identifier can be specified using several formats:
<ul>
<li>FunctionLogicalName</li>
<li>ModuleSerialNumber.FunctionIdentifier</li>
<li>ModuleSerialNumber.FunctionLogicalName</li>
<li>ModuleLogicalName.FunctionIdentifier</li>
<li>ModuleLogicalName.FunctionLogicalName</li>
</ul>
This function does not require that the 4-20mA output is online at the time
it is invoked. The returned object is nevertheless valid.
Use the method YCurrentLoopOutput.isOnline() to test if the 4-20mA output is
indeed online at a given time. In case of ambiguity when looking for
a 4-20mA output by logical name, no error is notified: the first instance
found is returned. The search is performed first by hardware name,
then by logical name.
@param func : a string that uniquely characterizes the 4-20mA output
@return a YCurrentLoopOutput object allowing you to drive the 4-20mA output.
"""
# obj
obj = YFunction._FindFromCache("CurrentLoopOutput", func)
if obj is None:
obj = YCurrentLoopOutput(func)
YFunction._AddToCache("CurrentLoopOutput", func, obj)
return obj
def currentMove(self, mA_target, ms_duration):
"""
Performs a smooth transistion of current flowing in the loop. Any current explicit
change cancels any ongoing transition process.
@param mA_target : new current value at the end of the transition
(floating-point number, representing the transition duration in mA)
@param ms_duration : total duration of the transition, in milliseconds
@return YAPI.SUCCESS when the call succeeds.
"""
# newval
if mA_target < 3.0:
mA_target = 3.0
if mA_target > 21.0:
mA_target = 21.0
newval = "" + str(int(round(mA_target*1000))) + ":" + str(int(ms_duration))
# // may throw an exception
return self.set_currentTransition(newval)
def nextCurrentLoopOutput(self):
"""
Continues the enumeration of 4-20mA outputs started using yFirstCurrentLoopOutput().
@return a pointer to a YCurrentLoopOutput object, corresponding to
a 4-20mA output currently online, or a None pointer
if there are no more 4-20mA outputs to enumerate.
"""
hwidRef = YRefParam()
if YAPI.YISERR(self._nextFunction(hwidRef)):
return None
if hwidRef.value == "":
return None
return YCurrentLoopOutput.FindCurrentLoopOutput(hwidRef.value)
#--- (end of YCurrentLoopOutput implementation)
#--- (CurrentLoopOutput functions)
@staticmethod
def FirstCurrentLoopOutput():
"""
Starts the enumeration of 4-20mA outputs currently accessible.
Use the method YCurrentLoopOutput.nextCurrentLoopOutput() to iterate on
next 4-20mA outputs.
@return a pointer to a YCurrentLoopOutput object, corresponding to
the first 4-20mA output currently online, or a None pointer
if there are none.
"""
devRef = YRefParam()
neededsizeRef = YRefParam()
serialRef = YRefParam()
funcIdRef = YRefParam()
funcNameRef = YRefParam()
funcValRef = YRefParam()
errmsgRef = YRefParam()
size = YAPI.C_INTSIZE
#noinspection PyTypeChecker,PyCallingNonCallable
p = (ctypes.c_int * 1)()
err = YAPI.apiGetFunctionsByClass("CurrentLoopOutput", 0, p, size, neededsizeRef, errmsgRef)
if YAPI.YISERR(err) or not neededsizeRef.value:
return None
if YAPI.YISERR(
YAPI.yapiGetFunctionInfo(p[0], devRef, serialRef, funcIdRef, funcNameRef, funcValRef, errmsgRef)):
return None
return YCurrentLoopOutput.FindCurrentLoopOutput(serialRef.value + "." + funcIdRef.value)
#--- (end of CurrentLoopOutput functions)

Event Timeline