Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
354 | f9daq | 1 | #include <cvirte.h> |
2 | #include <userint.h> |
||
3 | #include <utility.h> |
||
4 | #include <ansi_c.h> |
||
5 | #include <rs232.h> |
||
6 | #include <string.h> |
||
7 | #include <stdio.h> |
||
8 | #include <stdlib.h> |
||
9 | #include "motor.h" |
||
10 | #include <analysis.h> |
||
11 | #include <math.h> |
||
12 | |||
13 | //stepping motor busheng --> declaration 1step=1.8degrees |
||
14 | //experimantally: full rotation = 3200 steps (on setting 1step/mm ($100)) |
||
15 | |||
16 | |||
17 | int pCOM1 = 6; |
||
18 | int pCOM2 = 7; |
||
19 | |||
20 | int run, graph, f_t, ji, vi, run1; |
||
21 | int left_1, right_1; |
||
22 | |||
23 | static int panel, tfID, tfID1; |
||
24 | static int poolHandle = 0; |
||
25 | |||
26 | #define TEXT_LENGTH 2000 |
||
27 | #define MAX_THREADS 10 |
||
28 | |||
29 | double volt_g[TEXT_LENGTH], volt_g1[TEXT_LENGTH*200]; |
||
30 | |||
31 | int bytes_read0; |
||
32 | int bytes_read1; |
||
33 | |||
34 | char read_data0[TEXT_LENGTH]; |
||
35 | char read_data1[TEXT_LENGTH]; |
||
36 | |||
37 | |||
38 | void initialize() |
||
39 | { |
||
40 | // Open grbl serial port //("COM6",115200) |
||
41 | OpenComConfig (pCOM1, "COM6", 115200, 0, 8, 1, 512, 512); |
||
42 | |||
43 | /* Turn off Hardware handshaking (loopback test will not function with it on) */ |
||
44 | SetCTSMode (pCOM1, LWRS_HWHANDSHAKE_OFF); |
||
45 | |||
46 | ComWrt (pCOM1, "\r\n\r\n", 5); //Writing on Port |
||
47 | Delay(2); //Wait for grbl to initialize |
||
48 | |||
49 | int strLen0 = GetInQLen (pCOM1); //Reading from Port |
||
50 | bytes_read0 = ComRd (pCOM1, read_data0, strLen0); |
||
51 | printf("%s\n", read_data0); |
||
52 | |||
53 | //Left in this form - can have more initializing commands if needeed |
||
54 | char init[1][10] = {"$RST=$\n"};//, "$100=20\n","$$\n","$100=100\n" |
||
55 | char *cmd; |
||
56 | |||
57 | for(int i=0; i<1; i++) |
||
58 | { |
||
59 | cmd = init + i; //Takes init[i] |
||
60 | int len = strlen(cmd); |
||
61 | ComWrt (pCOM1, cmd, len); |
||
62 | printf("%s", cmd); |
||
63 | |||
64 | Delay(0.01); //Give it a little time to respond... |
||
65 | |||
66 | int strLen1 = GetInQLen (pCOM1); |
||
67 | bytes_read1 = ComRd (pCOM1, read_data1, strLen1); |
||
68 | printf(" : %s\n", read_data1); |
||
69 | //printf("bytes_read = %d\n\n", bytes_read1); |
||
70 | } |
||
71 | |||
72 | FlushOutQ (pCOM1); |
||
73 | |||
74 | } |
||
75 | |||
76 | |||
77 | void asking_position() |
||
78 | { |
||
79 | while (1) |
||
80 | { |
||
81 | FlushInQ (pCOM1); |
||
82 | FlushOutQ (pCOM1); |
||
83 | |||
84 | ComWrt (pCOM1, "?\n", 2); //asks grbl his position |
||
85 | Delay(0.01); |
||
86 | |||
87 | int strLen0 = GetInQLen (pCOM1); |
||
88 | bytes_read0 = ComRd (pCOM1, read_data0, strLen0); |
||
89 | //printf(" : %s", read_data0); |
||
90 | //printf("bytes_read = %d\n\n", bytes_read0); |
||
91 | |||
92 | //taking subtring of a string to first appernace of character |
||
93 | char *read_data_0 = strtok(read_data0, "\n"); |
||
94 | //printf(" : %s\n", read_data_0); |
||
95 | |||
96 | //finding substring in string |
||
97 | char *substr = strstr(read_data_0,"Idle"); |
||
98 | //printf("\n%s\n", substr); |
||
99 | |||
100 | if(substr>0) break; |
||
101 | |||
102 | if (!run) |
||
103 | { |
||
104 | ComWrt (pCOM1, "!\n", 2); //stops grbl |
||
105 | |||
106 | Delay(0.01); |
||
107 | |||
108 | ComWrt (pCOM1, "~\n", 2); //releases grbl |
||
109 | |||
110 | Delay(0.01); |
||
111 | |||
112 | int strLen = GetInQLen (pCOM1); |
||
113 | bytes_read0 = ComRd (pCOM1, read_data0, strLen); |
||
114 | //printf(" : %s", read_data0); |
||
115 | |||
116 | break; |
||
117 | } |
||
118 | } |
||
119 | } |
||
120 | |||
121 | |||
122 | void initialize_voltage() |
||
123 | { |
||
124 | // Open serial port for photodetector - reading is on chanel A1 |
||
125 | OpenComConfig (pCOM2, "COM7", 115200, 0, 8, 1, 512, 512); |
||
126 | SetCTSMode (pCOM2, LWRS_HWHANDSHAKE_OFF); |
||
127 | |||
128 | Delay(0.5); |
||
129 | FlushInQ (pCOM2); |
||
130 | FlushOutQ (pCOM2); |
||
131 | |||
132 | } |
||
133 | |||
134 | |||
135 | int bytes_read2; |
||
136 | char read_data2[TEXT_LENGTH]; |
||
137 | |||
138 | double read_voltage() |
||
139 | { |
||
140 | |||
141 | //int strLen2 = GetInQLen (pCOM2); |
||
142 | bytes_read2 = ComRdTerm (pCOM2, read_data2, 11, 10); |
||
143 | //IMPORTANT: 11 bytes is the size of one line |
||
144 | printf("Voltage: \n%s\n", read_data2); |
||
145 | //printf("bytes_read = %d\n\n", bytes_read2); |
||
146 | //Delay(0.1); |
||
147 | |||
148 | double Volt; |
||
149 | sscanf(read_data2, "%lf", &Volt); |
||
150 | //printf("Volt = %lf\n", Volt); |
||
151 | return Volt; |
||
152 | } |
||
153 | |||
154 | |||
155 | int bytes_read3; |
||
156 | char read_data3[TEXT_LENGTH]; |
||
157 | |||
158 | void movement(int steps) |
||
159 | { |
||
160 | |||
161 | //Move on the steps |
||
162 | char str[10], move[20] = "$J=X"; |
||
163 | sprintf(str,"%d",steps); |
||
164 | strcat(move,str); |
||
165 | strcat(move,"F600\n"); |
||
166 | //Command must look like "X200\n" or "$J=X200F600" |
||
167 | int len0 = strlen(move); |
||
168 | //printf("len0 is %d ", len0); |
||
169 | printf("Moving on point %d\n", steps); |
||
170 | |||
171 | ComWrt (pCOM1, move, len0); |
||
172 | Delay(0.01); |
||
173 | |||
174 | int strLen3 = GetInQLen (pCOM1); |
||
175 | bytes_read3 = ComRd (pCOM1, read_data3, strLen3); |
||
176 | //printf(" :\n%s", read_data3); |
||
177 | //printf("bytes_read = %d\n\n", bytes_read3); |
||
178 | FlushInQ (pCOM1); |
||
179 | |||
180 | } |
||
181 | |||
182 | |||
183 | static int CVICALLBACK daq_run(void *functionData) |
||
184 | { |
||
185 | |||
186 | int num_points; |
||
187 | int waittime; |
||
188 | double volt; |
||
189 | int j = 0; //for graph |
||
190 | |||
191 | GetCtrlVal(panel, p1_NUM_POINTS, &num_points); |
||
192 | GetCtrlVal(panel, p1_WAIT_TIME, &waittime); |
||
193 | //double wait = waittime/1000.0; //Wait time between each step |
||
194 | //printf("wait: %lf", wait); |
||
195 | |||
196 | movement(0); |
||
197 | Delay(0.1); |
||
198 | |||
199 | asking_position(); |
||
200 | |||
201 | initialize_voltage(); |
||
202 | |||
203 | if (!run) return 0; |
||
204 | |||
205 | FlushInQ (pCOM1); |
||
206 | FlushOutQ (pCOM1); |
||
207 | |||
208 | Delay(0.1); |
||
209 | |||
210 | movement(num_points); |
||
211 | |||
212 | while (1) // Continious reading |
||
213 | { |
||
214 | volt = read_voltage(); |
||
215 | FlushInQ (pCOM2); |
||
216 | SetCtrlVal(panel, p1_VOLTAGE, volt); |
||
217 | |||
218 | //writing in tabel for graph |
||
219 | volt_g1[j] = volt; |
||
220 | if (volt>6) volt_g1[j]=volt_g1[j-1]; |
||
221 | if (volt<-0.1) volt_g1[j]=volt_g1[j-1]; |
||
222 | j++; |
||
223 | |||
224 | if (!run) // Stopping grbl if pressed STOP |
||
225 | { |
||
226 | ComWrt (pCOM1, "!\n", 2); //stops grbl |
||
227 | Delay(0.01); |
||
228 | |||
229 | ComWrt (pCOM1, "~\n", 2); //releases grbl |
||
230 | Delay(0.01); |
||
231 | |||
232 | int strLen = GetInQLen (pCOM1); |
||
233 | bytes_read0 = ComRd (pCOM1, read_data0, strLen); |
||
234 | //printf(" : %s", read_data0); |
||
235 | break; |
||
236 | } |
||
237 | |||
238 | FlushInQ (pCOM1); |
||
239 | FlushOutQ (pCOM1); |
||
240 | |||
241 | ComWrt (pCOM1, "?\n", 2); //asks grbl his position |
||
242 | Delay(0.01); |
||
243 | |||
244 | int strLen5 = GetInQLen (pCOM1); |
||
245 | bytes_read0 = ComRd (pCOM1, read_data0, strLen5); |
||
246 | |||
247 | char *read_data_0 = strtok(read_data0, "\n"); |
||
248 | |||
249 | char *substr2 = strstr(read_data_0,"Idle"); |
||
250 | //printf("\n%d\n", substr); |
||
251 | |||
252 | if(substr2>0) break; |
||
253 | } |
||
254 | |||
255 | if (run) |
||
256 | { |
||
257 | // Choosing 2^n points |
||
258 | int j_j = j - 500; //cut off first 300 and last - 200 - points |
||
259 | int j_jj = j_j/num_points; |
||
260 | //printf("j_j = %d, j_jj = %d\n",j_j,j_jj); |
||
261 | |||
262 | //IMPORTANT! On graph must be only num_points of points |
||
263 | for (int i=0; i<num_points; i++) |
||
264 | { |
||
265 | volt_g[i] = volt_g1[300+i*j_jj]; |
||
266 | } |
||
267 | } |
||
268 | |||
269 | // Moving by steps |
||
270 | |||
271 | /*for(int i=(-num_points/2); i<(num_points/2); i++) |
||
272 | { |
||
273 | //printf("i is: %d\n", i); |
||
274 | movement(i); |
||
275 | asking_position(); |
||
276 | Delay(0.01); // Little time has to be in between so that grbl can respond |
||
277 | volt = read_voltage(); |
||
278 | Delay(wait); |
||
279 | FlushInQ (pCOM1); |
||
280 | FlushInQ (pCOM2); |
||
281 | SetCtrlVal(panel, p1_VOLTAGE, volt); |
||
282 | |||
283 | //writing in tabel for graph |
||
284 | volt_g[j] = volt; |
||
285 | j++; |
||
286 | |||
287 | if (!run) break; |
||
288 | |||
289 | }*/ |
||
290 | |||
291 | if (run) //IMPORTANT!! SAME NUM. of POINTS FOR FOURIER |
||
292 | { |
||
293 | //for(int i=0;i<j;i++) printf("volt_g[%d] = %lf\n",i,volt_g[i]); |
||
294 | if (graph>0) DeleteGraphPlot (panel, p1_VOLTAGE_GRAPH, graph, VAL_DELAYED_DRAW); |
||
295 | graph = PlotY (panel, p1_VOLTAGE_GRAPH, &volt_g[0], num_points, VAL_DOUBLE, |
||
296 | VAL_CONNECTED_POINTS, VAL_SIMPLE_DOT, VAL_SOLID, 1, VAL_WHITE); |
||
297 | ji = num_points; |
||
298 | f_t = 1; |
||
299 | } |
||
300 | |||
301 | FlushInQ (pCOM1); |
||
302 | FlushOutQ (pCOM1); |
||
303 | FlushInQ (pCOM2); |
||
304 | FlushOutQ (pCOM2); |
||
305 | run = 0; |
||
306 | |||
307 | return 0; |
||
308 | } |
||
309 | |||
310 | |||
311 | static int CVICALLBACK voltage_run(void *functionData) |
||
312 | { |
||
313 | int fix_range; |
||
314 | double ymin,ymax,xmin,xmax; |
||
315 | double voltA,voltB=0; |
||
316 | int time = 0; |
||
317 | //double volt1[TEXT_LENGTH]; |
||
318 | |||
319 | initialize_voltage(); |
||
320 | |||
321 | int chart = NewCtrl (panel, CTRL_GRAPH_LS, "RUN VOLTAGE", 100, 15); |
||
322 | SetCtrlAttribute(panel, chart, ATTR_HEIGHT, 600); |
||
323 | SetCtrlAttribute(panel, chart, ATTR_WIDTH , 1300); |
||
324 | |||
325 | while(1) |
||
326 | { |
||
327 | // Range |
||
328 | GetCtrlVal(panel, p1_RANGE, &fix_range); |
||
329 | if(fix_range) |
||
330 | { |
||
331 | GetAxisRange (panel, chart, VAL_MANUAL, &xmin, &xmax, VAL_MANUAL, &ymin, &ymax); |
||
332 | if (ymax<=2) SetAxisRange (panel, chart, VAL_NO_CHANGE, 0, 0, VAL_MANUAL, 0, 2); |
||
333 | else SetAxisRange (panel, chart, VAL_NO_CHANGE, 0, 0, VAL_MANUAL, 0, 5); |
||
334 | } |
||
335 | else SetAxisRange (panel, chart, VAL_NO_CHANGE, 0, 0, VAL_AUTOSCALE, 0, 0); |
||
336 | |||
337 | //volt1[time] = read_voltage(); |
||
338 | voltA = read_voltage(); |
||
339 | |||
340 | PlotPoint(panel, chart, time, voltA, VAL_SOLID_SQUARE, VAL_WHITE); |
||
341 | if (time>0) PlotLine(panel, chart, time, voltA, time-1, voltB, VAL_WHITE); |
||
342 | if (time>50) SetAxisRange (panel, chart, VAL_MANUAL, time-50, time, VAL_NO_CHANGE, 0, 0); |
||
343 | |||
344 | SetCtrlVal(panel, p1_VOLTAGE, voltA); |
||
345 | |||
346 | Delay(0.05); |
||
347 | time++; |
||
348 | |||
349 | voltB = voltA; |
||
350 | |||
351 | //volt1[time] = voltA; |
||
352 | |||
353 | FlushInQ (pCOM2); |
||
354 | |||
355 | if (vi == 0) break; |
||
356 | } |
||
357 | |||
358 | DiscardCtrl (panel, chart); |
||
359 | |||
360 | // After some time (~4000 points) it becomes slower in writing out data... |
||
361 | |||
362 | //if (graph!=0) DeleteGraphPlot (panel, p1_VOLTAGE_GRAPH, graph, VAL_DELAYED_DRAW); |
||
363 | //graph = PlotY (panel, p1_VOLTAGE_GRAPH, &volt1[0], time+1, VAL_DOUBLE, |
||
364 | // VAL_CONNECTED_POINTS, VAL_SIMPLE_DOT, VAL_SOLID, 1, VAL_WHITE); |
||
365 | |||
366 | return 0; |
||
367 | } |
||
368 | |||
369 | |||
370 | static int CVICALLBACK free_run(void *functionData) |
||
371 | { |
||
372 | if (run == 1) return 0; |
||
373 | run1 = 1; |
||
374 | |||
375 | if (left_1) movement(-10000); |
||
376 | if (right_1) movement(10000); |
||
377 | |||
378 | left_1 = 0; |
||
379 | right_1 = 0; |
||
380 | |||
381 | while (1) |
||
382 | { |
||
383 | if (run1 == 0) |
||
384 | { |
||
385 | ComWrt (pCOM1, "!\n", 2); //stops grbl |
||
386 | |||
387 | Delay(0.01); |
||
388 | |||
389 | ComWrt (pCOM1, "~\n", 2); //releases grbl |
||
390 | |||
391 | Delay(0.01); |
||
392 | |||
393 | int strLen = GetInQLen (pCOM1); |
||
394 | bytes_read0 = ComRd (pCOM1, read_data0, strLen); |
||
395 | //printf(" : %s", read_data0); |
||
396 | |||
397 | printf("Stop run1\n"); |
||
398 | |||
399 | break; |
||
400 | } |
||
401 | } |
||
402 | |||
403 | return 0; |
||
404 | } |
||
405 | |||
406 | |||
407 | int main() |
||
408 | { |
||
409 | |||
410 | SetStdioPort(HOST_SYSTEM_STDIO); |
||
411 | SetStdioWindowOptions(1000000, 0, 0); |
||
412 | SetStdioWindowVisibility(1); |
||
413 | |||
414 | initialize(); |
||
415 | |||
416 | CmtNewThreadPool (MAX_THREADS, &poolHandle); |
||
417 | |||
418 | DisplayPanel (panel = LoadPanel (0, "motor.uir", p1)); |
||
419 | RunUserInterface (); |
||
420 | |||
421 | CmtDiscardThreadPool (poolHandle); |
||
422 | |||
423 | return 0; |
||
424 | } |
||
425 | |||
426 | |||
427 | int CVICALLBACK StartCB (int panel, int control, int event, |
||
428 | void *callbackData, int eventData1, int eventData2) |
||
429 | { |
||
430 | int dummy; |
||
431 | |||
432 | switch (event) |
||
433 | { |
||
434 | case EVENT_COMMIT: |
||
435 | |||
436 | if (run == 1) break; |
||
437 | |||
438 | run = 1; |
||
439 | |||
440 | CmtScheduleThreadPoolFunction (poolHandle, daq_run, (void *)&dummy, &tfID); |
||
441 | |||
442 | } |
||
443 | |||
444 | return 0; |
||
445 | } |
||
446 | |||
447 | |||
448 | int CVICALLBACK StopCB (int panel, int control, int event, |
||
449 | void *callbackData, int eventData1, int eventData2) |
||
450 | { |
||
451 | switch (event) |
||
452 | { |
||
453 | case EVENT_COMMIT: |
||
454 | |||
455 | if (run == 0) break; |
||
456 | |||
457 | run = 0; |
||
458 | |||
459 | CmtWaitForThreadPoolFunctionCompletion (poolHandle, tfID, |
||
460 | OPT_TP_PROCESS_EVENTS_WHILE_WAITING); |
||
461 | CmtReleaseThreadPoolFunctionID (poolHandle, tfID); |
||
462 | |||
463 | printf("Stop\n"); |
||
464 | |||
465 | break; |
||
466 | |||
467 | } |
||
468 | |||
469 | return 0; |
||
470 | } |
||
471 | |||
472 | |||
473 | int CVICALLBACK ExitCB (int panel, int control, int event, |
||
474 | void *callbackData, int eventData1, int eventData2) |
||
475 | { |
||
476 | switch (event) |
||
477 | { |
||
478 | case EVENT_COMMIT: |
||
479 | QuitUserInterface (0); |
||
480 | CloseCom(pCOM1); |
||
481 | CloseCom(pCOM2); |
||
482 | break; |
||
483 | } |
||
484 | return 0; |
||
485 | } |
||
486 | |||
487 | |||
488 | int CVICALLBACK Fourier_TransCB (int panel, int control, int event, |
||
489 | void *callbackData, int eventData1, int eventData2) |
||
490 | { |
||
491 | if (!ji) return 0; |
||
492 | const int ii = ji; |
||
493 | double fourier_t[ii], fourier_ti[ii]; |
||
494 | char window_fun; |
||
495 | |||
496 | switch (event) |
||
497 | { |
||
498 | case EVENT_COMMIT: |
||
499 | |||
500 | for(int i=0; i<ii; i++) |
||
501 | { |
||
502 | fourier_t[i] = volt_g[i]; |
||
503 | fourier_ti[i] = 0; |
||
504 | } |
||
505 | |||
506 | GetCtrlVal(panel, p1_WIN_FUN, &window_fun); |
||
507 | //printf("window_fun = %d\n", window_fun); |
||
508 | if (window_fun!=0) |
||
509 | { |
||
510 | //do something with window functions |
||
511 | if(window_fun==1) for(int i=0; i<ii; i++) fourier_t[i] = (2*fourier_t[i]); |
||
512 | if(window_fun==2) for(int i=0; i<ii; i++) fourier_t[i] = sin(fourier_t[i]); |
||
513 | YGraphPopup ("HOW volt_g LOOKS NOW", fourier_t, ii, VAL_DOUBLE); |
||
514 | } |
||
515 | |||
516 | FFT (fourier_t, fourier_ti, ii); |
||
517 | for (int i=0; i<ii; i++) fourier_t[i] = fabs(fourier_t[i]); |
||
518 | fourier_t[0]=0; |
||
519 | |||
520 | YGraphPopup ("FOURIER", fourier_t, ii/2+1, VAL_DOUBLE); |
||
521 | |||
522 | if (f_t == 1) |
||
523 | { |
||
524 | FILE *fp,*fp1; |
||
525 | |||
526 | //file name has to have file extension |
||
527 | char fname[50]; |
||
528 | GetCtrlVal(panel, p1_F_NAME, fname); |
||
529 | fp = fopen(fname, "w"); |
||
530 | |||
531 | char fname1[50]; |
||
532 | GetCtrlVal(panel, p1_F_NAME1, fname1); |
||
533 | fp1 = fopen(fname1, "w"); |
||
534 | |||
535 | fprintf(fp, "step\tvolt_g\n"); |
||
536 | for(int i=0; i<ii; i++) |
||
537 | { |
||
538 | fprintf(fp, "%d\t%lf\n", i+1, volt_g[i]); |
||
539 | } |
||
540 | |||
541 | fprintf(fp1, "step\tfourier_t\n"); |
||
542 | for(int i=0; i<ii/2+1; i++) |
||
543 | { |
||
544 | fprintf(fp1, "%d\t%lf\n", i, fourier_t[i]); //0th component is from DC - background? |
||
545 | } |
||
546 | |||
547 | fclose(fp); |
||
548 | fclose(fp1); |
||
549 | printf("Files %s and %s created.\n", fname, fname1); |
||
550 | } |
||
551 | |||
552 | f_t = 0; //so that we make only one file |
||
553 | break; |
||
554 | |||
555 | } |
||
556 | |||
557 | return 0; |
||
558 | } |
||
559 | |||
560 | |||
561 | int CVICALLBACK ExamplesCB (int panel, int control, int event, |
||
562 | void *callbackData, int eventData1, int eventData2) |
||
563 | { |
||
564 | const int ki=1024; |
||
565 | double ret[ki], ret1[ki]; |
||
566 | double val = 3.14159265/180; |
||
567 | int x1, x2, a1, a2; |
||
568 | |||
569 | switch (event) |
||
570 | { |
||
571 | case EVENT_COMMIT: |
||
572 | |||
573 | GetCtrlVal(panel, p1_FREQ1, &x1); |
||
574 | GetCtrlVal(panel, p1_FREQ2, &x2); |
||
575 | GetCtrlVal(panel, p1_AMPL1, &a1); |
||
576 | GetCtrlVal(panel, p1_AMPL2, &a2); |
||
577 | |||
578 | for (int i=0; i<ki; i++) |
||
579 | { |
||
580 | ret[i] = a1*sin(x1*i*val)+a2*sin(x2*i*val); |
||
581 | ret1[i] = 0; |
||
582 | } |
||
583 | YGraphPopup ("example graph", ret, ki, VAL_DOUBLE); |
||
584 | FFT (ret, ret1, ki); |
||
585 | for (int i=0; i<ki; i++) ret[i] = fabs(ret[i]); |
||
586 | //for (int i=0;i<ki;i++) printf("basic: %lf, fourier: %lf\n", ret1[i], ret[i]); |
||
587 | YGraphPopup ("example fourier", ret, ki/2+1, VAL_DOUBLE); |
||
588 | |||
589 | break; |
||
590 | } |
||
591 | return 0; |
||
592 | } |
||
593 | |||
594 | |||
595 | int CVICALLBACK Only_voltageCB (int panel, int control, int event, |
||
596 | void *callbackData, int eventData1, int eventData2) |
||
597 | { |
||
598 | int dummy, volt_run; |
||
599 | |||
600 | switch (event) |
||
601 | { |
||
602 | case EVENT_COMMIT: |
||
603 | |||
604 | GetCtrlVal (panel, p1_VOLT_GRAPH, &volt_run); |
||
605 | |||
606 | if(volt_run) |
||
607 | { |
||
608 | vi = 1; |
||
609 | CmtScheduleThreadPoolFunction (poolHandle, voltage_run, (void *)&dummy, &tfID); |
||
610 | } |
||
611 | |||
612 | else |
||
613 | { |
||
614 | vi = 0; |
||
615 | CmtWaitForThreadPoolFunctionCompletion (poolHandle, tfID, |
||
616 | OPT_TP_PROCESS_EVENTS_WHILE_WAITING); |
||
617 | CmtReleaseThreadPoolFunctionID (poolHandle, tfID); |
||
618 | } |
||
619 | |||
620 | break; |
||
621 | } |
||
622 | return 0; |
||
623 | } |
||
624 | |||
625 | |||
626 | int CVICALLBACK RangeCB (int panel, int control, int event, |
||
627 | void *callbackData, int eventData1, int eventData2) |
||
628 | { |
||
629 | int fix_range; |
||
630 | double ymin,ymax,xmin,xmax; |
||
631 | |||
632 | switch (event) |
||
633 | { |
||
634 | case EVENT_COMMIT: |
||
635 | |||
636 | GetCtrlVal(panel, p1_RANGE, &fix_range); |
||
637 | if(fix_range) |
||
638 | { |
||
639 | GetAxisRange (panel, p1_VOLTAGE_GRAPH, VAL_MANUAL, &xmin, &xmax, VAL_MANUAL, &ymin, &ymax); |
||
640 | if (ymax<=2) SetAxisRange (panel, p1_VOLTAGE_GRAPH, VAL_NO_CHANGE, 0, 0, VAL_MANUAL, 0, 2); |
||
641 | else SetAxisRange (panel, p1_VOLTAGE_GRAPH, VAL_NO_CHANGE, 0, 0, VAL_MANUAL, 0, 5); |
||
642 | } |
||
643 | else SetAxisRange (panel, p1_VOLTAGE_GRAPH, VAL_NO_CHANGE, 0, 0, VAL_AUTOSCALE, 0, 0); |
||
644 | |||
645 | break; |
||
646 | |||
647 | } |
||
648 | |||
649 | return 0; |
||
650 | } |
||
651 | |||
652 | |||
653 | int CVICALLBACK FreeMoveCB (int panel, int control, int event, |
||
654 | void *callbackData, int eventData1, int eventData2) |
||
655 | { |
||
656 | int dummy; |
||
657 | |||
658 | switch (event) |
||
659 | { |
||
660 | case EVENT_COMMIT: |
||
661 | |||
662 | if (run == 1) break; |
||
663 | if (run1 == 1) break; |
||
664 | right_1 = 1; |
||
665 | |||
666 | CmtScheduleThreadPoolFunction (poolHandle, free_run, (void *)&dummy, &tfID1); |
||
667 | |||
668 | break; |
||
669 | |||
670 | } |
||
671 | |||
672 | return 0; |
||
673 | } |
||
674 | |||
675 | int CVICALLBACK FreeMove1CB (int panel, int control, int event, |
||
676 | void *callbackData, int eventData1, int eventData2) |
||
677 | { |
||
678 | int dummy; |
||
679 | |||
680 | switch (event) |
||
681 | { |
||
682 | case EVENT_COMMIT: |
||
683 | |||
684 | if (run == 1) break; |
||
685 | if (run1 == 1) break; |
||
686 | left_1 = 1; |
||
687 | |||
688 | CmtScheduleThreadPoolFunction (poolHandle, free_run, (void *)&dummy, &tfID1); |
||
689 | |||
690 | break; |
||
691 | |||
692 | } |
||
693 | |||
694 | return 0; |
||
695 | } |
||
696 | |||
697 | int CVICALLBACK FreeMoveStopCB (int panel, int control, int event, |
||
698 | void *callbackData, int eventData1, int eventData2) |
||
699 | { |
||
700 | switch (event) |
||
701 | { |
||
702 | case EVENT_COMMIT: |
||
703 | |||
704 | if (run == 1) break; |
||
705 | if (run1 == 0) break; |
||
706 | run1 = 0; |
||
707 | |||
708 | CmtWaitForThreadPoolFunctionCompletion (poolHandle, tfID1, |
||
709 | OPT_TP_PROCESS_EVENTS_WHILE_WAITING); |
||
710 | CmtReleaseThreadPoolFunctionID (poolHandle, tfID1); |
||
711 | |||
712 | break; |
||
713 | |||
714 | } |
||
715 | |||
716 | return 0; |
||
717 | } |
||
718 | |||
719 | |||
720 | int CVICALLBACK Pos0CB (int panel, int control, int event, |
||
721 | void *callbackData, int eventData1, int eventData2) |
||
722 | { |
||
723 | switch (event) |
||
724 | { |
||
725 | case EVENT_COMMIT: |
||
726 | |||
727 | if (run == 1) break; |
||
728 | if (run1 == 1) break; |
||
729 | FlushInQ (pCOM1); |
||
730 | FlushOutQ (pCOM1); |
||
731 | CloseCom(pCOM1); |
||
732 | initialize(); |
||
733 | |||
734 | break; |
||
735 | |||
736 | } |
||
737 | |||
738 | return 0; |
||
739 | } |