Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 1 | /* |
Uwe Hermann | 50985c2 | 2013-04-23 22:24:30 +0200 | [diff] [blame] | 2 | * This file is part of the libsigrok project. |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 3 | * |
Bert Vermeulen | 13d8e03 | 2013-03-24 11:21:00 +0100 | [diff] [blame] | 4 | * Copyright (C) 2013 Bert Vermeulen <bert@biot.com> |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 5 | * |
| 6 | * This program is free software: you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by |
| 8 | * the Free Software Foundation, either version 3 of the License, or |
| 9 | * (at your option) any later version. |
| 10 | * |
| 11 | * This program is distributed in the hope that it will be useful, |
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 14 | * GNU General Public License for more details. |
| 15 | * |
| 16 | * You should have received a copy of the GNU General Public License |
| 17 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
| 18 | */ |
| 19 | |
| 20 | #include <sys/types.h> |
| 21 | #include <sys/stat.h> |
| 22 | #include <fcntl.h> |
| 23 | #include <unistd.h> |
| 24 | #include <sys/time.h> |
| 25 | #include <zip.h> |
Bert Vermeulen | 45c59c8 | 2012-07-05 00:55:07 +0200 | [diff] [blame] | 26 | #include "libsigrok.h" |
| 27 | #include "libsigrok-internal.h" |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 28 | |
Uwe Hermann | 29a2719 | 2013-05-03 21:59:32 +0200 | [diff] [blame] | 29 | /* Message logging helpers with subsystem-specific prefix string. */ |
| 30 | #define LOG_PREFIX "virtual-session: " |
| 31 | #define sr_log(l, s, args...) sr_log(l, LOG_PREFIX s, ## args) |
| 32 | #define sr_spew(s, args...) sr_spew(LOG_PREFIX s, ## args) |
| 33 | #define sr_dbg(s, args...) sr_dbg(LOG_PREFIX s, ## args) |
| 34 | #define sr_info(s, args...) sr_info(LOG_PREFIX s, ## args) |
| 35 | #define sr_warn(s, args...) sr_warn(LOG_PREFIX s, ## args) |
| 36 | #define sr_err(s, args...) sr_err(LOG_PREFIX s, ## args) |
Uwe Hermann | a885ce3 | 2012-11-11 12:44:16 +0100 | [diff] [blame] | 37 | |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 38 | /* size of payloads sent across the session bus */ |
Uwe Hermann | b4bd708 | 2012-10-19 10:07:22 +0200 | [diff] [blame] | 39 | /** @cond PRIVATE */ |
Uwe Hermann | 8ff6afc | 2012-01-06 16:20:28 +0100 | [diff] [blame] | 40 | #define CHUNKSIZE (512 * 1024) |
Uwe Hermann | b4bd708 | 2012-10-19 10:07:22 +0200 | [diff] [blame] | 41 | /** @endcond */ |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 42 | |
Uwe Hermann | bb7ef79 | 2012-02-17 22:25:01 +0100 | [diff] [blame] | 43 | struct session_vdev { |
Bert Vermeulen | 40dda2c | 2012-07-03 12:55:46 +0200 | [diff] [blame] | 44 | char *sessionfile; |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 45 | char *capturefile; |
| 46 | struct zip *archive; |
| 47 | struct zip_file *capfile; |
Bert Vermeulen | cb1e389 | 2011-12-15 03:31:31 +0100 | [diff] [blame] | 48 | int bytes_read; |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 49 | uint64_t samplerate; |
Bert Vermeulen | f1b296f | 2013-12-16 01:31:46 +0100 | [diff] [blame] | 50 | uint64_t total_samples; |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 51 | int unitsize; |
| 52 | int num_probes; |
| 53 | }; |
| 54 | |
Uwe Hermann | d68e2d1 | 2012-02-17 21:02:52 +0100 | [diff] [blame] | 55 | static GSList *dev_insts = NULL; |
Joel Holdsworth | 915f7cc | 2012-05-07 13:57:43 +0100 | [diff] [blame] | 56 | static const int hwcaps[] = { |
Bert Vermeulen | 1953564 | 2013-01-21 23:22:47 +0100 | [diff] [blame] | 57 | SR_CONF_CAPTUREFILE, |
| 58 | SR_CONF_CAPTURE_UNITSIZE, |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 59 | 0, |
| 60 | }; |
| 61 | |
Bert Vermeulen | f1b296f | 2013-12-16 01:31:46 +0100 | [diff] [blame] | 62 | static int receive_data(int fd, int revents, const struct sr_dev_inst *cb_sdi) |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 63 | { |
Uwe Hermann | d68e2d1 | 2012-02-17 21:02:52 +0100 | [diff] [blame] | 64 | struct sr_dev_inst *sdi; |
Uwe Hermann | bb7ef79 | 2012-02-17 22:25:01 +0100 | [diff] [blame] | 65 | struct session_vdev *vdev; |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 66 | struct sr_datafeed_packet packet; |
Bert Vermeulen | 9c939c5 | 2011-06-19 14:28:50 +0200 | [diff] [blame] | 67 | struct sr_datafeed_logic logic; |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 68 | GSList *l; |
| 69 | void *buf; |
| 70 | int ret, got_data; |
| 71 | |
Uwe Hermann | cb93f8a | 2011-11-24 22:57:48 +0100 | [diff] [blame] | 72 | (void)fd; |
| 73 | (void)revents; |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 74 | |
Uwe Hermann | a885ce3 | 2012-11-11 12:44:16 +0100 | [diff] [blame] | 75 | sr_dbg("Feed chunk."); |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 76 | |
| 77 | got_data = FALSE; |
Uwe Hermann | d68e2d1 | 2012-02-17 21:02:52 +0100 | [diff] [blame] | 78 | for (l = dev_insts; l; l = l->next) { |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 79 | sdi = l->data; |
Uwe Hermann | bb7ef79 | 2012-02-17 22:25:01 +0100 | [diff] [blame] | 80 | vdev = sdi->priv; |
| 81 | if (!vdev) |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 82 | /* already done with this instance */ |
| 83 | continue; |
| 84 | |
Uwe Hermann | b53738b | 2011-04-16 14:17:51 +0200 | [diff] [blame] | 85 | if (!(buf = g_try_malloc(CHUNKSIZE))) { |
Uwe Hermann | a885ce3 | 2012-11-11 12:44:16 +0100 | [diff] [blame] | 86 | sr_err("%s: buf malloc failed", __func__); |
Bert Vermeulen | a2e4646 | 2012-07-23 15:09:19 +0200 | [diff] [blame] | 87 | return FALSE; |
Uwe Hermann | b53738b | 2011-04-16 14:17:51 +0200 | [diff] [blame] | 88 | } |
| 89 | |
Uwe Hermann | bb7ef79 | 2012-02-17 22:25:01 +0100 | [diff] [blame] | 90 | ret = zip_fread(vdev->capfile, buf, CHUNKSIZE); |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 91 | if (ret > 0) { |
| 92 | got_data = TRUE; |
| 93 | packet.type = SR_DF_LOGIC; |
Bert Vermeulen | 9c939c5 | 2011-06-19 14:28:50 +0200 | [diff] [blame] | 94 | packet.payload = &logic; |
| 95 | logic.length = ret; |
Uwe Hermann | bb7ef79 | 2012-02-17 22:25:01 +0100 | [diff] [blame] | 96 | logic.unitsize = vdev->unitsize; |
Bert Vermeulen | 9c939c5 | 2011-06-19 14:28:50 +0200 | [diff] [blame] | 97 | logic.data = buf; |
Uwe Hermann | bb7ef79 | 2012-02-17 22:25:01 +0100 | [diff] [blame] | 98 | vdev->bytes_read += ret; |
Bert Vermeulen | f1b296f | 2013-12-16 01:31:46 +0100 | [diff] [blame] | 99 | sr_session_send(cb_sdi, &packet); |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 100 | } else { |
| 101 | /* done with this capture file */ |
Uwe Hermann | bb7ef79 | 2012-02-17 22:25:01 +0100 | [diff] [blame] | 102 | zip_fclose(vdev->capfile); |
| 103 | g_free(vdev->capturefile); |
| 104 | g_free(vdev); |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 105 | sdi->priv = NULL; |
| 106 | } |
| 107 | } |
| 108 | |
| 109 | if (!got_data) { |
| 110 | packet.type = SR_DF_END; |
Bert Vermeulen | f1b296f | 2013-12-16 01:31:46 +0100 | [diff] [blame] | 111 | sr_session_send(cb_sdi, &packet); |
Lars-Peter Clausen | b863fb1 | 2012-09-02 19:02:42 +0200 | [diff] [blame] | 112 | sr_session_source_remove(-1); |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 113 | } |
| 114 | |
| 115 | return TRUE; |
| 116 | } |
| 117 | |
| 118 | /* driver callbacks */ |
Uwe Hermann | 57ab7d9 | 2012-02-12 20:52:42 +0100 | [diff] [blame] | 119 | static int hw_cleanup(void); |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 120 | |
Peter Stuge | 34f06b9 | 2012-12-03 02:47:55 +0100 | [diff] [blame] | 121 | static int hw_init(struct sr_context *sr_ctx) |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 122 | { |
Peter Stuge | 34f06b9 | 2012-12-03 02:47:55 +0100 | [diff] [blame] | 123 | (void)sr_ctx; |
| 124 | |
Bert Vermeulen | 61136ea | 2012-07-05 11:27:48 +0200 | [diff] [blame] | 125 | return SR_OK; |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 126 | } |
| 127 | |
Uwe Hermann | 57ab7d9 | 2012-02-12 20:52:42 +0100 | [diff] [blame] | 128 | static int hw_cleanup(void) |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 129 | { |
| 130 | GSList *l; |
| 131 | |
Uwe Hermann | d68e2d1 | 2012-02-17 21:02:52 +0100 | [diff] [blame] | 132 | for (l = dev_insts; l; l = l->next) |
Bert Vermeulen | d3683c4 | 2012-02-13 15:31:59 +0100 | [diff] [blame] | 133 | sr_dev_inst_free(l->data); |
Uwe Hermann | d68e2d1 | 2012-02-17 21:02:52 +0100 | [diff] [blame] | 134 | g_slist_free(dev_insts); |
| 135 | dev_insts = NULL; |
Gareth McMullin | 805e964 | 2011-11-17 21:18:46 +1300 | [diff] [blame] | 136 | |
Uwe Hermann | 57ab7d9 | 2012-02-12 20:52:42 +0100 | [diff] [blame] | 137 | return SR_OK; |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 138 | } |
| 139 | |
Bert Vermeulen | 25a0f10 | 2012-07-21 22:04:47 +0200 | [diff] [blame] | 140 | static int hw_dev_open(struct sr_dev_inst *sdi) |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 141 | { |
Uwe Hermann | bb7ef79 | 2012-02-17 22:25:01 +0100 | [diff] [blame] | 142 | if (!(sdi->priv = g_try_malloc0(sizeof(struct session_vdev)))) { |
Uwe Hermann | a885ce3 | 2012-11-11 12:44:16 +0100 | [diff] [blame] | 143 | sr_err("%s: sdi->priv malloc failed", __func__); |
Uwe Hermann | b53738b | 2011-04-16 14:17:51 +0200 | [diff] [blame] | 144 | return SR_ERR_MALLOC; |
| 145 | } |
| 146 | |
Uwe Hermann | d68e2d1 | 2012-02-17 21:02:52 +0100 | [diff] [blame] | 147 | dev_insts = g_slist_append(dev_insts, sdi); |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 148 | |
| 149 | return SR_OK; |
| 150 | } |
| 151 | |
Bert Vermeulen | 003595a | 2013-03-25 20:21:10 +0100 | [diff] [blame] | 152 | static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi) |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 153 | { |
Uwe Hermann | bb7ef79 | 2012-02-17 22:25:01 +0100 | [diff] [blame] | 154 | struct session_vdev *vdev; |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 155 | |
Bert Vermeulen | 035a107 | 2013-01-24 19:19:09 +0100 | [diff] [blame] | 156 | switch (id) { |
Bert Vermeulen | 123e131 | 2013-01-25 03:17:36 +0100 | [diff] [blame] | 157 | case SR_CONF_SAMPLERATE: |
Bert Vermeulen | 387014d | 2012-07-15 04:33:38 +0200 | [diff] [blame] | 158 | if (sdi) { |
| 159 | vdev = sdi->priv; |
Bert Vermeulen | 003595a | 2013-03-25 20:21:10 +0100 | [diff] [blame] | 160 | *data = g_variant_new_uint64(vdev->samplerate); |
Bert Vermeulen | 387014d | 2012-07-15 04:33:38 +0200 | [diff] [blame] | 161 | } else |
| 162 | return SR_ERR; |
| 163 | break; |
Bert Vermeulen | f1b296f | 2013-12-16 01:31:46 +0100 | [diff] [blame] | 164 | case SR_CONF_LIMIT_SAMPLES: |
| 165 | if (sdi) { |
| 166 | vdev = sdi->priv; |
| 167 | *data = g_variant_new_uint64(vdev->total_samples); |
| 168 | } else |
| 169 | return SR_ERR; |
| 170 | break; |
Bert Vermeulen | 387014d | 2012-07-15 04:33:38 +0200 | [diff] [blame] | 171 | default: |
| 172 | return SR_ERR_ARG; |
| 173 | } |
Bert Vermeulen | b8c2f85 | 2011-02-01 00:06:32 +0100 | [diff] [blame] | 174 | |
Bert Vermeulen | 387014d | 2012-07-15 04:33:38 +0200 | [diff] [blame] | 175 | return SR_OK; |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 176 | } |
| 177 | |
Bert Vermeulen | 003595a | 2013-03-25 20:21:10 +0100 | [diff] [blame] | 178 | static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi) |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 179 | { |
Uwe Hermann | bb7ef79 | 2012-02-17 22:25:01 +0100 | [diff] [blame] | 180 | struct session_vdev *vdev; |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 181 | |
Bert Vermeulen | 6f4b186 | 2012-07-16 03:52:14 +0200 | [diff] [blame] | 182 | vdev = sdi->priv; |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 183 | |
Bert Vermeulen | 035a107 | 2013-01-24 19:19:09 +0100 | [diff] [blame] | 184 | switch (id) { |
Bert Vermeulen | 1953564 | 2013-01-21 23:22:47 +0100 | [diff] [blame] | 185 | case SR_CONF_SAMPLERATE: |
Bert Vermeulen | 003595a | 2013-03-25 20:21:10 +0100 | [diff] [blame] | 186 | vdev->samplerate = g_variant_get_uint64(data); |
Uwe Hermann | a885ce3 | 2012-11-11 12:44:16 +0100 | [diff] [blame] | 187 | sr_info("Setting samplerate to %" PRIu64 ".", vdev->samplerate); |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 188 | break; |
Bert Vermeulen | 1953564 | 2013-01-21 23:22:47 +0100 | [diff] [blame] | 189 | case SR_CONF_SESSIONFILE: |
Bert Vermeulen | 003595a | 2013-03-25 20:21:10 +0100 | [diff] [blame] | 190 | vdev->sessionfile = g_strdup(g_variant_get_string(data, NULL)); |
Uwe Hermann | a885ce3 | 2012-11-11 12:44:16 +0100 | [diff] [blame] | 191 | sr_info("Setting sessionfile to '%s'.", vdev->sessionfile); |
Bert Vermeulen | 40dda2c | 2012-07-03 12:55:46 +0200 | [diff] [blame] | 192 | break; |
Bert Vermeulen | 1953564 | 2013-01-21 23:22:47 +0100 | [diff] [blame] | 193 | case SR_CONF_CAPTUREFILE: |
Bert Vermeulen | 003595a | 2013-03-25 20:21:10 +0100 | [diff] [blame] | 194 | vdev->capturefile = g_strdup(g_variant_get_string(data, NULL)); |
Uwe Hermann | a885ce3 | 2012-11-11 12:44:16 +0100 | [diff] [blame] | 195 | sr_info("Setting capturefile to '%s'.", vdev->capturefile); |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 196 | break; |
Bert Vermeulen | 1953564 | 2013-01-21 23:22:47 +0100 | [diff] [blame] | 197 | case SR_CONF_CAPTURE_UNITSIZE: |
Bert Vermeulen | 003595a | 2013-03-25 20:21:10 +0100 | [diff] [blame] | 198 | vdev->unitsize = g_variant_get_uint64(data); |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 199 | break; |
Bert Vermeulen | f1b296f | 2013-12-16 01:31:46 +0100 | [diff] [blame] | 200 | case SR_CONF_LIMIT_SAMPLES: |
| 201 | vdev->total_samples = g_variant_get_uint64(data); |
| 202 | break; |
Bert Vermeulen | 1953564 | 2013-01-21 23:22:47 +0100 | [diff] [blame] | 203 | case SR_CONF_CAPTURE_NUM_PROBES: |
Bert Vermeulen | 003595a | 2013-03-25 20:21:10 +0100 | [diff] [blame] | 204 | vdev->num_probes = g_variant_get_uint64(data); |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 205 | break; |
| 206 | default: |
Bert Vermeulen | 035a107 | 2013-01-24 19:19:09 +0100 | [diff] [blame] | 207 | sr_err("Unknown capability: %d.", id); |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 208 | return SR_ERR; |
| 209 | } |
| 210 | |
| 211 | return SR_OK; |
| 212 | } |
| 213 | |
Bert Vermeulen | 003595a | 2013-03-25 20:21:10 +0100 | [diff] [blame] | 214 | static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi) |
Bert Vermeulen | 9a6517d | 2013-01-25 15:01:49 +0100 | [diff] [blame] | 215 | { |
| 216 | |
| 217 | (void)sdi; |
| 218 | |
| 219 | switch (key) { |
| 220 | case SR_CONF_DEVICE_OPTIONS: |
Bert Vermeulen | f1b296f | 2013-12-16 01:31:46 +0100 | [diff] [blame] | 221 | // *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32, |
| 222 | // hwcaps, ARRAY_SIZE(hwcaps), sizeof(int32_t)); |
| 223 | *data = g_variant_new_from_data(G_VARIANT_TYPE("ai"), |
| 224 | hwcaps, ARRAY_SIZE(hwcaps)*sizeof(int32_t), TRUE, NULL, NULL); |
Bert Vermeulen | 9a6517d | 2013-01-25 15:01:49 +0100 | [diff] [blame] | 225 | break; |
| 226 | default: |
| 227 | return SR_ERR_ARG; |
| 228 | } |
| 229 | |
| 230 | return SR_OK; |
| 231 | } |
| 232 | |
Bert Vermeulen | 4d68442 | 2012-07-22 12:18:34 +0200 | [diff] [blame] | 233 | static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi, |
| 234 | void *cb_data) |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 235 | { |
| 236 | struct zip_stat zs; |
Uwe Hermann | bb7ef79 | 2012-02-17 22:25:01 +0100 | [diff] [blame] | 237 | struct session_vdev *vdev; |
Uwe Hermann | ebc3473 | 2012-03-20 17:51:18 +0100 | [diff] [blame] | 238 | int ret; |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 239 | |
Bert Vermeulen | 4d68442 | 2012-07-22 12:18:34 +0200 | [diff] [blame] | 240 | vdev = sdi->priv; |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 241 | |
Uwe Hermann | a885ce3 | 2012-11-11 12:44:16 +0100 | [diff] [blame] | 242 | sr_info("Opening archive %s file %s", vdev->sessionfile, |
Uwe Hermann | bb7ef79 | 2012-02-17 22:25:01 +0100 | [diff] [blame] | 243 | vdev->capturefile); |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 244 | |
Bert Vermeulen | 40dda2c | 2012-07-03 12:55:46 +0200 | [diff] [blame] | 245 | if (!(vdev->archive = zip_open(vdev->sessionfile, 0, &ret))) { |
Uwe Hermann | a885ce3 | 2012-11-11 12:44:16 +0100 | [diff] [blame] | 246 | sr_err("Failed to open session file '%s': " |
Bert Vermeulen | 40dda2c | 2012-07-03 12:55:46 +0200 | [diff] [blame] | 247 | "zip error %d\n", vdev->sessionfile, ret); |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 248 | return SR_ERR; |
| 249 | } |
| 250 | |
Uwe Hermann | bb7ef79 | 2012-02-17 22:25:01 +0100 | [diff] [blame] | 251 | if (zip_stat(vdev->archive, vdev->capturefile, 0, &zs) == -1) { |
Uwe Hermann | a885ce3 | 2012-11-11 12:44:16 +0100 | [diff] [blame] | 252 | sr_err("Failed to check capture file '%s' in " |
Bert Vermeulen | 40dda2c | 2012-07-03 12:55:46 +0200 | [diff] [blame] | 253 | "session file '%s'.", vdev->capturefile, vdev->sessionfile); |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 254 | return SR_ERR; |
| 255 | } |
| 256 | |
Uwe Hermann | bb7ef79 | 2012-02-17 22:25:01 +0100 | [diff] [blame] | 257 | if (!(vdev->capfile = zip_fopen(vdev->archive, vdev->capturefile, 0))) { |
Uwe Hermann | a885ce3 | 2012-11-11 12:44:16 +0100 | [diff] [blame] | 258 | sr_err("Failed to open capture file '%s' in " |
Bert Vermeulen | 40dda2c | 2012-07-03 12:55:46 +0200 | [diff] [blame] | 259 | "session file '%s'.", vdev->capturefile, vdev->sessionfile); |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 260 | return SR_ERR; |
| 261 | } |
| 262 | |
Uwe Hermann | 4afdfd4 | 2013-02-06 19:57:32 +0100 | [diff] [blame] | 263 | /* Send header packet to the session bus. */ |
Bert Vermeulen | f1b296f | 2013-12-16 01:31:46 +0100 | [diff] [blame] | 264 | std_session_send_df_header(sdi, LOG_PREFIX); |
Uwe Hermann | 4afdfd4 | 2013-02-06 19:57:32 +0100 | [diff] [blame] | 265 | |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 266 | /* freewheeling source */ |
Bert Vermeulen | f1b296f | 2013-12-16 01:31:46 +0100 | [diff] [blame] | 267 | sr_session_source_add(-1, 0, 0, receive_data, sdi); |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 268 | |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 269 | return SR_OK; |
| 270 | } |
| 271 | |
Uwe Hermann | b4bd708 | 2012-10-19 10:07:22 +0200 | [diff] [blame] | 272 | /** @private */ |
Uwe Hermann | c09f0b5 | 2012-02-28 23:52:30 +0100 | [diff] [blame] | 273 | SR_PRIV struct sr_dev_driver session_driver = { |
Uwe Hermann | a885ce3 | 2012-11-11 12:44:16 +0100 | [diff] [blame] | 274 | .name = "virtual-session", |
Uwe Hermann | 5097b0d | 2012-02-18 11:41:21 +0100 | [diff] [blame] | 275 | .longname = "Session-emulating driver", |
| 276 | .api_version = 1, |
| 277 | .init = hw_init, |
| 278 | .cleanup = hw_cleanup, |
Bert Vermeulen | 035a107 | 2013-01-24 19:19:09 +0100 | [diff] [blame] | 279 | .config_get = config_get, |
| 280 | .config_set = config_set, |
Bert Vermeulen | 9a6517d | 2013-01-25 15:01:49 +0100 | [diff] [blame] | 281 | .config_list = config_list, |
Uwe Hermann | e7eb703 | 2012-02-18 11:57:43 +0100 | [diff] [blame] | 282 | .dev_open = hw_dev_open, |
| 283 | .dev_close = NULL, |
Uwe Hermann | 69040b7 | 2012-02-18 12:03:49 +0100 | [diff] [blame] | 284 | .dev_acquisition_start = hw_dev_acquisition_start, |
| 285 | .dev_acquisition_stop = NULL, |
Bert Vermeulen | 7d65887 | 2011-01-31 22:34:14 +0100 | [diff] [blame] | 286 | }; |