#ifndef CA_IF_H #define CA_IF_H /****************************************************************************** * $HeadURL: https://svnpub.iter.org/codac/iter/codac/dev/units/m-log-lib/trunk/src/main/c++/include/tools/any-type.h $ * $Id: any-type.h 50547 2014-10-09 12:09:51Z bauvirb $ * * Project : CODAC Core System * * Description : Channel Access Interface * * Author : Bertrand Bauvir * * Copyright (c) : 2010-2014 ITER Organization, * CS 90 046 * 13067 St. Paul-lez-Durance Cedex * France * * This file is part of ITER CODAC software. * For the terms and conditions of redistribution or use of this software * refer to the file ITER-LICENSE.TXT located in the top level directory * of the distribution package. ******************************************************************************/ /* Global header files */ #include #include /* Channel Access API definition, etc. */ //#include /* CCS logging library */ /* Local header files */ /* Constants */ #ifndef log_trace #define log_trace(arg_msg...) {} #endif #ifndef log_error #define log_error(arg_msg...){} #endif /* Type definition */ /* Global variables */ /* Public function declaration */ static inline bool CAInterface_Initialize(void) { bool status = false; ca_context_create (ca_disable_preemptive_callback); //Default //ca_context_create(ca_enable_preemptive_callback); status = true; return status; }; static inline bool CAInterface_Finalize(void) { bool status = false; ca_context_destroy(); status = true; return status; }; static inline bool CAInterface_ConnectVariable(char* name, chid& id) { bool status = false; /* Connect to channels */ if (ca_create_channel(name, NULL, NULL, 10, &id) != ECA_NORMAL) { return status; } /* Wait for connections */ if (ca_pend_io(1) != ECA_NORMAL) { log_error("%s - ca_pend_io failed", __FUNCTION__); return status; } /* Verify channel */ if (ca_state(id) != cs_conn) { //log_warning("Connection to channel '%s' has not been successful", name); } else { //log_info("Connection to channel '%s' has been successfully verified", name); } status = true; return status; }; static inline bool CAInterface_ReadVariable(chid channel, chtype type, void* p_value) { bool status = false; if (ca_state(channel) != cs_conn) { //log_error("%s - Connection to channel has been lost"); return status; } if (ca_get(type, channel, p_value) != ECA_NORMAL) { //log_error("%s - ca_get failed", __FUNCTION__); return status; } /* Flush the requests */ if (ca_pend_io(1) != ECA_NORMAL) { //log_error("%s - ca_pend_io failed", __FUNCTION__); return status; } status = true; return status; }; static inline bool CAInterface_WriteVariable(chid channel, chtype type, void* p_value) { bool status = false; if (ca_state(channel) != cs_conn) { //log_error("%s - Connection to channel has been lost", __FUNCTION__); return status; } if (ca_put(type, channel, p_value) != ECA_NORMAL) { //log_warning("%s - ca_put failed", __FUNCTION__); } /* Flush the requests */ if (ca_pend_io(1) != ECA_NORMAL) { //log_error("%s - ca_pend_io failed", __FUNCTION__); return status; } status = true; return status; }; typedef void (*pCallBack)(struct event_handler_args); static inline bool CAInterface_SubscribeVariable(chid channel, chtype type, pCallBack cb_func, void* p_value) { bool status = false; if (ca_state(channel) != cs_conn) { //log_error("%s - Connection to channel has been lost", __FUNCTION__); return status; } if (ca_create_subscription(type, 0, channel, DBE_VALUE, cb_func, NULL, NULL) != ECA_NORMAL) { //log_error("%s - ca_create_subscription failed", __FUNCTION__); return status; } /* if(ca_pend_event(0.0) != ECA_NORMAL){ //log_error("%s - ca_pend_event failed", __FUNCTION__); return status; } */ status = true; return status; }; #endif /* CA_IF_H */