14 #include <libinternal.h>
17 int comedi_get_cmd_src_mask(comedi_t *it,unsigned int subd,comedi_cmd *cmd)
22 if(!valid_subd(it,subd))return -1;
24 s=it->subdevices+subd;
26 if(s->cmd_mask_errno){
27 errno = s->cmd_mask_errno;
34 mask = malloc(sizeof(comedi_cmd));
36 memset(mask,0,sizeof(*cmd));
40 mask->start_src = TRIG_ANY;
41 mask->scan_begin_src = TRIG_ANY;
42 mask->convert_src = TRIG_ANY;
43 mask->scan_end_src = TRIG_ANY;
44 mask->stop_src = TRIG_ANY;
48 ret = comedi_command_test(it,mask);
50 s->cmd_mask_errno = errno;
58 static int __generic_timed(comedi_t *it,unsigned int s,
59 comedi_cmd *cmd, unsigned int ns)
63 ret = comedi_get_cmd_src_mask(it,s,cmd);
66 __comedi_errno = ENOTSUPPORTED;
68 if(cmd->start_src&TRIG_NOW){
69 cmd->start_src=TRIG_NOW;
71 }else if(cmd->start_src&TRIG_FOLLOW){
72 cmd->start_src=TRIG_FOLLOW;
75 DEBUG(3,"can't find good start_src\n");
79 /* Potential bug: there is a possibility that the source mask may
80 * have * TRIG_TIMER set for both convert_src and scan_begin_src,
81 * but they may not be supported together. */
82 if(cmd->convert_src&TRIG_TIMER){
83 if(cmd->scan_begin_src&TRIG_FOLLOW){
84 cmd->convert_src = TRIG_TIMER;
85 cmd->convert_arg = ns;
86 cmd->scan_begin_src = TRIG_FOLLOW;
87 cmd->scan_begin_arg = 0;
89 cmd->convert_src = TRIG_TIMER;
90 cmd->convert_arg = ns;
91 cmd->scan_begin_src = TRIG_TIMER;
92 cmd->scan_begin_arg = ns;
94 }else if(cmd->convert_src & TRIG_NOW &&
95 cmd->scan_begin_src & TRIG_TIMER)
97 cmd->convert_src = TRIG_NOW;
99 cmd->scan_begin_src = TRIG_TIMER;
100 cmd->scan_begin_arg = ns;
102 DEBUG(3,"comedi_get_cmd_generic_timed: can't do timed?\n");
106 cmd->scan_end_src = TRIG_COUNT;
107 cmd->scan_end_arg = 1;
109 if(cmd->stop_src&TRIG_COUNT){
110 cmd->stop_src=TRIG_COUNT;
112 }else if(cmd->stop_src&TRIG_NONE){
113 cmd->stop_src=TRIG_NONE;
116 DEBUG(3,"comedi_get_cmd_generic_timed: can't find a good stop_src\n");
120 cmd->chanlist_len = 1;
122 ret=comedi_command_test(it,cmd);
123 DEBUG(3,"comedi_get_cmd_generic_timed: test 1 returned %d\n",ret);
126 ret=comedi_command_test(it,cmd);
127 DEBUG(3,"comedi_get_cmd_generic_timed: test 2 returned %d\n",ret);
129 if(ret==4 || ret==0){
136 int comedi_get_cmd_generic_timed(comedi_t *it,unsigned int subd,comedi_cmd *cmd,
142 if(!valid_subd(it,subd))return -1;
144 s=it->subdevices+subd;
146 if(s->cmd_timed_errno){
147 errno = s->cmd_mask_errno;
152 s->cmd_timed = malloc(sizeof(comedi_cmd));
154 ret = __generic_timed(it,subd,s->cmd_timed,ns);
156 s->cmd_mask_errno = errno;