- if(trigger_mask[0]) {
- /* trigger masks */
- if(send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_MASK_0, trigger_mask[0]) != SIGROK_OK)
- return SIGROK_NOK;
- if(send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_MASK_1, trigger_mask[1]) != SIGROK_OK)
- return SIGROK_NOK;
- if(send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_MASK_2, trigger_mask[2]) != SIGROK_OK)
- return SIGROK_NOK;
- if(send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_MASK_3, trigger_mask[3]) != SIGROK_OK)
- return SIGROK_NOK;
-
- if(send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_VALUE_0, trigger_value[0]) != SIGROK_OK)
- return SIGROK_NOK;
- if(send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_VALUE_1, trigger_value[1]) != SIGROK_OK)
- return SIGROK_NOK;
- if(send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_VALUE_2, trigger_value[2]) != SIGROK_OK)
- return SIGROK_NOK;
- if(send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_VALUE_3, trigger_value[3]) != SIGROK_OK)
- return SIGROK_NOK;
-
- /* 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_NOK;
- if(send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_CONFIG_1, 0x00000000) != SIGROK_OK)
- return SIGROK_NOK;
- if(send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_CONFIG_2, 0x00000000) != SIGROK_OK)
- return SIGROK_NOK;
- if(send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_CONFIG_3, 0x00000000) != SIGROK_OK)
- return SIGROK_NOK;
- delaycount = limit_samples / 4 * (capture_ratio / 100);
+ 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])) != SIGROK_OK)
+ return SIGROK_ERR;
+ if (send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_VALUE_0,
+ reverse32(trigger_value[0])) != SIGROK_OK)
+ return SIGROK_ERR;
+ if (send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_CONFIG_0,
+ trigger_config[0]) != SIGROK_OK)
+ return SIGROK_ERR;
+
+ if (send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_MASK_1,
+ reverse32(trigger_mask[1])) != SIGROK_OK)
+ return SIGROK_ERR;
+ if (send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_VALUE_1,
+ reverse32(trigger_value[1])) != SIGROK_OK)
+ return SIGROK_ERR;
+ if (send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_CONFIG_1,
+ trigger_config[1]) != SIGROK_OK)
+ return SIGROK_ERR;
+
+ if (send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_MASK_2,
+ reverse32(trigger_mask[2])) != SIGROK_OK)
+ return SIGROK_ERR;
+ if (send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_VALUE_2,
+ reverse32(trigger_value[2])) != SIGROK_OK)
+ return SIGROK_ERR;
+ if (send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_CONFIG_2,
+ trigger_config[2]) != SIGROK_OK)
+ return SIGROK_ERR;
+
+ if (send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_MASK_3,
+ reverse32(trigger_mask[3])) != SIGROK_OK)
+ return SIGROK_ERR;
+ if (send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_VALUE_3,
+ reverse32(trigger_value[3])) != SIGROK_OK)
+ return SIGROK_ERR;
+ if (send_longcommand(sdi->serial->fd, CMD_SET_TRIGGER_CONFIG_3,
+ trigger_config[3]) != SIGROK_OK)
+ return SIGROK_ERR;