-
- if(!(sdi = get_sigrok_device_instance(device_instances, device_index)))
- return SIGROK_ERR;
-
- if(sdi->status != ST_ACTIVE)
- return SIGROK_ERR;
-
- /* reset again */
- if(send_longcommand(sdi->serial->fd, CMD_RESET, 0) != SIGROK_OK)
- return SIGROK_ERR;
-
- /* send flag register */
- data = flag_reg << 24;
- if(send_longcommand(sdi->serial->fd, CMD_SET_FLAGS, data) != SIGROK_OK)
- return SIGROK_ERR;
-
- /* send sample limit and pre/post-trigger capture ratio */
- data = limit_samples / 4 << 16;
- if(capture_ratio)
- data |= (limit_samples - (limit_samples / 100 * capture_ratio)) / 4;
- data = 0x00190019;
- if(send_longcommand(sdi->serial->fd, CMD_CAPTURE_SIZE, data) != SIGROK_OK)
- return SIGROK_ERR;
-
- /* trigger masks */
- if(send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_MASK_0, trigger_mask[0]) != SIGROK_OK)
- return SIGROK_ERR;
-// if(send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_MASK_1, trigger_mask[1]) != SIGROK_OK)
-// return SIGROK_ERR;
-// if(send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_MASK_2, trigger_mask[2]) != SIGROK_OK)
-// return SIGROK_ERR;
-// if(send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_MASK_3, trigger_mask[3]) != SIGROK_OK)
-// return SIGROK_ERR;
-
- if(send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_VALUE_0, trigger_value[0]) != SIGROK_OK)
- return SIGROK_ERR;
-// if(send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_VALUE_1, trigger_value[1]) != SIGROK_OK)
-// return SIGROK_ERR;
-// if(send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_VALUE_2, trigger_value[2]) != SIGROK_OK)
-// return SIGROK_ERR;
-// if(send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_VALUE_3, trigger_value[3]) != SIGROK_OK)
-// return SIGROK_ERR;
-
- /* trigger configuration */
- /* TODO: the start flag should only be on the last used stage I think... */
- if(send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_CONFIG_0, 0x00000008) != SIGROK_OK)
- return SIGROK_ERR;
-// if(send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_CONFIG_1, 0x00000000) != SIGROK_OK)
-// return SIGROK_ERR;
-// if(send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_CONFIG_2, 0x00000000) != SIGROK_OK)
-// return SIGROK_ERR;
-// if(send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_CONFIG_3, 0x00000000) != SIGROK_OK)
-// return SIGROK_ERR;
+ uint16_t readcount, delaycount;
+ uint8_t changrp_mask;
+
+ if (!(sdi = sr_get_device_instance(device_instances, device_index)))
+ return SR_ERR;
+
+ if (sdi->status != SR_ST_ACTIVE)
+ return SR_ERR;
+
+ readcount = limit_samples / 4;
+
+ memset(trigger_config, 0, 16);
+ trigger_config[num_stages-1] |= 0x08;
+ if (trigger_mask[0]) {
+ delaycount = readcount * (1 - capture_ratio / 100.0);
+ trigger_at = (readcount - delaycount) * 4 - num_stages;
+
+ if (send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_MASK_0,
+ reverse32(trigger_mask[0])) != SR_OK)
+ return SR_ERR;
+ if (send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_VALUE_0,
+ reverse32(trigger_value[0])) != SR_OK)
+ return SR_ERR;
+ if (send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_CONFIG_0,
+ trigger_config[0]) != SR_OK)
+ return SR_ERR;
+
+ if (send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_MASK_1,
+ reverse32(trigger_mask[1])) != SR_OK)
+ return SR_ERR;
+ if (send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_VALUE_1,
+ reverse32(trigger_value[1])) != SR_OK)
+ return SR_ERR;
+ if (send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_CONFIG_1,
+ trigger_config[1]) != SR_OK)
+ return SR_ERR;
+
+ if (send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_MASK_2,
+ reverse32(trigger_mask[2])) != SR_OK)
+ return SR_ERR;
+ if (send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_VALUE_2,
+ reverse32(trigger_value[2])) != SR_OK)
+ return SR_ERR;
+ if (send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_CONFIG_2,
+ trigger_config[2]) != SR_OK)
+ return SR_ERR;
+
+ if (send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_MASK_3,
+ reverse32(trigger_mask[3])) != SR_OK)
+ return SR_ERR;
+ if (send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_VALUE_3,
+ reverse32(trigger_value[3])) != SR_OK)
+ return SR_ERR;
+ if (send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_CONFIG_3,
+ trigger_config[3]) != SR_OK)
+ return SR_ERR;
+ } else {
+ if (send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_MASK_0,
+ trigger_mask[0]) != SR_OK)
+ return SR_ERR;
+ if (send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_VALUE_0,
+ trigger_value[0]) != SR_OK)
+ return SR_ERR;
+ if (send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_CONFIG_0,
+ 0x00000008) != SR_OK)
+ return SR_ERR;
+ delaycount = readcount;
+ }