Line data Source code
1 : #include "wibmod/WIB1/WIB.hh"
2 : #include <unistd.h> // usleep
3 :
4 : #include "wibmod/WIB1/WIBException.hh"
5 :
6 : #define COURSE_DATARATE_SIZE 232
7 : static float courseDataRates[COURSE_DATARATE_SIZE] = {
8 : 5.3745e+06, 5.3741e+06, 5.4793e+06, 5.5912e+06, 5.7111e+06, 5.8391e+06, 5.9760e+06, 6.1215e+06, 6.2780e+06,
9 : 6.4565e+06, 6.6391e+06, 6.8372e+06, 7.0520e+06, 7.2868e+06, 7.5424e+06, 7.8220e+06, 7.6663e+06, 7.6659e+06,
10 : 7.8217e+06, 7.9880e+06, 8.1667e+06, 8.3570e+06, 8.5616e+06, 8.7805e+06, 9.0166e+06, 9.2849e+06, 9.5608e+06,
11 : 9.8591e+06, 1.0183e+07, 1.0535e+07, 1.0918e+07, 1.1332e+07, 1.0749e+07, 1.0748e+07, 1.0959e+07, 1.1182e+07,
12 : 1.1422e+07, 1.1678e+07, 1.1952e+07, 1.2243e+07, 1.2556e+07, 1.2913e+07, 1.3278e+07, 1.3674e+07, 1.4104e+07,
13 : 1.4574e+07, 1.5085e+07, 1.5644e+07, 1.5333e+07, 1.5332e+07, 1.5643e+07, 1.5976e+07, 1.6333e+07, 1.6714e+07,
14 : 1.7123e+07, 1.7561e+07, 1.8033e+07, 1.8570e+07, 1.9122e+07, 1.9718e+07, 2.0367e+07, 2.1070e+07, 2.1835e+07,
15 : 2.2664e+07, 2.1498e+07, 2.1496e+07, 2.1917e+07, 2.2365e+07, 2.2844e+07, 2.3357e+07, 2.3904e+07, 2.4486e+07,
16 : 2.5112e+07, 2.5826e+07, 2.6556e+07, 2.7349e+07, 2.8208e+07, 2.9147e+07, 3.0170e+07, 3.1288e+07, 3.0665e+07,
17 : 3.0664e+07, 3.1287e+07, 3.1952e+07, 3.2667e+07, 3.3428e+07, 3.4246e+07, 3.5122e+07, 3.6066e+07, 3.7140e+07,
18 : 3.8243e+07, 3.9436e+07, 4.0733e+07, 4.2140e+07, 4.3671e+07, 4.5328e+07, 4.2996e+07, 4.2993e+07, 4.3834e+07,
19 : 4.4729e+07, 4.5688e+07, 4.6713e+07, 4.7808e+07, 4.8972e+07, 5.0224e+07, 5.1652e+07, 5.3113e+07, 5.4698e+07,
20 : 5.6416e+07, 5.8295e+07, 6.0339e+07, 6.2576e+07, 6.1331e+07, 6.1328e+07, 6.2574e+07, 6.3904e+07, 6.5334e+07,
21 : 6.6856e+07, 6.8493e+07, 7.0244e+07, 7.2133e+07, 7.4279e+07, 7.6486e+07, 7.8872e+07, 8.1467e+07, 8.4279e+07,
22 : 8.7341e+07, 9.0657e+07, 8.5991e+07, 8.5986e+07, 8.7668e+07, 8.9458e+07, 9.1377e+07, 9.3426e+07, 9.5616e+07,
23 : 9.7944e+07, 1.0045e+08, 1.0330e+08, 1.0623e+08, 1.0940e+08, 1.1283e+08, 1.1659e+08, 1.2068e+08, 1.2515e+08,
24 : 1.2266e+08, 1.2266e+08, 1.2515e+08, 1.2781e+08, 1.3067e+08, 1.3371e+08, 1.3699e+08, 1.4049e+08, 1.4427e+08,
25 : 1.4856e+08, 1.5297e+08, 1.5774e+08, 1.6293e+08, 1.6856e+08, 1.7468e+08, 1.8131e+08, 1.7198e+08, 1.7197e+08,
26 : 1.7534e+08, 1.7892e+08, 1.8275e+08, 1.8685e+08, 1.9123e+08, 1.9589e+08, 2.0089e+08, 2.0661e+08, 2.1245e+08,
27 : 2.1879e+08, 2.2566e+08, 2.3318e+08, 2.4136e+08, 2.5030e+08, 2.4532e+08, 2.4531e+08, 2.5029e+08, 2.5562e+08,
28 : 2.6134e+08, 2.6742e+08, 2.7397e+08, 2.8098e+08, 2.8853e+08, 2.9712e+08, 3.0594e+08, 3.1549e+08, 3.2587e+08,
29 : 3.3712e+08, 3.4936e+08, 3.6263e+08, 3.4397e+08, 3.4394e+08, 3.5067e+08, 3.5783e+08, 3.6551e+08, 3.7370e+08,
30 : 3.8247e+08, 3.9177e+08, 4.0179e+08, 4.1322e+08, 4.2490e+08, 4.3758e+08, 4.5133e+08, 4.6636e+08, 4.8272e+08,
31 : 5.0061e+08, 4.9064e+08, 4.9062e+08, 5.0059e+08, 5.1123e+08, 5.2267e+08, 5.3485e+08, 5.4794e+08, 5.6195e+08,
32 : 5.7706e+08, 5.9423e+08, 6.1189e+08, 6.3098e+08, 6.5173e+08, 6.7423e+08, 6.9873e+08, 7.2525e+08, 6.8793e+08,
33 : 6.8789e+08, 7.0135e+08, 7.1567e+08, 7.3102e+08, 7.4741e+08, 7.6493e+08, 7.8355e+08
34 : };
35 :
36 : void
37 0 : WIB::WriteDTS_CDS(uint16_t address, uint32_t value, uint8_t byte_count, bool ignore_error)
38 : {
39 0 : WriteI2C("DTS.CDS.I2C", address, value, byte_count, ignore_error);
40 0 : }
41 : uint32_t
42 0 : WIB::ReadDTS_CDS(uint16_t address, uint8_t byte_count)
43 : {
44 0 : return ReadI2C("DTS.CDS.I2C", address, byte_count);
45 : }
46 :
47 : float
48 0 : WIB::ConfigureDTSCDS(uint8_t source)
49 : {
50 0 : if (source > 1) {
51 0 : BUException::WIB_BAD_ARGS e;
52 0 : e.Append("Bad DTS CDS clock source");
53 0 : throw e;
54 0 : }
55 :
56 : // Set timing system source (FP:0 BP:1)
57 0 : WriteWithRetry("DTS.CDS.INPUT_SELECT", source);
58 :
59 : // Reset the I2C firmware
60 0 : WriteWithRetry("DTS.CDS.I2C.RESET", 1);
61 : // Reset the CDS chip (ADN2814)
62 0 : WriteDTS_CDS(0x9, 0x20, 1);
63 0 : usleep(500000);
64 :
65 : // Reset the I2C firmware
66 0 : WriteWithRetry("DTS.CDS.I2C.RESET", 1);
67 : // Un reset
68 0 : WriteDTS_CDS(0x9, 0x00, 1, true);
69 : // Reset the I2C firmware
70 0 : WriteWithRetry("DTS.CDS.I2C.RESET", 1);
71 0 : usleep(1000000);
72 :
73 : // read bits 8 downto 1 from reg 3
74 0 : uint16_t dataRateLookup = uint16_t(ReadDTS_CDS(0x3, 1)) << 1;
75 : // Read bit 0 from reg 4
76 0 : dataRateLookup |= uint16_t(ReadDTS_CDS(0x4, 1)) & 0x1;
77 0 : if (dataRateLookup >= COURSE_DATARATE_SIZE) {
78 : return -1;
79 : }
80 0 : return courseDataRates[dataRateLookup];
81 : }
|