Line data Source code
1 : /********************************************************************\
2 :
3 : Name: null.c
4 : Created by: Stefan Ritt
5 :
6 : Contents: NULL bus driver
7 :
8 : $Id$
9 :
10 : \********************************************************************/
11 :
12 : #include <stdio.h>
13 : #include <stdlib.h>
14 : #include <stdarg.h>
15 : #include <string.h>
16 : #include "midas.h"
17 :
18 : static int debug_flag = 0;
19 :
20 : typedef struct {
21 : char device[NAME_LENGTH];
22 : } NULL_SETTINGS;
23 :
24 : #define NULL_SETTINGS_STR "\
25 : Device = STRING : [32] com1\n\
26 : "
27 :
28 : typedef struct {
29 : NULL_SETTINGS settings;
30 : int fd; /* device handle for NULL device */
31 : } NULL_INFO;
32 :
33 : /*------------------------------------------------------------------*/
34 :
35 0 : int null_open(char *device)
36 : {
37 : int fd;
38 :
39 : /* open device using device name, like
40 :
41 : fd = open(device);
42 : if (fd == -1)
43 : return -1;
44 :
45 : */
46 :
47 : /* simulate open */
48 0 : fd = 1;
49 :
50 0 : return fd;
51 : }
52 :
53 : /*----------------------------------------------------------------------------*/
54 :
55 0 : INT null_exit(NULL_INFO * info)
56 : {
57 : /* something like
58 :
59 : close(info->fd);
60 :
61 : */
62 :
63 0 : return SUCCESS;
64 : }
65 :
66 : /*----------------------------------------------------------------------------*/
67 :
68 0 : int null_write(NULL_INFO * info, char *data, int size)
69 : {
70 : DWORD written, i;
71 :
72 0 : if (debug_flag) {
73 : FILE *f;
74 :
75 0 : f = fopen("null.log", "a");
76 0 : fprintf(f, "write: ");
77 0 : for (i = 0; (int) i < size; i++)
78 0 : fprintf(f, "%X ", data[i]);
79 0 : fprintf(f, "\n");
80 0 : fclose(f);
81 : }
82 :
83 : /* something like
84 : write(info->fd, data, size, &written);
85 :
86 : */
87 :
88 : /* simulate writing */
89 0 : written = size;
90 :
91 0 : return written;
92 : }
93 :
94 : /*----------------------------------------------------------------------------*/
95 :
96 0 : int null_read(NULL_INFO * info, char *data, int size, int timeout)
97 : {
98 : int i, l;
99 :
100 : /* somethng like
101 :
102 : memset(data, 0, size);
103 : for (l=0 ; l<size ; l++)
104 : {
105 : status = read(info->fd, data+l, 1, &i);
106 : if (!status || i == 0)
107 : break;
108 : }
109 : */
110 :
111 : /* simulate reading */
112 0 : ss_sleep(10);
113 0 : l = 0;
114 :
115 0 : if (debug_flag && l > 0) {
116 : FILE *f;
117 :
118 0 : f = fopen("null.log", "a");
119 0 : fprintf(f, "read: ");
120 0 : for (i = 0; i < l; i++)
121 0 : fprintf(f, "%X ", data[i]);
122 0 : fprintf(f, "\n");
123 0 : fclose(f);
124 : }
125 :
126 0 : return l;
127 : }
128 :
129 : /*----------------------------------------------------------------------------*/
130 :
131 0 : int null_puts(NULL_INFO * info, char *str)
132 : {
133 : DWORD written;
134 :
135 0 : if (debug_flag) {
136 : FILE *f;
137 :
138 0 : f = fopen("null.log", "a");
139 0 : fprintf(f, "puts: %s\n", str);
140 0 : fclose(f);
141 : }
142 :
143 : /* something like
144 : write(info->fd, str, strlen(str), &written);
145 :
146 : */
147 :
148 : /* simulate writing */
149 0 : written = strlen(str);
150 :
151 0 : return written;
152 : }
153 :
154 : /*----------------------------------------------------------------------------*/
155 :
156 0 : int null_gets(NULL_INFO * info, char *str, int size, char *pattern, int timeout)
157 : {
158 : int l;
159 :
160 : /* something like
161 :
162 : memset(str, 0, size);
163 : for (l=0 ; l<size-1 ; l++)
164 : {
165 : status = read(info->fd, str+l, 1, &i);
166 : if (!status || i == 0)
167 : {
168 : if (pattern && pattern[0])
169 : return 0;
170 : break;
171 : }
172 :
173 : if (pattern && pattern[0])
174 : if (strstr(str, pattern) != NULL)
175 : break;
176 : }
177 : */
178 :
179 : /* simulate reading */
180 0 : ss_sleep(10);
181 0 : l = 0;
182 0 : str[0] = 0;
183 :
184 0 : if (debug_flag && l > 0) {
185 : FILE *f;
186 :
187 0 : f = fopen("null.log", "a");
188 0 : fprintf(f, "gets %s: %s\n", pattern, str);
189 0 : fclose(f);
190 : }
191 :
192 0 : return l;
193 : }
194 :
195 : /*----------------------------------------------------------------------------*/
196 :
197 0 : int null_init(HNDLE hkey, NULL_INFO **pinfo)
198 : {
199 : HNDLE hDB, hkeybd;
200 : INT size, status;
201 : NULL_INFO *info;
202 :
203 : /* allocate info structure */
204 0 : info = (NULL_INFO*) calloc(1, sizeof(NULL_INFO));
205 0 : *pinfo = info;
206 :
207 0 : cm_get_experiment_database(&hDB, NULL);
208 :
209 : /* create NULL settings record */
210 0 : status = db_create_record(hDB, hkey, "BD", NULL_SETTINGS_STR);
211 0 : if (status != DB_SUCCESS)
212 0 : return FE_ERR_ODB;
213 :
214 0 : db_find_key(hDB, hkey, "BD", &hkeybd);
215 0 : size = sizeof(info->settings);
216 0 : db_get_record(hDB, hkeybd, &info->settings, &size, 0);
217 :
218 : /* open port */
219 0 : info->fd = null_open(info->settings.device);
220 :
221 0 : if (info->fd < 0)
222 0 : return FE_ERR_HW;
223 :
224 0 : return SUCCESS;
225 : }
226 :
227 : /*----------------------------------------------------------------------------*/
228 :
229 0 : INT null(INT cmd, ...)
230 : {
231 : va_list argptr;
232 : HNDLE hkey;
233 : INT status, size, timeout;
234 : NULL_INFO *info;
235 : char *str, *pattern;
236 :
237 0 : va_start(argptr, cmd);
238 0 : status = FE_SUCCESS;
239 :
240 0 : switch (cmd) {
241 0 : case CMD_INIT: {
242 0 : hkey = va_arg(argptr, HNDLE);
243 0 : NULL_INFO **pinfo = va_arg(argptr, NULL_INFO **);
244 0 : status = null_init(hkey, pinfo);
245 0 : break;
246 : }
247 0 : case CMD_EXIT:
248 0 : info = va_arg(argptr, NULL_INFO *);
249 0 : status = null_exit(info);
250 0 : break;
251 :
252 0 : case CMD_NAME:
253 0 : info = va_arg(argptr, NULL_INFO *);
254 0 : str = va_arg(argptr, char *);
255 0 : strcpy(str, "null");
256 0 : break;
257 :
258 0 : case CMD_WRITE:
259 0 : info = va_arg(argptr, NULL_INFO *);
260 0 : str = va_arg(argptr, char *);
261 0 : size = va_arg(argptr, int);
262 0 : status = null_write(info, str, size);
263 0 : break;
264 :
265 0 : case CMD_READ:
266 0 : info = va_arg(argptr, NULL_INFO *);
267 0 : str = va_arg(argptr, char *);
268 0 : size = va_arg(argptr, INT);
269 0 : timeout = va_arg(argptr, INT);
270 0 : status = null_read(info, str, size, timeout);
271 0 : break;
272 :
273 0 : case CMD_PUTS:
274 0 : info = va_arg(argptr, NULL_INFO *);
275 0 : str = va_arg(argptr, char *);
276 0 : status = null_puts(info, str);
277 0 : break;
278 :
279 0 : case CMD_GETS:
280 0 : info = va_arg(argptr, NULL_INFO *);
281 0 : str = va_arg(argptr, char *);
282 0 : size = va_arg(argptr, INT);
283 0 : pattern = va_arg(argptr, char *);
284 0 : timeout = va_arg(argptr, INT);
285 0 : status = null_gets(info, str, size, pattern, timeout);
286 0 : break;
287 :
288 0 : case CMD_DEBUG:
289 0 : status = va_arg(argptr, INT);
290 0 : debug_flag = status;
291 0 : break;
292 : }
293 :
294 0 : va_end(argptr);
295 :
296 0 : return status;
297 : }
|