1 /* 2 * This file is part of the libsigrok project. 3 * 4 * Copyright (C) 2013 Bert Vermeulen <bert@biot.com> 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 #ifndef LIBSIGROK_HARDWARE_CEM_DT_885X_PROTOCOL_H 21 #define LIBSIGROK_HARDWARE_CEM_DT_885X_PROTOCOL_H 22 23 #include <stdint.h> 24 #include <glib.h> 25 #include <libsigrok/libsigrok.h> 26 #include "libsigrok-internal.h" 27 28 #define LOG_PREFIX "cem-dt-885x" 29 30 /* When retrieving samples from device memory, group this many 31 * together into a sigrok packet. */ 32 #define SAMPLES_PER_PACKET 50 33 34 /* Various temporary storage, at least 8 bytes. */ 35 #define BUF_SIZE (SAMPLES_PER_PACKET * 2) 36 37 /* When in hold mode, force the last measurement out at this interval. 38 * We're using 50ms, which duplicates the non-hold 20Hz update rate. */ 39 #define HOLD_REPEAT_INTERVAL (50 * 1000) 40 41 enum { 42 TOKEN_WEIGHT_TIME_FAST = 0x02, 43 TOKEN_WEIGHT_TIME_SLOW = 0x03, 44 TOKEN_HOLD_MAX = 0x04, 45 TOKEN_HOLD_MIN = 0x05, 46 TOKEN_TIME = 0x06, 47 TOKEN_MEAS_RANGE_OVER = 0x07, 48 TOKEN_MEAS_RANGE_UNDER = 0x08, 49 TOKEN_STORE_FULL = 0x09, 50 TOKEN_RECORDING_ON = 0x0a, 51 TOKEN_MEAS_WAS_READOUT = 0x0b, 52 TOKEN_MEAS_WAS_BARGRAPH = 0x0c, 53 TOKEN_MEASUREMENT = 0xd, 54 TOKEN_HOLD_NONE = 0x0e, 55 TOKEN_BATTERY_LOW = 0x0f, 56 TOKEN_MEAS_RANGE_OK = 0x11, 57 TOKEN_STORE_OK = 0x19, 58 TOKEN_RECORDING_OFF = 0x1a, 59 TOKEN_WEIGHT_FREQ_A = 0x1b, 60 TOKEN_WEIGHT_FREQ_C = 0x1c, 61 TOKEN_BATTERY_OK = 0x1f, 62 TOKEN_MEAS_RANGE_30_80 = 0x30, 63 TOKEN_MEAS_RANGE_30_130 = 0x40, 64 TOKEN_MEAS_RANGE_50_100 = 0x4b, 65 TOKEN_MEAS_RANGE_80_130 = 0x4c, 66 }; 67 68 enum { 69 CMD_TOGGLE_RECORDING = 0x55, 70 CMD_TOGGLE_WEIGHT_FREQ = 0x99, 71 CMD_TOGGLE_WEIGHT_TIME = 0x77, 72 CMD_TOGGLE_HOLD_MAX_MIN = 0x11, 73 CMD_TOGGLE_MEAS_RANGE = 0x88, 74 CMD_TOGGLE_POWER_OFF = 0x33, 75 CMD_TRANSFER_MEMORY = 0xac, 76 }; 77 78 enum { 79 RECORD_DBA = 0xaa, 80 RECORD_DBC = 0xcc, 81 RECORD_DATA = 0xac, 82 RECORD_END = 0xdd, 83 }; 84 85 enum { 86 DATA_SOURCE_LIVE, 87 DATA_SOURCE_MEMORY, 88 }; 89 90 struct dev_context { 91 enum sr_mqflag cur_mqflags; 92 int recording; 93 int cur_meas_range; 94 int cur_data_source; 95 96 uint64_t limit_samples; 97 98 int state; 99 uint64_t num_samples; 100 gboolean enable_data_source_memory; 101 102 unsigned char cmd; 103 unsigned char token; 104 int buf_len; 105 unsigned char buf[BUF_SIZE]; 106 float last_spl; 107 gint64 hold_last_sent; 108 }; 109 110 /* Parser state machine. */ 111 enum { 112 ST_INIT, 113 ST_GET_TOKEN, 114 ST_GET_DATA, 115 ST_GET_LOG_HEADER, 116 ST_GET_LOG_RECORD_META, 117 ST_GET_LOG_RECORD_DATA, 118 }; 119 120 SR_PRIV int cem_dt_885x_receive_data(int fd, int revents, void *cb_data); 121 SR_PRIV int cem_dt_885x_recording_set(const struct sr_dev_inst *sdi, gboolean start); 122 SR_PRIV gboolean cem_dt_885x_recording_get(const struct sr_dev_inst *sdi, 123 int *state); 124 SR_PRIV int cem_dt_885x_weight_freq_get(const struct sr_dev_inst *sdi); 125 SR_PRIV int cem_dt_885x_weight_freq_set(const struct sr_dev_inst *sdi, int freqw); 126 SR_PRIV int cem_dt_885x_weight_time_get(const struct sr_dev_inst *sdi); 127 SR_PRIV int cem_dt_885x_weight_time_set(const struct sr_dev_inst *sdi, int timew); 128 SR_PRIV int cem_dt_885x_holdmode_get(const struct sr_dev_inst *sdi, 129 gboolean *holdmode); 130 SR_PRIV int cem_dt_885x_holdmode_set(const struct sr_dev_inst *sdi, int holdmode); 131 SR_PRIV int cem_dt_885x_meas_range_get(const struct sr_dev_inst *sdi, 132 uint64_t *low, uint64_t *high); 133 SR_PRIV int cem_dt_885x_meas_range_set(const struct sr_dev_inst *sdi, 134 uint64_t low, uint64_t high); 135 SR_PRIV int cem_dt_885x_power_off(const struct sr_dev_inst *sdi); 136 137 #endif 138