├── README.md ├── agilent └── n67xx │ └── README.md ├── dji └── ocusync2 │ ├── README.md │ ├── play.py │ └── symbols.txt └── lifesize ├── README.md ├── chill.py ├── chillboot └── cids /README.md: -------------------------------------------------------------------------------- 1 | tmbinc's random collection of interesting things 2 | ================================================ 3 | 4 | Take with a grain of salt. All of this will be work-in-progress, forever. 5 | -------------------------------------------------------------------------------- /agilent/n67xx/README.md: -------------------------------------------------------------------------------- 1 | Agilent/Keysight N67xx-Series 2 | ============================= 3 | 4 | The Agilent/Keysight N67xx-series DC power supplies are somewhat interesting 5 | because they are modular. There's a "mainframe" (N6700A/B/C, N6701B/C, 6 | N6702B/C, N6705A/B/C) that supplies a bulk 48V and provides a user 7 | interface, and then there are various modules that can be plugged in. 8 | 9 | There are a few categories of modules, from basic (N673xB/N674xB) to more 10 | advanced (higher-precision, higher-range) ones (N676x), or even SMUs 11 | (N678x) and e-Loads (N679x). 12 | 13 | Communication to the module is entirely digital, though with a somewhat 14 | interesting scheme. Individual modules are galvanically isolated, using a 15 | transformer for power transmission and optocoupler for the digital part. 16 | Additionally, a 12V is included in the module that is powered directly from 17 | the mainframe. 18 | 19 | Mainframes exist as either 19" racks (N6700/01/02), or as bench units 20 | (N6705). They are either PowerPC-based, running VxWorks (A, B models), 21 | or ARM-based, running WinCE (C models). 22 | 23 | Each module contains (at least) two PCBs, a large power PCB and a small 24 | control PCB that is plugged into a 168-pin DIMM socket. The control PCB 25 | contains ADCs, DACs and an FPGA, and configures things like the voltage 26 | and current setpoint, power limit setpoint, digitizes the current and 27 | voltage, and handles host communication. Configuration resistors on the 28 | power PCB allow to coarsely identify the module type, and then an I2C EEPROM 29 | is present on the power PCB that contains calibration information. 30 | 31 | The [specifications](https://literature.cdn.keysight.com/litweb/pdf/N6700-90001.pdf) give a good overview of the abilities of the different modules. All 32 | digitizing happens inside the modules, either using Sigma-Delta-ADCs or real 33 | ADCs (take a look at "measurement resolution", that typically gives away 34 | whether real ADCs are present or not). Basic modules contain a single ADC 35 | (which is muxed to the different measurement sources), more advanced modules 36 | can measure two things at the same time. 37 | 38 | Communication is done over SPI after initial configuration at a fixed rate. 39 | Each communication frame is 64-bit and can contain a measurement, a command 40 | response (from the device), or a command (from the host). 41 | 42 | One a module is configured to a specific current/voltage setpoint, it will 43 | regulate to these settings, including CC, CV modes, over-voltage and 44 | -current protection etc.; status and measurements can be queried by the 45 | host, and also regular-interval measurements are automatically streamed. 46 | 47 | This means that even the most basic modules allow for kHz-range digitization 48 | of measurements. 49 | 50 | Arbitrary waveform generation is also possible, though bandwidth is 51 | individually limited by slew time. The most advanced modules (N678x) can 52 | generate signals in the kHz-range, the basic modules are limited to a few 53 | hundred Hz. For ARB, simply flood the device with "set voltage" commands. 54 | 55 | The modules can also store lists and execute them without host intervention, 56 | though list size is limited of course. 57 | 58 | Initial configuration is done by talking JTAG to the FPGA. A special 59 | sequence first queries the ID code from the module, then configures a 60 | bitstream particular for this FPGA model, then queries configuration 61 | resistors over boundary scan, and then configures the final bitstream. After 62 | that, SPI communication is started, the EEPROM is read, and - with the 63 | calibration constants from the EEPROM - the operational mode can be 64 | configured. -------------------------------------------------------------------------------- /dji/ocusync2/README.md: -------------------------------------------------------------------------------- 1 | DJI OcuSync 2.0 RF investigations 2 | ================================= 3 | 4 | DJI OcuSync 2.0 is an OFDM-based "custom" communication scheme. DJI 5 | describes it as "SDR", probably because it's implemented in software 6 | running on a custom ASIC ("Sparrow" aka "S1", or "Pigeon"). 7 | 8 | It is not based on WiFi or other off-the-shelf communication systems, but it 9 | shares a few properties with LTE. Likely someone read the LTE PHY spec and 10 | used it as "good practices". Similarity stops quickly so there's no point in 11 | attempting to use anything LTE specific. 12 | 13 | Packets can be 20MHz, 10MHz, 3MHz, 1.4MHz ([FCC filing](https://fccid.io/SS3-MT2PD2007/Test-Report/Test-Report-SRD-4941236.pdf)), 14 | and there's a 1.4MHz-CA (likely "collision avoidance" aka. frequency 15 | hopping, which is used for the uplink). 16 | 17 | OFDM modulation is used for all packets; the occupied BW is slighly lower 18 | than the gross BW, for example 20MHz uses 1201 subcarriers with 15kHz each, 19 | so ~18MHz OBW. 20 | 21 | Symbol duration is 15kHz, plus cyclic prefix (CP). By oversampling, one gets 22 | to a power-of-two length per sample, so for example 20MHz can be oversampled 23 | to 30.72MHz (=2048 * 15000kHz). Due to the CP, the net symbol rate is 24 | slighly lower than 15kHz. With an FFT size of 2048, only the middle 1201 25 | subcarriers are used (for 20 MHz). 26 | 27 | CP length is 144 (for 20MHz), 72 (for 10MHz) etc.; some symbols, notably the 28 | first, last and a middle one for regular DL packets (the symbol structure 29 | depends on the data type), have an longer CP (144+16 for 20 MHz, 72+8 for 10 30 | MHz). 31 | 32 | Packets can be downlink (drone-to-RC), uplink (RC-to-drone), and broadcast 33 | (remote drone id aka. flight info). They all use OFDM, but with different 34 | bandwidths, and the uplink is using frequency-hopping. 35 | 36 | Each symbol is either a reference or a data symbol. For regular downlink 37 | packets, the structure is: 38 | 39 | ``` 40 | RS0 | D | D | D | D | D | D | RS1 | D | D | D | D | D | D | RS0 41 | ``` 42 | 43 | (So 15 symbols total, Packet length is ~1ms) 44 | 45 | Reference symbols are LTE-like [Zadoff-Chu sequences](https://en.wikipedia.org/wiki/Zadoff%E2%80%93Chu_sequence), 46 | with the DC carrier not removed but set to a constant. ZC sequences are 47 | generated in frequency domain, with a sequence length of 1201 (20MHz) or 601 48 | (10MHz), and various sequences. 49 | 50 | Data symbols are either QPSK or higher-order QAM. The first signal is always 51 | QPSK. The DC subcarrier (for example 600 for 20 MHz) is fixed and not used 52 | for data. There are no obvious pilots (or I haven't found them). 53 | 54 | DC subcarrier has an out-of-QPSK (i.e. non-multiple-of-90°) phase relationship to the rest of the bits. Experimentally it seems to be set at 20°+`x`*90° (when data bits are at 45°, 135°, 225°, 315°), but it is not clear what `x` is. 55 | 56 | [symbols.txt](Symbols) contains decoded bits for 100 Downlink frames, though only QPSK symbols. "." denote unavailable bits (for example from reference symbols), "?" denote unsure bits, likely because the symbol was not QPSK-modulated. "I" and "Q" refer to the real and imaginary part of the subcarrier, carrier 600 (these are 20MHz packets, so 1201 subcarriers per symbol) is set as a reference. As described above the absolute position of the reference carrier is not clear so the bits may be rotated. -------------------------------------------------------------------------------- /dji/ocusync2/play.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | 3 | import numpy as np 4 | import matplotlib.pyplot as plt 5 | import matplotlib 6 | import sys 7 | import scipy.signal as signal 8 | from test import zcsequence 9 | 10 | # some tools 11 | 12 | def corr(x, y=None): 13 | if y is None: 14 | y = x 15 | result = np.correlate(x, y, mode='full') 16 | return result[result.size//2:] 17 | 18 | def fshift(y, offset, Fs): 19 | x = np.linspace(0.0, len(y)/Fs, len(y)) 20 | return y * np.exp(x * 2j * np.pi * offset) 21 | 22 | class SpectrumCapture: 23 | def __init__(self, fn, dtype = ">f"): 24 | self.y = np.fromfile(fn, dtype=dtype).astype(np.float32).view(np.complex64) 25 | self.Fs = 200e6 26 | self.pkt_starts = [] 27 | 28 | def coarse_collect_packets(self, level, max = None, debug = False, start = 0, pkt_time = 1.2e-3): 29 | """Simple squelch-based attempt to find start of packets""" 30 | pos = int(start * self.Fs) 31 | yabs = np.abs(self.y) 32 | if debug: 33 | plt.plot(yabs[::100]) 34 | plt.hlines([level], xmin=0, xmax=len(yabs)//100) 35 | plt.show() 36 | above_level = yabs >= level 37 | while pos < len(yabs): 38 | if max is not None and len(self.pkt_starts) >= max: 39 | break 40 | start = np.argmax(above_level[pos:]) + pos 41 | print("pkt end at", pos, "next start at", start) 42 | if not yabs[start] >= level: 43 | break 44 | 45 | self.pkt_starts.append(start) 46 | 47 | pos = start + int(pkt_time * self.Fs) 48 | 49 | def obtain_packet_raw(self, pktnum, before, after, Fcarrier, Fsnew = 30.72e6): 50 | pkt_fullrate = self.y[self.pkt_starts[pktnum] - int(before*self.Fs):self.pkt_starts[pktnum] + int(after*self.Fs)] 51 | # shift by ~carrier 52 | x = np.linspace(0.0, len(pkt_fullrate)/self.Fs, len(pkt_fullrate)) 53 | pkt_fullrate = pkt_fullrate * np.exp(x * 2j * np.pi * -Fcarrier) 54 | 55 | # decimate 56 | y = np.interp(np.arange(0, len(pkt_fullrate), self.Fs/Fsnew), np.arange(0, len(pkt_fullrate)), pkt_fullrate) 57 | #y = signal.resample_poly(pkt_fullrate, 96, 625) 58 | return y 59 | 60 | def pkt(self, pktnum, Fcarrier, BW = 20, length = 1.1e-3): 61 | if BW == 20: 62 | Fs = 30.72e6 63 | elif BW == 10: 64 | Fs = 15.36e6 65 | else: 66 | assert False, "unsupported BW" 67 | 68 | return Packet(self.obtain_packet_raw(pktnum, .1e-3, length, Fcarrier, Fs), Fs, BW, pktnum = pktnum) 69 | 70 | def plot_spectrum(self): 71 | plt.specgram(self.y, Fs = self.Fs) 72 | plt.vlines([np.array(self.pkt_starts) / self.Fs], ymin=-self.Fs/2, ymax=self.Fs/2) 73 | plt.show() 74 | 75 | class Packet: 76 | def __init__(self, y, Fs, BW, pktnum): 77 | self.Fs = Fs 78 | self.y = y 79 | self.start = 0 80 | self.pktnum = pktnum 81 | # agc 82 | y /= np.max(np.abs(y)) 83 | if BW == 20: 84 | self.Ncarriers = 1201 85 | self.Nfft = 2048 86 | self.cp_length = [ 87 | 144 + 16, # 0 88 | 144, # 1 89 | 144, # 2 90 | 144, # 3 91 | 144, # 4 92 | 144, # 5 93 | 144, # 6 94 | 144, # 7 95 | 144 + 16, # 8 96 | 144, # 9 97 | 144, # 10 98 | 144, # 11 99 | 144, # 12 100 | 144, # 13 101 | 144 + 16, # 14 102 | ] 103 | self.zc_sym = [0, 7, 14] 104 | elif BW == 10: 105 | self.Ncarriers = 601 106 | self.Nfft = 1024 107 | #array([-81, -69, -72, -81, -63, -73, -76, -68]) 108 | self.cp_length = [ 109 | 72 + 8, # 0 110 | 72, # 1 111 | 72, # 2 112 | 72, # 3 113 | 72, # 4 114 | 72, # 5 115 | 72, # 6 116 | 72, # 7 117 | 72, # 8 118 | ] 119 | self.zc_sym = [3, 5] 120 | 121 | 122 | #self.plot_spectrum(real = True) 123 | 124 | self.find_fine_start(False) 125 | 126 | def find_fine_start(self, debug = False): 127 | 128 | print(np.mean(np.abs(self.y[4000:4100]))) 129 | if np.mean(np.abs(self.y[4000:4100])) < .05: 130 | print("skipping prefix!") 131 | self.y = self.y[4100:] 132 | 133 | res = [] 134 | cpl = self.cp_length[0] 135 | for n in range(self.Nfft, len(self.y) - cpl): 136 | ac = np.sum(self.y[n:n+cpl] * np.conj(self.y[n-self.Nfft:n-self.Nfft+cpl])) 137 | res.append(ac) 138 | 139 | if debug: 140 | # get a rough idea of the first peak 141 | x = np.linspace(0, len(self.y) / (self.Nfft + cpl) , len(res)) 142 | plt.plot(x, np.array(res)*300) # corr(self.y, self.y)) 143 | plt.specgram(self.y, Fs=self.Nfft + cpl, NFFT=self.Nfft//64, window = matplotlib.mlab.window_none, noverlap=0) 144 | # plt.plot(res) 145 | plt.show() 146 | 147 | first_symbol_start = np.nonzero(np.abs(res) > 5.0)[0][0] 148 | print("fss", first_symbol_start) 149 | 150 | if debug: 151 | # show the correlation as absolute values 152 | plt.plot(np.abs(res)) 153 | plt.show() 154 | 155 | # fine-tune 156 | search_range = 400 157 | if first_symbol_start < search_range: 158 | first_symbol_start = search_range 159 | 160 | if debug: 161 | # show that the search range contains the peak 162 | plt.plot(res[first_symbol_start-search_range:first_symbol_start+search_range]) 163 | plt.show() 164 | 165 | first_symbol_start = np.argmax(res[first_symbol_start-search_range:first_symbol_start+search_range])+first_symbol_start-search_range 166 | print("fine-tuned first symbol start", first_symbol_start) 167 | 168 | self.start = first_symbol_start 169 | self.detected_ffo = self.Fs / (2 * np.pi * self.Nfft) * np.angle(res[first_symbol_start]) 170 | 171 | def sym_offset(self, s): 172 | sym_start = self.start + s * self.Nfft + int(np.sum(self.cp_length[:s])) 173 | sym_end = self.start + (s + 1) * self.Nfft + int(np.sum(self.cp_length[:s+1])) 174 | return sym_start, sym_end 175 | 176 | def sym(self, s, skip_cp = False, shift = 0): 177 | sym_start, sym_end = self.sym_offset(s) 178 | sym_start += shift 179 | sym_end += shift 180 | if skip_cp: 181 | sym_start += self.cp_length[s] 182 | return self.y[sym_start:sym_end].copy() 183 | 184 | def find_zc_seq(self, s, debug = False): 185 | res = [] 186 | for r in range(1, self.Ncarriers-1): 187 | a = zcsequence(r, self.Ncarriers) 188 | sy = self.sym(s, True) 189 | fft_tr = self.tfft(sy) 190 | res.append(np.max(np.abs(corr(fft_tr, a)))) 191 | 192 | best = np.argmax(res) + 1 193 | if debug: 194 | print("best zc seq", best) 195 | 196 | # plot the correlation; there should be ONE SINGLE hit, 197 | # otherwise things are terribly wrong. 198 | plt.plot(res) 199 | plt.show() 200 | 201 | return best 202 | 203 | def find_zc_offset(self, s, seq, cyc): 204 | oy = self.y.copy() 205 | a = zcsequence(seq, self.Ncarriers, cyc) 206 | 207 | resx = [] 208 | resy = [] 209 | 210 | for i in np.linspace(-5, 5, 1000): 211 | self.y = oy.copy() 212 | self.apply_sample_offset(i) 213 | sy = self.sym(s, True) 214 | 215 | #print("carrier 600 is", np.angle(sa[600]) / (2 * np.pi) * 360) 216 | #print("carrier 600 is", np.abs(sa[600]) / np.mean(np.abs(sa))) 217 | 218 | sa = self.tfft(sy) 219 | if (sa == 0).any(): 220 | sa += 1 221 | adiff = np.angle(a / sa) 222 | adiff[self.Ncarriers//2] = adiff[self.Ncarriers//2+1] 223 | adiff = np.unwrap(adiff) 224 | 225 | #plt.plot(adiff) 226 | #plt.show() 227 | 228 | slope = np.max(adiff) - np.min(adiff) 229 | slope = (adiff - np.mean(adiff)) 230 | slope = np.sqrt(np.mean(slope**2)) 231 | resx.append(i) 232 | resy.append(slope) 233 | 234 | self.y = oy 235 | print("minrms", np.min(resy), "at", resx[np.argmin(resy)]) 236 | 237 | plt.plot(resx, resy) 238 | plt.show() 239 | return resx[np.argmin(resy)] 240 | 241 | def find_zc_shift(self, s, seq, cyc = 0, debug = False): 242 | a = zcsequence(seq, self.Ncarriers, cyc) 243 | sy = self.sym(s, True) 244 | am = np.argmax(np.abs(corr(self.tfft(sy), a))) 245 | 246 | real_cyc = (cyc - am) % (self.Ncarriers) 247 | 248 | if debug: 249 | #plt.plot(np.abs(corr(self.tfft(sy), a))) 250 | #plt.show() 251 | 252 | for cyc_offset in [0]: 253 | sample_offset = self.find_zc_offset(s, seq, (real_cyc + cyc_offset * 51) % self.Ncarriers) 254 | 255 | print("final sample offset", sample_offset) 256 | self.apply_sample_offset(sample_offset) 257 | 258 | sy = self.sym(s, True) 259 | sa = self.tfft(sy) 260 | adiff = np.angle(a / sa) 261 | adiff[self.Ncarriers//2] = adiff[self.Ncarriers//2+1] 262 | adiff = np.unwrap(adiff) 263 | print("phase shift remaining between", np.max(adiff), np.min(adiff)) 264 | 265 | slope = np.max(adiff) - np.min(adiff) 266 | slope = (adiff - np.mean(adiff)) 267 | slope = np.sqrt(np.mean(slope**2)) 268 | print("slope", slope) 269 | 270 | print("phase 0", np.angle(sa[self.Ncarriers//2])) 271 | plt.plot(adiff) 272 | plt.show() 273 | 274 | return (real_cyc + cyc_offset * 51) % self.Ncarriers 275 | 276 | return real_cyc 277 | 278 | def find_zc(self, s = 0, zc_seq = None, zc_cyc = None, debug = False): 279 | if zc_seq is None: 280 | zc_seq = self.find_zc_seq(s, debug = debug) 281 | if zc_cyc is None: 282 | zc_cyc = self.find_zc_shift(s, zc_seq, debug = debug) 283 | if debug: 284 | print(f"detected zq_cyc {zc_cyc}") 285 | self.zc_seq = zc_seq 286 | self.zc_cyc = zc_cyc 287 | 288 | def plot(self): 289 | plt.plot(self.y) 290 | for s in range(len(self.cp_length)): 291 | s, _ = self.sym_offset(s) 292 | plt.vlines([s], ymin=-1, ymax=1) 293 | 294 | plt.show() 295 | 296 | def plot_spectrum(self, real = False, sym = None): 297 | if not sym: 298 | if not real: 299 | plt.specgram(self.y, Fs=self.Nfft + self.cp_length[1], NFFT=self.Nfft//64, window = matplotlib.mlab.window_none, noverlap=0) 300 | else: 301 | plt.specgram(self.y, Fs=self.Fs) 302 | else: 303 | plt.specgram(self.sym(sym), Fs=self.Nfft + self.cp_length[sym], NFFT=self.Nfft//64, window = matplotlib.mlab.window_none, noverlap=0) 304 | 305 | plt.show() 306 | 307 | def show_symbol(self, ax, s, sy, chan_est = None): 308 | fft = self.tfft(sy[self.cp_length[s]:self.cp_length[s]+self.Nfft]) 309 | print(fft.shape) 310 | if chan_est is not None: 311 | fft *= chan_est 312 | x = [np.real(fft), np.imag(fft)] 313 | 314 | for i in range(6): 315 | ax.scatter(x[0][i*100:(i+1)*100], x[1][i*100:(i+1)*100], s=1) 316 | 317 | def show_all_symbol(self): 318 | fig,ax = plt.subplots(4,4) 319 | for s in range(len(self.cp_length)): 320 | self.show_symbol(ax[s//4][s%4], s, self.sym(s), chan_est) 321 | plt.show() 322 | 323 | def plot_all_symbol_spectrum(self): 324 | """Simple overlay plot, to check for correct occupied bandwidth / IFO""" 325 | for s in range(len(self.cp_length)): 326 | if s == 14: 327 | continue 328 | fft = np.fft.fft(self.sym(s, True)) 329 | plt.plot(np.abs(fft)) 330 | plt.show() 331 | 332 | def show_cp(self): 333 | """Shows the CP overlap for each symbol (slightly shfited upwards for better visibility)""" 334 | for s in range(len(self.cp_length)): 335 | sy = np.abs(self.sym(s)) 336 | cp = self.cp_length[s] 337 | plt.plot(np.arange(0, len(sy)), sy + s) 338 | plt.plot(np.arange(len(sy) - cp, len(sy) - cp + len(sy)), sy + s + .01) 339 | plt.show() 340 | exit() 341 | 342 | def interactive(self): 343 | # interactive version 344 | 345 | fig,ax = plt.subplots(4,4) 346 | from matplotlib.widgets import Slider, Button 347 | pc = 0 348 | linrot = Slider(plt.axes([0.25, .1, 0.50, 0.02]), 'lin rot', pc - .01, pc + .01, valinit=pc) 349 | off = Slider(plt.axes([0.25, .08, 0.50, 0.02]), 'offset', -10, 10, valinit=0) 350 | tune = Slider(plt.axes([0.25, .06, 0.50, 0.02]), 'tune', -15000,15000, valinit=0) 351 | sr = Slider(plt.axes([0.25, .04, 0.50, 0.02]), 'sr', -.001,.001, valinit=0) 352 | seqcor = Slider(plt.axes([0.25, .02, 0.30, 0.02]), 'seq', -10,10, valinit=0) 353 | 354 | write = Button(plt.axes([0.60, .02, 0.20, 0.02]), 'write') 355 | 356 | def save(_): 357 | print("saving data...") 358 | for i, j in enumerate(self.symbol_data): 359 | if j is not None: 360 | with open("pkt_%d_sym_%d.txt" % (self.pktnum, i), "w") as fo: 361 | for i in j: 362 | fo.write("%f %f\n" % (np.real(i), np.imag(i))) 363 | 364 | write.on_clicked(save) 365 | 366 | def update(_): 367 | for a in ax: 368 | for a in a: 369 | a.clear() 370 | self.symbol_data = [] 371 | for s in range(len(self.cp_length)): 372 | sy = self.sym(s) 373 | sy = fshift(sy, tune.val, self.Fs) 374 | sy = np.interp(np.arange(off.val, off.val+len(sy), 1+sr.val), np.arange(0, len(sy)), sy) 375 | fft = self.tfft(sy[self.cp_length[s]:self.cp_length[s]+self.Nfft]) 376 | x = np.linspace(-.5 * linrot.val * len(fft), .5 * linrot.val * len(fft), len(fft)) 377 | 378 | print(f"linrot {linrot.val} offset {off.val} tune {tune.val} sr {sr.val} seqcor {seqcor.val}") 379 | 380 | 381 | a = ax[s//4][s%4] 382 | 383 | if s in self.zc_sym: 384 | 385 | if False: 386 | seq = zcsequence(self.zc_seq, self.Ncarriers, self.zc_cyc + int(seqcor.val) * 51) 387 | est = seq / fft 388 | est[self.Ncarriers//2] = (est[self.Ncarriers//2-1] + est[self.Ncarriers//2+1]) * .5 # fake 389 | self.magest = np.abs(est) 390 | a.plot(np.angle(est)) 391 | else: 392 | a.plot(np.abs(fft)) 393 | self.symbol_data.append(None) 394 | else: 395 | fft *= np.exp(x * 2j * np.pi) 396 | # fft *= self.magest 397 | # fft /= fft[self.Ncarriers//2+1] 398 | # print(fft[self.Ncarriers//2]) 399 | x = [np.real(fft), np.imag(fft)] 400 | self.symbol_data.append(fft) 401 | for i in range(self.Ncarriers//100): 402 | a.scatter(x[0][i*100:100*(i+1)], x[1][i*100:100*(i+1)], s=10/(i+10)) 403 | pilots = [self.Ncarriers//2] 404 | a.scatter(x[0][pilots], x[1][pilots], s=5, marker='X') 405 | #i = np.arange(500, 700) 406 | #a.scatter(x[0][i], x[1][i], s=1) 407 | fig.canvas.draw_idle() 408 | #a.plot(np.abs(fft)) 409 | linrot.on_changed(update) 410 | off.on_changed(update) 411 | tune.on_changed(update) 412 | sr.on_changed(update) 413 | seqcor.on_changed(update) 414 | update(0) 415 | 416 | plt.show() 417 | 418 | def time_domain_zc_corr(self, s, zc_seq, zc_cyc): 419 | # create time domain ZC 420 | # self.y *= np.exp(-1j * 2.1467642031119) 421 | 422 | print("Sym%d, using ZC %d:%d for time domain" % (s, zc_seq, zc_cyc)) 423 | seq = zcsequence(zc_seq, self.Ncarriers, zc_cyc) 424 | 425 | # set c0, likely wrong 426 | seq[self.Ncarriers//2] = .9*2.4256186683261327j 427 | td = self.itfft(seq) 428 | # prefix with CP 429 | td = np.concatenate((td[-self.cp_length[s]:], td)) 430 | 431 | # plt.plot(np.abs(td) / np.max(np.abs(td))) 432 | # plt.plot(np.abs(self.sym(s)) / np.max(np.abs(self.sym(s)))) 433 | sa = self.sym(s) 434 | sa /= np.mean(np.abs(sa)) 435 | td /= np.mean(np.abs(td)) 436 | 437 | 438 | c = corr(sa, td) 439 | ref_phase = np.angle(c[0]) 440 | print("Sy%d ref" % s, ref_phase) 441 | 442 | sa *= np.exp(-1j * ref_phase) 443 | 444 | print("sa", len(sa)) 445 | print("td", len(td)) 446 | 447 | plt.plot(np.real(sa)) 448 | plt.plot(np.real(td)) 449 | plt.show() 450 | 451 | c = corr(sa, td) 452 | print("ref angle after correction", np.angle(c[0])) 453 | 454 | plt.plot(np.abs(c)) 455 | 456 | # plt.plot(np.unwrap(np.angle(self.tfft(td)))) 457 | # plt.plot(np.unwrap(np.angle(self.tfft(sy_shifted)))) 458 | # plt.plot(np.angle(self.tfft(td))) 459 | # plt.plot(np.angle(self.tfft(sy_shifted))) 460 | 461 | # plt.plot(np.arange(0, len(sy), 1), np.abs(sy)) 462 | # plt.plot(np.arange(i_shift, i_shift + len(td), 1), np.abs(td)) 463 | plt.show() 464 | 465 | sym = self.y 466 | 467 | co = np.correlate(sym, td, mode='valid') 468 | 469 | ## prioritize things closer 470 | ##co += np.abs(np.arange(0, len(co)) - self.sym_offset(sym)[0]) 471 | 472 | off = np.argmax(np.abs(co)) 473 | print("offset Sy%d = %d" % (s, off)) 474 | 475 | plt.plot(np.abs(co) / 100.0) 476 | plt.plot(np.arange(off, off + len(td)), np.real(td)) 477 | plt.plot(np.real(sym)) 478 | plt.show() 479 | 480 | def time_domain_zc_corr_x(self, s, zc_seq, zc_cyc): 481 | # create time domain ZC 482 | print("using ZC %d:%d for time domain" % (zc_seq, zc_cyc)) 483 | seq = zcsequence(zc_seq, self.Ncarriers, zc_cyc) 484 | seq[self.Ncarriers//2] = .9*2.4256186683261327j 485 | td = self.itfft(seq) 486 | td = np.concatenate((td[-self.cp_length[s]:], td)) 487 | 488 | sa = self.sym(s) 489 | 490 | # adjust amplitude 491 | sa /= np.mean(np.abs(sa)) 492 | td /= np.mean(np.abs(td)) 493 | 494 | co = np.correlate(self.y, td, mode='valid') 495 | 496 | # find definitive first start 497 | self.start = np.argmax(np.abs(co)) 498 | print("integer shift", self.start) 499 | ref_phase = np.angle(co[self.start]) 500 | print("fixing up ref phase", ref_phase) 501 | self.y *= np.exp(-1j * ref_phase) 502 | 503 | self.magest = np.abs(self.tfft(td) / self.tfft(sa)) 504 | 505 | def tfft(self, sy): 506 | fft = np.fft.fft(sy) 507 | half_carriers = self.Ncarriers//2 508 | return np.concatenate((fft[-half_carriers:], fft[:half_carriers+1])) 509 | 510 | def itfft(self, c): 511 | half_carriers = self.Ncarriers//2 512 | c_full = np.zeros((self.Nfft), dtype=np.complex64) 513 | c_full[-half_carriers:] = c[:half_carriers] 514 | c_full[:half_carriers+1] = c[half_carriers:] 515 | 516 | return np.fft.ifft(c_full) 517 | 518 | def with_sample_offset(self, offset): 519 | return np.interp(np.arange(offset, offset+len(self.y), 1), np.arange(0, len(self.y)), self.y) 520 | 521 | def apply_sample_offset(self, offset): 522 | self.y = self.with_sample_offset(offset) 523 | 524 | def linrot_time_domain_corr(self, s, linrot = -0.003033557046979867): 525 | 526 | # grab symbol, calc FFT, de-rotate with manual constant 527 | sy = self.sym(s, True) 528 | fft = self.tfft(sy) 529 | fft *= np.exp(2j * np.pi * np.linspace(-.5 * linrot * len(fft), .5 * linrot * len(fft), len(fft))) 530 | 531 | # extract mean magnitude so we can create a wavewform with equal amplitude 532 | magn = np.mean(np.abs(np.concatenate([fft[:self.Ncarriers//2], fft[self.Ncarriers//2+1:]]))) 533 | print("mean magn", magn) 534 | 535 | # extract DC carrier properties 536 | c0 = fft[self.Ncarriers // 2] 537 | print("c0", np.abs(c0) / magn, np.angle(c0) * 360 / (2 * np.pi)) 538 | 539 | # show original 540 | plt.scatter(np.real(fft), np.imag(fft)) 541 | 542 | # quantisize phase by fitting it into QPSK 543 | for i in range(self.Ncarriers): 544 | # (but leave DC alone) 545 | if i == self.Ncarriers // 2: 546 | continue 547 | phase = np.angle(fft[i]) 548 | # assume QPSK 549 | phase *= 4 / (2 * np.pi) 550 | # quantisize phase 551 | new_phase = ((int(phase) + .5) / 4) * 2 * np.pi 552 | fft[i] = np.exp(new_phase * 1j) * magn 553 | 554 | # show optimized 555 | plt.scatter(np.real(fft), np.imag(fft)) 556 | plt.show() 557 | 558 | # create time domain 559 | td = self.itfft(fft) 560 | # prefix with CP 561 | td = np.concatenate((td[-self.cp_length[s]:], td)) 562 | 563 | # plt.plot(sy) 564 | # plt.plot(td) 565 | cor = np.correlate(self.y, td) 566 | offset = np.argmax(cor) 567 | print("symbol start at", offset) 568 | print("we think it starts at", self.sym_offset(s)[0], "so delta", self.sym_offset(s)[0] - offset) 569 | plt.plot(cor) 570 | plt.plot(self.y) 571 | plt.plot(np.linspace(offset, offset + len(td), len(td)), td) 572 | plt.show() 573 | 574 | def linrot_optimize(self, s): 575 | 576 | sy = self.sym(s, True) 577 | fft = self.tfft(sy) 578 | 579 | c0_angle = np.exp(1j * 20 / 360 * 2 * np.pi) 580 | fft /= fft[self.Ncarriers//2] / c0_angle 581 | 582 | res = [] 583 | 584 | attempts = np.linspace(-0.005, 0.005, 1000) 585 | #attempts = [-0.003033557046979867] 586 | for linrot in attempts: 587 | # de-rotate 588 | fftn = fft * np.exp(2j * np.pi * np.linspace(-.5 * linrot * len(fft), .5 * linrot * len(fft), len(fft))) 589 | 590 | # find QPSK noisyness 591 | noise = np.sum(((np.angle(fftn) / (2 * np.pi) * 4) % 1 - .5) ** 2) 592 | res.append(noise) 593 | 594 | #plt.scatter(np.real(fftn), np.imag(fftn)) 595 | #plt.show() 596 | 597 | plt.plot(attempts, res) 598 | # plt.show() 599 | 600 | linrot = attempts[np.argmin(res)] 601 | fftn = fft * np.exp(2j * np.pi * np.linspace(-.5 * linrot * len(fft), .5 * linrot * len(fft), len(fft))) 602 | # plt.scatter(np.real(fftn), np.imag(fftn)) 603 | # plt.show() 604 | 605 | print("c0", fftn[self.Ncarriers//2]) 606 | print("c0pol", np.abs(fftn[self.Ncarriers//2]), np.angle(fftn[self.Ncarriers//2]) / (2 * np.pi) * 360) 607 | 608 | return linrot 609 | 610 | def self_corr(self): 611 | length_to_last = len(self.cp_length[:-1]) * 2048 + sum(self.cp_length[:-1]) 612 | print("length_to_last", length_to_last) 613 | 614 | cor = np.correlate(self.y, self.sym(0), mode='full') 615 | plt.plot(np.abs(cor)) 616 | # offset = 30720 617 | # plt.plot(self.y) 618 | # plt.plot(np.linspace(offset, offset + len(self.y), len(self.y)), self.y) 619 | plt.show() 620 | 621 | def save(self, linrot): 622 | print("saving data...") 623 | 624 | for s in range(len(self.cp_length)): 625 | if s in self.zc_sym: 626 | continue 627 | sy = self.sym(s, True) 628 | fft = self.tfft(sy) # / self.magest 629 | fft *= np.exp(2j * np.pi * np.linspace(-.5 * linrot * len(fft), .5 * linrot * len(fft), len(fft))) 630 | c0_angle = np.exp(1j * 20 / 360 * 2 * np.pi) 631 | fft /= fft[self.Ncarriers//2] / c0_angle 632 | 633 | with open("out/pkt_%d_sym_%d.txt" % (self.pktnum, s), "w") as fo: 634 | for i in fft: 635 | fo.write("%f %f\n" % (np.real(i), np.imag(i))) 636 | 637 | if True: 638 | # regular downlink 20MHz 639 | capture = SpectrumCapture("with_rc_2_2450000.0kHz_200.0MHz.iq") # Fcarrier=22.5MHz 640 | BW = 20 641 | Fcarrier = 22.46e6 642 | Fcarrier -= 5600 - 20 # hand-tuned 643 | Fcarrier += 45000 644 | 645 | # .12 is fined tuned to find downlink but skip uplink 646 | # this capture starts in the middle of a packet so ignore first 400k samples 647 | npkts = 100 648 | capture.coarse_collect_packets(.12, npkts, start = 400e3 / capture.Fs) 649 | 650 | pkts = range(npkts) 651 | 652 | # pkt0: 653 | # 471:742 654 | # 471:0 655 | # ??? 656 | 657 | # pkt 1: 658 | # 471:538 659 | # 1:1197 660 | # 471:538 661 | pktlength = 1.2e-3 662 | else: 663 | # DroneID stuff 664 | capture = SpectrumCapture("pkt_new_1", dtype="> 8) ^ table[(crc ^ ch) & 0xFF] 45 | return ((crc >> 8)&0xFF) | ((crc&0xFF) << 8) 46 | 47 | 48 | def calc(s): 49 | s = s.encode('ascii') 50 | l = len(s) 51 | rightside = l//2 52 | leftside = l - rightside 53 | return crc16(s[:leftside], 0xFFFF) | (crc16(s[leftside:], 0xFFFF) << 16) 54 | 55 | cids = {} 56 | 57 | for l in open('cids'): 58 | v, n = l.strip().split() 59 | cids[int(v, 0x10)] = n 60 | 61 | seq, last_spd, chill_seq = 0,0,0 62 | 63 | def decode_chill(pkt): 64 | global cids, seq, last_spd, chill_seq 65 | 66 | if pkt.startswith(b"\x00\xFF\xFF\xFF"): 67 | print("# (edid)") 68 | print(pkt.hex()) 69 | return 70 | 71 | assert len(pkt) == 256 72 | seq, proto_ver, last_spd, request, zero, chill_seq, crcl, crch = pkt[:8] 73 | 74 | if proto_ver == 4: 75 | print("# legacy") 76 | print(pkt.hex()) 77 | return 78 | 79 | assert zero == 0 80 | crc = crcl | (crch << 8) 81 | if crc16(pkt[:6], 0xFFFF) != crc: 82 | print("CRC fail") 83 | return 84 | 85 | chill = pkt[8:-2] 86 | crc = (pkt[-2] << 8) | pkt[-1] 87 | if crc16(chill, 0xFFFF) != crc: 88 | print("CHILL crc fail") 89 | return 90 | 91 | cid = struct.unpack(">I", chill[1:5])[0] 92 | print(f"# SEQ {seq:02x}, proto_ver={proto_ver:02x} last_spd={last_spd:02x} request {request:02x}, chill_seq={chill_seq:02x}", end = ' ') 93 | print(f"CID = {cid:08x} {cids.get(cid, 'xxx')}") 94 | 95 | print(pkt.hex()) 96 | 97 | # SEQ 12, proto_ver=03 last_spd=0a request 07, chill_seq=07CID = b8a8e371 SERIAL_NUM 98 | # 12030a070007b2b4 99 | # 5d 100 | # b8a8e371 101 | # 01000008 102 | # 00000008 103 | # b8a8e371 104 | # 010000080000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027a 105 | 106 | # chill_pkt[8] = 0x5d; 107 | # chill_pkt[9] = 0x62; 108 | # chill_pkt[10] = 0x1c; 109 | # chill_pkt[11] = 0x34; 110 | # chill_pkt[12] = 0xa8; 111 | # chill_pkt[13] = 0x01; 112 | # chill_pkt[14] = 0x00; 113 | # chill_pkt[15] = 0x00; 114 | # chill_pkt[16] = 0x01; 115 | # chill_pkt[17] = 0x00; 116 | # chill_pkt[18] = 0x00; 117 | # chill_pkt[19] = tilt >> 8; 118 | # chill_pkt[20] = tilt; 119 | 120 | def gen_chill(*parms): 121 | global cids, seq, last_spd, chill_seq 122 | 123 | seq += 1 124 | chill_seq += 1 125 | proto_ver = 3 126 | request = 7 127 | seq &= 0xFF 128 | chill_seq &= 0xFF 129 | 130 | pkt = bytes([seq, proto_ver, last_spd, request, 0, chill_seq]) 131 | crc = crc16(pkt, 0xFFFF) 132 | pkt += bytes([crc & 0xFF, (crc >> 8) & 0xFF]) 133 | 134 | chill = bytes([0x5D]) 135 | for p in parms: 136 | chill += p.to_bytes(4, byteorder = 'big') 137 | 138 | chill += (256 - 8 - 2 - len(chill)) * b"\0" 139 | 140 | crc = crc16(chill, 0xFFFF) 141 | chill += bytes([(crc >> 8) & 0xFF, crc & 0xFF]) 142 | 143 | decode_chill(pkt + chill) 144 | return pkt + chill 145 | 146 | def chill_set(name, data, type = 0x01000001): 147 | p = gen_chill(calc(name), type, data) 148 | sendpkt(p) 149 | 150 | def chill_set_int(name, data): 151 | chill_set(name, data) 152 | 153 | def chill_set_float(name, data): 154 | chill_set(name, struct.unpack(">I", struct.pack(">f", data))[0], type = 0x01000003) 155 | 156 | 157 | def set_tilt(tilt): 158 | chill_set("TILT_STEP", tilt) 159 | 160 | def set_pan(pan): 161 | chill_set("PAN_STEP", pan) 162 | 163 | def set_zoom(zoom): 164 | chill_set("ZOOM_STEP", zoom) 165 | 166 | chill_set("VIDEO_FORMAT", 3) 167 | 168 | chill_set("PAN_RAMP_SLOPE", 20) 169 | chill_set("PAN_RAMP_UP_STEPS", 100) 170 | chill_set("PAN_RAMP_DOWN_STEPS", 100) 171 | chill_set("PAN_APPROACH_STEPS", 100) 172 | 173 | chill_set("TILT_RAMP_SLOPE", 20) 174 | chill_set("TILT_RAMP_UP_STEPS", 100) 175 | chill_set("TILT_RAMP_DOWN_STEPS", 100) 176 | chill_set("PAN_APPROACH_STEPS", 100) 177 | chill_set("VIDEO_FORMAT", 3) 178 | -------------------------------------------------------------------------------- /lifesize/chillboot: -------------------------------------------------------------------------------- 1 | # (edid) 2 | 00ffffffffffff003263524d01000000041101038028178c0aaa3da45548932510474a21080081c00101010101010101010101010101011d007251d01e206e28550034cd3100001e8c0ad08a20e02d10103e960090e110000018000000fc00526f6f6d203232300a20202020000000fd00313d0f2e08000a202020202020014402031b71478402031213012223097f018301000066030c00120080011d801871382d40582c550090e11000001e8c0ad090204031200c40550090e110000018011d00bc52d01e20b828554090e11000001e000000ff004650363533383034374530340a00000000000000000000000000000000000000000000000000000000f4 3 | # (edid) 4 | 00ffffffffffff003263524d01000000041101038028170000000000000000050000000000010000000000000000000000000500000000000000000000000000000d010068c100008c0ad08a20e02d10103e960090e110000018000000fc00526f6f6d203232300a20202020000000fd00313d0f2e08000a202020202020014402031b71478402031213012223097f018301000066030c00120080011d801871382d40582c550090e11000001e8c0ad090204031200c40550090e110000018011d00bc52d01e20b828554090e11000001e000000ff004650363533383034374530340a00000000000000000000000000000000000000000000000000000000f4 5 | # legacy 6 | 01040001000300000000000000000000000000000000000000000000000000050000000000010000000000000000000000000500000000000000000000000000000d010068c100008c0ad08a20e02d10103e960090e110000018000000fc00526f6f6d203232300a20202020000000fd00313d0f2e08000a202020202020014402031b71478402031213012223097f018301000066030c00120080011d801871382d40582c550090e11000001e8c0ad090204031200c40550090e110000018011d00bc52d01e20b828554090e11000001e000000ff004650363533383034374530340a00000000000000000000000000000000000000000000000000000000f4 7 | # legacy 8 | 02040102000300000000000000000000000000000000000000000000000000050000000000010000000000000000000000000500000000000000000000000000000d01005d8400008c0ad08a20e02d10103e960090e110000018000000fc00526f6f6d203232300a20202020000000fd00313d0f2e08000a202020202020014402031b71478402031213012223097f018301000066030c00120080011d801871382d40582c550090e11000001e8c0ad090204031200c40550090e110000018011d00bc52d01e20b828554090e11000001e000000ff004650363533383034374530340a00000000000000000000000000000000000000000000000000000000f4 9 | # legacy 10 | 03040213000300000000000000000000000000000000000000000000000000050000000000010000000000000000000000000500000000000000000000000000000d0100fd7500008c0ad08a20e02d10103e960090e110000018000000fc00526f6f6d203232300a20202020000000fd00313d0f2e08000a202020202020014402031b71478402031213012223097f018301000066030c00120080011d801871382d40582c550090e11000001e8c0ad090204031200c40550090e110000018011d00bc52d01e20b828554090e11000001e000000ff004650363533383034374530340a00000000000000000000000000000000000000000000000000000000f4 11 | # legacy 12 | 03040213000300000000000000000000000000000000000000000000000000050000000000010000000000000000000000000500000000000000000000000000000d0100f40300008c0ad08a20e02d10103e960090e110000018000000fc00526f6f6d203232300a20202020000000fd00313d0f2e08000a202020202020014402031b71478402031213012223097f018301000066030c00120080011d801871382d40582c550090e11000001e8c0ad090204031200c40550090e110000018011d00bc52d01e20b828554090e11000001e000000ff004650363533383034374530340a00000000000000000000000000000000000000000000000000000000f4 13 | # legacy 14 | 04040314000300000000000000000000000000000000000000000000000000050000000000010000000000000000000000000500000000000000000000000000000d0100f40300008c0ad08a20e02d10103e960090e110000018000000fc00526f6f6d203232300a20202020000000fd00313d0f2e08000a202020202020014402031b71478402031213012223097f018301000066030c00120080011d801871382d40582c550090e11000001e8c0ad090204031200c40550090e110000018011d00bc52d01e20b828554090e11000001e000000ff004650363533383034374530340a00000000000000000000000000000000000000000000000000000000f4 15 | # SEQ 06, proto_ver=03 last_spd=04 request 07, chill_seq=01CID = 84182374 ? 16 | 0603040700014c355d84182374000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005276 17 | # SEQ 08, proto_ver=03 last_spd=05 request 07, chill_seq=02CID = 511f84f6 ? 18 | 0803050700029f755d511f84f6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003211 19 | # SEQ 0a, proto_ver=03 last_spd=06 request 07, chill_seq=03CID = 32d5d5d4 MODEL 20 | 0a0306070003f9b55d32d5d5d40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014dd 21 | # SEQ 0c, proto_ver=03 last_spd=07 request 07, chill_seq=04CID = fc43ff4a ? 22 | 0c0307070004a1f55dfc43ff4a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c3c 23 | # SEQ 0e, proto_ver=03 last_spd=08 request 07, chill_seq=05CID = 36289312 ? 24 | 0e030807000597365d36289312000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a8b 25 | # SEQ 10, proto_ver=03 last_spd=09 request 07, chill_seq=06CID = b8a8e371 SERIAL_NUM 26 | 100309070006d4745db8a8e3710100000800000000b8a8e37101000008000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000984c 27 | # SEQ 12, proto_ver=03 last_spd=0a request 07, chill_seq=07CID = b8a8e371 SERIAL_NUM 28 | 12030a070007b2b45db8a8e3710100000800000008b8a8e371010000080000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027a 29 | # SEQ 14, proto_ver=03 last_spd=0b request 07, chill_seq=08CID = b8a8e371 SERIAL_NUM 30 | 14030b0700082cf55db8a8e3710100000800000010b8a8e37101000008000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ac21 31 | # SEQ 16, proto_ver=03 last_spd=0c request 07, chill_seq=09CID = 507d8a20 LENS_SERIAL_NUM 32 | 16030c0700097a345d507d8a200100000800000000507d8a2001000008000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e177 33 | # SEQ 18, proto_ver=03 last_spd=0d request 07, chill_seq=0aCID = 507d8a20 LENS_SERIAL_NUM 34 | 18030d07000aa9745d507d8a200100000800000008507d8a20010000080000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007b41 35 | # SEQ 1a, proto_ver=03 last_spd=0e request 07, chill_seq=0bCID = 507d8a20 LENS_SERIAL_NUM 36 | 1a030e07000bcfb45d507d8a200100000800000010507d8a2001000008000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d51a 37 | # SEQ 1c, proto_ver=03 last_spd=0f request 07, chill_seq=0cCID = c3d44cb9 IMAGE_VERSION 38 | 1c030f07000c97f45dc3d44cb901000001000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a92b 39 | # SEQ 1e, proto_ver=03 last_spd=10 request 07, chill_seq=0dCID = aaaa4d7a ? 40 | 1e031007000d61335daaaa4d7a01000001000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ce55 41 | # SEQ 20, proto_ver=03 last_spd=11 request 07, chill_seq=0eCID = c3d433df FPGA_Version 42 | 20031107000e42765dc3d433df000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ab4 43 | # SEQ 22, proto_ver=03 last_spd=12 request 07, chill_seq=0fCID = c3d42fbb Head_Version 44 | 22031207000f24b65dc3d42fbb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000690f 45 | # SEQ 24, proto_ver=03 last_spd=13 request 07, chill_seq=10CID = a57539ef ? 46 | 24031307001076f65da57539ef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002afc 47 | # SEQ 25, proto_ver=03 last_spd=14 request 0b, chill_seq=10CID = a57539ef ? 48 | 2503140b0010d0365da57539ef000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002afc 49 | # SEQ 26, proto_ver=03 last_spd=14 request 07, chill_seq=11CID = ea73a0ce Video_Format 50 | 26031407001120375dea73a0ce010000010000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008210 51 | # SEQ 28, proto_ver=03 last_spd=15 request 07, chill_seq=12CID = 36e6aacf Sensor_Anti_Flicker 52 | 280315070012f3775d36e6aacf010000010000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009181 53 | # SEQ 2a, proto_ver=03 last_spd=16 request 07, chill_seq=13CID = d2320837 ? 54 | 2a031607001395b75dd232083701000001000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c159 55 | # SEQ 2c, proto_ver=03 last_spd=17 request 07, chill_seq=14CID = be554b5c ? 56 | 2c0317070014cdf75dbe554b5c01000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dd1b 57 | # SEQ 2e, proto_ver=03 last_spd=18 request 07, chill_seq=15CID = 6756a9c7 Auto_Focus_Enabled 58 | 2e0318070015fb345d6756a9c7010000010000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007675 59 | # SEQ 30, proto_ver=03 last_spd=19 request 07, chill_seq=16CID = 58b9ffd7 ? 60 | 300319070016b8765d58b9ffd701000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000189e 61 | # SEQ 32, proto_ver=03 last_spd=1a request 07, chill_seq=17CID = c55eba57 VIDEO_AWB_ENABLED 62 | 32031a070017deb65dc55eba5701000001000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c662 63 | # SEQ 34, proto_ver=03 last_spd=1b request 07, chill_seq=18CID = cc82a0cc ? 64 | 34031b07001840f75dcc82a0cc01000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c62c 65 | # SEQ 36, proto_ver=03 last_spd=1c request 07, chill_seq=19CID = e1428c40 ? 66 | 36031c07001916365de1428c40010000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006b60 67 | # SEQ 38, proto_ver=03 last_spd=1d request 07, chill_seq=1aCID = eb6667e8 ? 68 | 38031d07001ac5765deb6667e8010000010000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006c70 69 | # SEQ 3a, proto_ver=03 last_spd=1e request 07, chill_seq=1bCID = 3375c5d6 ? 70 | 3a031e07001ba3b65d3375c5d60100000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074ba 71 | # SEQ 3c, proto_ver=03 last_spd=1f request 07, chill_seq=1cCID = e6458f89 xxx 72 | 3c031f07001cfbf65de6458f8901000003424800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000733b 73 | # SEQ 3e, proto_ver=03 last_spd=20 request 07, chill_seq=1dCID = 059e0554 xxx 74 | 3e032007001dcd3a5d059e0554010000034248000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005f47 75 | 76 | 4f03290b002561f23263524d0100000004110000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ce55 77 | 5003290700260c705daaaa4d7a01000001000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ce55 78 | 51032a0b00269ab15daaaa4d7a01000001000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ce55 79 | 52032a0700276ab05daf0c77ca01000001000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c360 80 | 53032b0b002744705daf0c77ca01000001000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c360 81 | 53032b0b002744705daf0c77ca01000001000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c69c 82 | 54032b070028f4f15da35e34a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c69c 83 | 56032c070029a2305da35ebcbf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003749 84 | 57032d0b00298cf05da35ebcbf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003749 85 | 58032d07002a71705da35e2e6600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b2f6 86 | 59032e0b002ae7b15da35e2e6600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b2f6 87 | 5a032e07002b17b05de3cfe58d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d0b7 88 | 5b032f0b002b39705de3cfe58d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d0b7 89 | 5c032f07002c4ff05dc941be8200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000297d 90 | 5d03300b002c49365dc941be8200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000297d 91 | 5e033007002db9375d874ce6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086ad 92 | 5f03310b002d97f75d874ce6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086ad 93 | 60033107002e9a725da35e34a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c69c 94 | 62033207002ffcb25da35ebcbf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003749 95 | 6303330b002fd2725da35ebcbf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003749 96 | 640333070030aef25da35e2e6600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b2f6 97 | 640333070030aef25da35e2e6600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d0b7 98 | 660334070031f8335de3cfe58d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d0b7 99 | 6703350b0031d6f35de3cfe58d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000297d 100 | 6803350700322b735dc941be8200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000297d 101 | 6903360b00324db35d874ce6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086ad 102 | 6a03360700334db35d874ce6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086ad 103 | 6b03370b003363735d874ce6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000086ad 104 | 105 | -------------------------------------------------------------------------------- /lifesize/cids: -------------------------------------------------------------------------------- 1 | 010c789d ? 2 | 02f1ce9e ? 3 | 0479bc88 ? 4 | 04c63368 ? 5 | 05036e53 ? 6 | 05900e48 ? 7 | 05be1f88 ? 8 | 07ea9261 FOCUS_APPROACH_STEPS 9 | 07eac3dd ? 10 | 07eac3ee ? 11 | 091215f2 ? 12 | 091300b9 ? 13 | 0913ae69 ? 14 | 0913ea69 ? 15 | 0913f72a ? 16 | 0a7f9e53 ? 17 | 0b0f0b52 ? 18 | 0ba95162 ? 19 | 0ce8222f ? 20 | 0ce88a44 ? 21 | 0ce88ab4 ? 22 | 0ed50f75 ? 23 | 0fb87369 ? 24 | 0fd51b59 ? 25 | 0fd5759e ? 26 | 11d923af ? 27 | 11d92880 ? 28 | 11d98840 ? 29 | 12104a2b ? 30 | 1221318a ? 31 | 12c2ae77 ? 32 | 132cf6a1 Sensor_Anti_Flicker_Correction_Enabled 33 | 137735a2 FOCUS_IDLE 34 | 13774cb5 Image_Idle 35 | 1377af8a ? 36 | 1377d78d Flash_Idle 37 | 1377ef8b ? 38 | 1388968b ? 39 | 13e8cde3 ? 40 | 13e8ebed ? 41 | 142de35f ? 42 | 15668793 ? 43 | 161c0837 ? 44 | 16b3789d ? 45 | 172da813 ? 46 | 18102138 ? 47 | 1810a1c6 ? 48 | 19126fba PAN_RAMP_SLOPE 49 | 1912e060 TILT_RAMP_SLOPE 50 | 19baa410 ? 51 | 19f454c3 SENSOR_GAIN_MIN 52 | 1ae49a35 ? 53 | 1b3e2349 ? 54 | 1c9ceb95 HEAD_EEPROM_LOCKED 55 | 1d48d72e ? 56 | 1e0e9b2c ? 57 | 1e6255b0 ? 58 | 1eceb6de ? 59 | 1ecedb2c ? 60 | 1f1b2f0b ? 61 | 2032d133 ? 62 | 2051d973 ? 63 | 2076d07b PAN_RAMP_UP_STEPS 64 | 208c0be6 ? 65 | 225d9686 ? 66 | 23933f75 ? 67 | 25115ee8 Auto_Focus_Idle 68 | 26ffe7e9 ? 69 | 29db318a ? 70 | 2a940806 ? 71 | 2a940835 ? 72 | 2a9431df ? 73 | 2a945989 ? 74 | 2a94764c ? 75 | 2a948b0f ? 76 | 2a94cc9c ? 77 | 2a94d296 ? 78 | 2c971ec1 ? 79 | 2ffbcb21 ? 80 | 3154b9a9 ? 81 | 32978f1b ? 82 | 32c7d58d ? 83 | 32d5d5d4 MODEL 84 | 32dfa2bc Reset 85 | 32e97093 ? 86 | 3375c5d6 ? 87 | 34c75b85 ? 88 | 34fe34a8 ? 89 | 3618ba57 ? 90 | 36289312 ? 91 | 36e6aacf Sensor_Anti_Flicker 92 | 37867369 ? 93 | 37be68ea ZOOM_MAX_STEPS 94 | 37be9233 ? 95 | 37be9277 ? 96 | 37beac1c FOCUS_MAX_STEPS 97 | 37bec410 TILT_MAX_STEPS 98 | 39f90e48 ? 99 | 3b0ff6f4 ? 100 | 3cbffe83 Test 101 | 3df42e66 ? 102 | 3df44a09 Video_Frame_Rate 103 | 3dfceec9 ? 104 | 3f37b9be ? 105 | 407f692c ZOOM_MIN_STEPS 106 | 407fc5d6 TILT_MIN_STEPS 107 | 4107318a ? 108 | 417f0bc3 ? 109 | 43099343 SENSOR_GAIN 110 | 43d15a18 ZOOM2_STEP_MODE 111 | 43d15a5c ZOOM1_STEP_MODE 112 | 43d16473 FOCUS_STEP_MODE 113 | 43d1a085 ZOOM_STEP_MODE 114 | 44a3731c ? 115 | 451e9343 ? 116 | 47dc430a ? 117 | 47ed39c6 ? 118 | 47ed6875 ? 119 | 486d71ca ? 120 | 494ffa0c ? 121 | 4aa31d8b ? 122 | 4ae772ae ? 123 | 4c11285f ? 124 | 4c11cdf4 ? 125 | 4c552a98 ? 126 | 4ca8811e ? 127 | 4ce8001f ? 128 | 4d1220c9 ? 129 | 4d460bb6 ? 130 | 4db007f7 ? 131 | 4ef55c6c ? 132 | 4f307824 ? 133 | 4fd47a9a ? 134 | 4fdca13c ? 135 | 4ff92585 TILT_APPROACH_STEPS 136 | 4ff9a704 ZOOM_APPROACH_STEPS 137 | 4ff9c02e PAN_APPROACH_STEPS 138 | 507d8a20 LENS_SERIAL_NUM 139 | 50c2dd1a ? 140 | 50d5bdeb ? 141 | 50f912e5 ? 142 | 511f84f6 ? 143 | 52b187d3 ? 144 | 5460f4cd image_erase 145 | 5485d307 ? 146 | 58b9ffd7 ? 147 | 5a0e4743 ? 148 | 5ab9a1da ? 149 | 5b9b3f8a ? 150 | 5c9035d0 TILT_RAMP_DOWN_STEPS 151 | 5def1a32 ? 152 | 5fc8ba57 ? 153 | 5fd937f2 ? 154 | 5fe2a47e ? 155 | 618a2999 ? 156 | 618a8e29 ? 157 | 618a95c8 ? 158 | 621c2e66 ZOOM_STEP 159 | 621c34a8 PAN_STEP 160 | 621cbcbf TILT_STEP 161 | 626671ca ? 162 | 63840837 ? 163 | 641e3c4d ? 164 | 644af6e9 ? 165 | 64bc2e66 ? 166 | 64bc34a8 ? 167 | 64bcbcbf ? 168 | 651f9c11 ? 169 | 65667aaf PAN_RAMP_DOWN_STEPS 170 | 658de4b8 ? 171 | 6756a9c7 Auto_Focus_Enabled 172 | 678d2a6a ? 173 | 678d44ad ? 174 | 678dea12 ? 175 | 68644cb5 Image_Copy 176 | 687026c8 Led_Brightness 177 | 68c73b6f ? 178 | 6a23eb86 ? 179 | 6e1b02ce ? 180 | 70c9c760 ? 181 | 70f13f71 ? 182 | 71240d2d ? 183 | 712dd0eb ? 184 | 71d265d3 ? 185 | 73275bdb ? 186 | 73607a9a HEAD_EEPROM_CRC_STORED 187 | 74c9f626 ? 188 | 7530f6e9 ? 189 | 7544d67d ? 190 | 75704355 ? 191 | 7570f4cd Image_Active 192 | 758a6756 ? 193 | 76b38ce3 ? 194 | 774ebc30 ? 195 | 7818f28f ? 196 | 7818f9a0 ? 197 | 7a66d8d5 Led_Flash 198 | 7ba17369 ? 199 | 7bb79a91 ? 200 | 7c749a35 ? 201 | 7c799b8d ? 202 | 7c9c3772 ? 203 | 7cb1c975 ? 204 | 7d093f8a ? 205 | 7da6a9c7 ? 206 | 7e22bffc GRAPHICS_DRAW_TEXT 207 | 7ebef4fd ? 208 | 7ee5789d ? 209 | 7f7af6b3 ? 210 | 80549f2a ? 211 | 80bf0bc3 ? 212 | 80d41abf ? 213 | 80d47d95 ? 214 | 80d4ff14 ? 215 | 80ed0f75 ? 216 | 81801294 ? 217 | 8180a8b0 ? 218 | 8211373f ? 219 | 8277a958 test_pattern 220 | 83a14a10 ? 221 | 84182374 ? 222 | 85ea222f FOCUS_LIMIT 223 | 85ea2e66 ZOOM_LIMIT 224 | 85ea8a44 ? 225 | 85ea8ab4 ? 226 | 85eabcbf TILT_LIMIT 227 | 874ce620 ? 228 | 878dface ? 229 | 880f8f1b ? 230 | 89fb339e ? 231 | 8a0c7f08 ? 232 | 8a2d5c31 ? 233 | 8a5a8e29 ? 234 | 8aa9740e ? 235 | 8ae1cb37 ? 236 | 8c41607e ? 237 | 8c4471ca ? 238 | 8da002ce ? 239 | 8dddf20d ? 240 | 9192282a ? 241 | 92f2aea1 ? 242 | 93141a1d ? 243 | 93146fba ? 244 | 9314e060 ? 245 | 93da6b88 ? 246 | 94383386 ? 247 | 94839a60 ? 248 | 94d3e44a ? 249 | 964d9d3d ? 250 | 97df3219 AUTO_FOCUS_SCENE_REFOCUS_ENABLED 251 | 985090e5 ? 252 | 99a1318a ? 253 | 9b07bcbf ? 254 | 9b629640 ? 255 | 9b62a540 ? 256 | 9b62d8bc ? 257 | 9b9af748 ? 258 | 9bf58761 ? 259 | 9bf5b461 ? 260 | 9bf5fa9d ? 261 | 9cfaae77 ? 262 | 9e5b4435 ? 263 | 9ffa54c3 SENSOR_GAIN_MAX 264 | a130e959 ? 265 | a20a7bfa ? 266 | a353820e ? 267 | a35e2e66 ZOOM_IDLE 268 | a35e34a8 PAN_IDLE 269 | a35ebcbf TILT_IDLE 270 | a380b1d5 ? 271 | a3fe29e3 ? 272 | a55e44c2 ? 273 | a57539ef ? 274 | a5759fdd ? 275 | a660477e ? 276 | a867b1b1 ? 277 | a8aacb21 ? 278 | a91b01b2 ? 279 | a98ca0ab ? 280 | a98ca1ca ? 281 | a98ccb41 ? 282 | a9eb2e78 HEAD_Reinit 283 | aa4642cd ? 284 | aa5c74f9 ? 285 | aa962492 ? 286 | aaaa4d7a ? 287 | ab67d973 ? 288 | abaa5351 ? 289 | ae0ad133 ? 290 | aee1687c ? 291 | af0c77ca IMAGE_BUILD_TYPE 292 | b000a822 PAN_LIMIT 293 | b016ba57 ? 294 | b0e50806 ? 295 | b0e50835 ? 296 | b0e531df ? 297 | b0e55989 ? 298 | b0e5764c ? 299 | b0e58b0f ? 300 | b0e5cc9c ? 301 | b0e5d296 ? 302 | b134b9be ? 303 | b297e85e ? 304 | b29887b4 ? 305 | b5d2c90e ? 306 | b60e8864 ? 307 | b7e96f7c ? 308 | b814e126 ? 309 | b8a8e371 SERIAL_NUM 310 | b9aa4a09 ? 311 | bb278e29 ? 312 | bc00eaab ? 313 | bc7e9a6b ? 314 | bce04762 ? 315 | bd66883a ? 316 | bd7ef6ff ? 317 | bd8b4fe1 ? 318 | be2bd2df ? 319 | be554b5c ? 320 | bf550e3c ? 321 | bf96d100 ? 322 | c023ce95 ? 323 | c0348a62 ? 324 | c0349e92 ? 325 | c034ab73 ? 326 | c034f856 ? 327 | c0cef3f0 AUTO_FOCUS_ENERGY_DUMP_ENABLED 328 | c1af1096 ? 329 | c1afa175 ? 330 | c1afaa5a ? 331 | c1eadd34 ? 332 | c262bd83 ? 333 | c37ce126 ? 334 | c3d42fbb Head_Version 335 | c3d433df FPGA_Version 336 | c3d44cb9 IMAGE_VERSION 337 | c48b2b76 ? 338 | c55e0837 VIDEO_AE_ENABLED 339 | c55e46a6 ? 340 | c55e8fa9 ? 341 | c55eba57 VIDEO_AWB_ENABLED 342 | c6d02c53 ? 343 | c73ebffc ? 344 | c8291069 ? 345 | c8295a70 ? 346 | c8299667 ? 347 | c829c6c9 ? 348 | c85f740e ? 349 | c941be82 ? 350 | cadfa16f ? 351 | cafbc9ab ? 352 | cb1abffc ? 353 | cb70f077 AUTO_FOCUS_ENERGY_GRAPH_ENABLED 354 | cc82a0cc ? 355 | ccaa883a ? 356 | ce3a883a ? 357 | cf10968b ? 358 | d0f49f2a ? 359 | d1a3d78d ? 360 | d1daa47e ? 361 | d2256c1a ? 362 | d225ea14 ? 363 | d2320837 ? 364 | d23535a2 FOCUS_STEP 365 | d235af8a ? 366 | d235ef8b ? 367 | d28bd307 ? 368 | d49535a2 ? 369 | d495af8a ? 370 | d495eac7 ? 371 | d495ef8b ? 372 | d4c58baa ? 373 | d4c5e121 ? 374 | d4f60f8b ? 375 | d4f68286 ? 376 | d4f6c125 ? 377 | d65e3cf2 ? 378 | d65eb350 ? 379 | d77e61b4 TILT_RAMP_UP_STEPS 380 | d84944c2 ? 381 | d99dbffc ? 382 | d9f91452 ? 383 | da054bd0 IMAGE_BUILD_OWNER 384 | da05e2e1 ? 385 | da56c77d ? 386 | da610d02 ? 387 | da613e02 ? 388 | da6170fe ? 389 | da6176a3 ? 390 | db2290ba ? 391 | db22fe7d ? 392 | db4491de ? 393 | db6876fe VIDEO_AE_AVG_LUMA 394 | dc31e7ff ? 395 | dc7905cb ? 396 | dc79e340 ? 397 | dcd055b0 ? 398 | dd9c39c6 ? 399 | dd9c6875 ? 400 | de189509 ? 401 | de41eb95 ? 402 | dec2d594 ? 403 | e03d0a6e VIDEO_ISP_OUTPUT_MODE 404 | e1428c40 ? 405 | e1dd9a35 ? 406 | e233e4b8 ? 407 | e357c67a ? 408 | e3cfe58d ? 409 | e41abe88 ? 410 | e43f9343 SENSOR_ITIME 411 | e4576428 ? 412 | e4bc6410 ? 413 | e611cb63 ? 414 | e657afd7 ? 415 | e6f28f37 ? 416 | e81f87a6 ? 417 | ea73a0ce Video_Format 418 | eb2a23af ? 419 | eb2a2880 ? 420 | eb2a8840 ? 421 | eb6667e8 ? 422 | ed134c34 ? 423 | ed6c229f Auto_Focus_Run 424 | efc6318a ? 425 | efd42e66 ? 426 | efd4bcbf ? 427 | f09b789d ? 428 | f0bddbc4 ? 429 | f289c975 ? 430 | f2b51df7 ? 431 | f374c62d ? 432 | f3930be6 ? 433 | f4257730 ? 434 | f4c7318a ? 435 | f56019bd PAN_MIN_STEPS 436 | f5609fb3 PAN_MAX_STEPS 437 | f5c86d07 ? 438 | f5d7eaca ? 439 | f676d72e ? 440 | f6ad858a ? 441 | f6e90eda ? 442 | f6e95f55 ? 443 | f6e95f66 ? 444 | f72f7c56 ? 445 | f7b93cce TEST_INT 446 | f8a01f38 ? 447 | fa1abf79 ? 448 | fadd7491 ? 449 | fbe1f9b0 ? 450 | fc43ff4a ? 451 | fc86cb37 ? 452 | fe529f57 ? 453 | --------------------------------------------------------------------------------