qmca  0.0.20
epicsobject.cpp
Go to the documentation of this file.
1 #include "epicsobject.h"
2 
3 #include <stdio.h>
4 
5 QMutex EpicsObject::m_Mutex(QMutex::Recursive);
6 
7 EpicsObject::EpicsObject(QString pvName, QObject *parent, int debug)
8  : QObject(parent),
9  m_PVName(pvName),
10  m_ChannelID(0),
11  m_EventID(0),
12  m_HasEventHandler(0),
13  m_Debug(debug)
14 {
15 // printf("Epics Object %p Constructed - pvName = %s\n", this, qPrintable(pvName));
16 
17  changeConnection(pvName);
18 }
19 
21 {
22 // printf ("EpicsObject::~EpicsObject(\"%s\")\n", qPrintable(m_PVName));
23 
24  if (m_ChannelID) {
25  SEVCHK(ca_clear_channel(m_ChannelID), 0);
26  m_ChannelID = 0;
27  }
28 }
29 
31 {
32  return m_PVName;
33 }
34 
36 {
37  return m_PVName;
38 }
39 
41 {
42  return ca_element_count(m_ChannelID);
43 }
44 
46 {
47  if (!m_HasEventHandler) {
48  chtype typ = ca_field_type(m_ChannelID);
49 
50  SEVCHK(ca_create_subscription(typ, 0, m_ChannelID, DBE_VALUE|DBE_ALARM,
51  get_event_handler(), this, &m_EventID), NULL);
52 
54 
55 // printf("Channel %s connected\n", qPrintable(pvName()));
56  }
57 }
58 
60 {
61 }
62 
64 {
65  return m_ChannelID;
66 }
67 
68 static void connection_handler(struct connection_handler_args args)
69 {
70 // printf("%s EpicsArray Connection Handler called %ld\n",
71 // ca_name(args.chid), args.op);
72 
73  EpicsObject* ob = (EpicsObject*) ca_puser(args.chid);
74 
75  if (ob) {
76  if (args.op == CA_OP_CONN_UP) {
77  ob->connected();
78  } else {
79  ob->disconnected();
80  }
81  }
82 }
83 
85 {
86 // printf("EpicsObject::changeConnection(this:%p,pvname:\"%s\",chann:%p)\n",
87 // this, qPrintable(m_PVName), m_ChannelID);
88 
89  if (m_ChannelID) {
90  SEVCHK(ca_clear_channel(m_ChannelID), 0);
91  m_ChannelID = 0;
92  }
93 
94  SEVCHK(ca_search(qPrintable(pv), &m_ChannelID), NULL);
95  ca_set_puser(m_ChannelID, this);
96  SEVCHK(ca_change_connection_event(m_ChannelID, &connection_handler), NULL);
97 
98  m_PVName = pv;
99 
100  if (debug()) {
101  printf("EpicsObject::changeConnection(this:%p,pvname:\"%s\",chann:%p)\n",
102  this, qPrintable(m_PVName), m_ChannelID);
103  }
104 }
105 
107 {
108  return m_Debug;
109 }
110 
112 {
113  m_Debug = dbg;
114 }
115 
116 void EpicsObject::settle(double t)
117 {
118  ::ca_pend_event(t);
119 }
120 
122 {
123  ::ca_pend_io(t);
124 }
virtual ~EpicsObject()
Definition: epicsobject.cpp:20
void setDebug(int dbg)
static void connection_handler(struct connection_handler_args args)
Definition: epicsobject.cpp:68
void settle(double t)
virtual caEventCallBackFunc * get_event_handler()=0
bool m_HasEventHandler
Definition: epicsobject.h:50
QString pvName()
Definition: epicsobject.cpp:30
EpicsObject(QString pvName, QObject *parent=0, int debug=0)
Definition: epicsobject.cpp:7
virtual void disconnected()
Definition: epicsobject.cpp:59
evid m_EventID
Definition: epicsobject.h:49
void changeConnection(QString pv)
Definition: epicsobject.cpp:84
static QMutex m_Mutex
Definition: epicsobject.h:42
chid channelID()
Definition: epicsobject.cpp:63
QString m_PVName
Definition: epicsobject.h:45
QString toolTip()
Definition: epicsobject.cpp:35
virtual void connected()
Definition: epicsobject.cpp:45
chid m_ChannelID
Definition: epicsobject.h:48
void ca_pend_io(double t)