Communication for solid slow control.
Fork of sscm_comm by
sscm_comm.cpp@9:a68c382dea12, 2014-10-07 (annotated)
- Committer:
- NickRyder
- Date:
- Tue Oct 07 22:51:01 2014 +0000
- Revision:
- 9:a68c382dea12
- Parent:
- 7:6d3c421026df
I must have tidied the sscm_comm library elsewhere.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
wbeaumont | 2:1f9887337a1b | 1 | #if defined (TARGET_KL25Z) |
wbeaumont | 2:1f9887337a1b | 2 | // in mbed problems to call strtol |
wbeaumont | 2:1f9887337a1b | 3 | #include "mbed.h" // for the strtol |
wbeaumont | 2:1f9887337a1b | 4 | #else |
wbeaumont | 2:1f9887337a1b | 5 | #include <stlib.h> // for the strtol |
wbeaumont | 2:1f9887337a1b | 6 | #endif |
wbeaumont | 1:288db0531b1f | 7 | |
wbeaumont | 1:288db0531b1f | 8 | #include "sscm_comm.h" |
wbeaumont | 0:2afae79ea9ca | 9 | |
wbeaumont | 0:2afae79ea9ca | 10 | |
wbeaumont | 7:6d3c421026df | 11 | #define SSCM_COMM_LIB_SRC_VERSION "3.31" |
wbeaumont | 0:2afae79ea9ca | 12 | |
wbeaumont | 1:288db0531b1f | 13 | using namespace sscm_comm; |
wbeaumont | 0:2afae79ea9ca | 14 | |
wbeaumont | 0:2afae79ea9ca | 15 | int sscm_comm::decode_cmd(char* input, ssc_cmd * sc){ |
NickRyder | 9:a68c382dea12 | 16 | char part[6]; |
NickRyder | 9:a68c382dea12 | 17 | int rv = 0; |
NickRyder | 9:a68c382dea12 | 18 | part[0] = input[0]; |
NickRyder | 9:a68c382dea12 | 19 | part[1] = input[1]; |
NickRyder | 9:a68c382dea12 | 20 | part[2] = 0; |
NickRyder | 9:a68c382dea12 | 21 | sc->module = (u8) strtol(part, NULL, 16); |
NickRyder | 9:a68c382dea12 | 22 | if(input[3] != SEP) { |
NickRyder | 9:a68c382dea12 | 23 | rv =-1; // tbd check for module range |
NickRyder | 9:a68c382dea12 | 24 | } else { |
NickRyder | 9:a68c382dea12 | 25 | u16 ic;//input counter |
NickRyder | 9:a68c382dea12 | 26 | part[0] = input[4]; |
NickRyder | 9:a68c382dea12 | 27 | part[1] = input[5]; |
NickRyder | 9:a68c382dea12 | 28 | part[2] = 0; |
NickRyder | 9:a68c382dea12 | 29 | sc->con = (u8) strtol(part, NULL, 16); |
NickRyder | 9:a68c382dea12 | 30 | if(input[6] != SEP) { |
NickRyder | 9:a68c382dea12 | 31 | rv = -2; // tbd check for connector range |
NickRyder | 9:a68c382dea12 | 32 | } else { |
NickRyder | 9:a68c382dea12 | 33 | part[0] = input[7]; |
NickRyder | 9:a68c382dea12 | 34 | part[1] = input[8]; |
NickRyder | 9:a68c382dea12 | 35 | part[2] = 0; |
NickRyder | 9:a68c382dea12 | 36 | sc->dev = (ssc_dev) strtol(part, NULL, 16); |
NickRyder | 9:a68c382dea12 | 37 | if (input[9] != SEP) { |
NickRyder | 9:a68c382dea12 | 38 | rv = -3; |
NickRyder | 9:a68c382dea12 | 39 | } else { |
NickRyder | 9:a68c382dea12 | 40 | ic = 10; |
NickRyder | 9:a68c382dea12 | 41 | part[0] = input[ic++]; |
NickRyder | 9:a68c382dea12 | 42 | part[1] = input[ic++]; |
NickRyder | 9:a68c382dea12 | 43 | part[2] = 0; |
NickRyder | 9:a68c382dea12 | 44 | sc->devnr = (u8) strtol(part, NULL, 16); |
NickRyder | 9:a68c382dea12 | 45 | if (input[ic++] != SEP) { |
NickRyder | 9:a68c382dea12 | 46 | rv = -9; |
NickRyder | 9:a68c382dea12 | 47 | } else { |
NickRyder | 9:a68c382dea12 | 48 | sc->cmd[0] = input[ic++]; |
NickRyder | 9:a68c382dea12 | 49 | sc->cmd[1] = input[ic++]; |
NickRyder | 9:a68c382dea12 | 50 | sc->cmd[2] = input[ic++]; |
NickRyder | 9:a68c382dea12 | 51 | sc->cmd[3] = input[ic++]; |
NickRyder | 9:a68c382dea12 | 52 | sc->cmd[4] = '\0'; |
NickRyder | 9:a68c382dea12 | 53 | if (input[ic++] != SEP) { |
NickRyder | 9:a68c382dea12 | 54 | rv = -4; |
NickRyder | 9:a68c382dea12 | 55 | } else { |
NickRyder | 9:a68c382dea12 | 56 | part[0] = input[ic++]; |
NickRyder | 9:a68c382dea12 | 57 | part[1] = input[ic++]; |
NickRyder | 9:a68c382dea12 | 58 | part[2] = 0; |
NickRyder | 9:a68c382dea12 | 59 | sc->ch = (u8) strtol(part, NULL, 16); |
NickRyder | 9:a68c382dea12 | 60 | if (input[ic++] != SEP) { |
NickRyder | 9:a68c382dea12 | 61 | rv= -5; |
NickRyder | 9:a68c382dea12 | 62 | } else { |
NickRyder | 9:a68c382dea12 | 63 | part[0] = input[ic++]; |
NickRyder | 9:a68c382dea12 | 64 | part[1] = input[ic++]; |
NickRyder | 9:a68c382dea12 | 65 | part[2] = input[ic++]; |
NickRyder | 9:a68c382dea12 | 66 | part[3] = input[ic++]; |
NickRyder | 9:a68c382dea12 | 67 | part[4] = 0; |
NickRyder | 9:a68c382dea12 | 68 | sc->datain = (u16) strtol(part, NULL, 16); |
NickRyder | 9:a68c382dea12 | 69 | if(input[ic++] != SEP) { |
NickRyder | 9:a68c382dea12 | 70 | rv= -6; |
NickRyder | 9:a68c382dea12 | 71 | } else { |
NickRyder | 9:a68c382dea12 | 72 | part[0] = input[ic++]; |
NickRyder | 9:a68c382dea12 | 73 | part[1] = input[ic++]; |
NickRyder | 9:a68c382dea12 | 74 | part[2] = input[ic++]; |
NickRyder | 9:a68c382dea12 | 75 | part[3] = input[ic++]; |
NickRyder | 9:a68c382dea12 | 76 | part[4] = 0; |
NickRyder | 9:a68c382dea12 | 77 | sc->dataout = (u16) strtol(part, NULL, 16); |
NickRyder | 9:a68c382dea12 | 78 | if (input[ic++] != SEP) { |
NickRyder | 9:a68c382dea12 | 79 | rv= -7; |
NickRyder | 9:a68c382dea12 | 80 | } else { |
NickRyder | 9:a68c382dea12 | 81 | part[0] = input[ic++]; |
NickRyder | 9:a68c382dea12 | 82 | part[1] = input[ic++]; |
NickRyder | 9:a68c382dea12 | 83 | part[4] = 0; |
NickRyder | 9:a68c382dea12 | 84 | sc->status = (u8) strtol(part, NULL, 16); |
NickRyder | 9:a68c382dea12 | 85 | if (input[ic++] != SEP) { |
NickRyder | 9:a68c382dea12 | 86 | rv = -8; |
NickRyder | 9:a68c382dea12 | 87 | } else { |
NickRyder | 9:a68c382dea12 | 88 | rv = 0; |
NickRyder | 9:a68c382dea12 | 89 | } |
NickRyder | 9:a68c382dea12 | 90 | } |
NickRyder | 9:a68c382dea12 | 91 | } |
NickRyder | 9:a68c382dea12 | 92 | } |
NickRyder | 9:a68c382dea12 | 93 | } |
NickRyder | 9:a68c382dea12 | 94 | } |
NickRyder | 9:a68c382dea12 | 95 | } |
NickRyder | 9:a68c382dea12 | 96 | } |
NickRyder | 9:a68c382dea12 | 97 | } |
NickRyder | 9:a68c382dea12 | 98 | int crr = check_ranges(sc); |
NickRyder | 9:a68c382dea12 | 99 | if (crr < 0) rv = crr; |
NickRyder | 9:a68c382dea12 | 100 | for (int i = 0; i < 27; i++) { |
NickRyder | 9:a68c382dea12 | 101 | input[i] = 0; |
NickRyder | 9:a68c382dea12 | 102 | } |
NickRyder | 9:a68c382dea12 | 103 | return rv; |
wbeaumont | 0:2afae79ea9ca | 104 | } |
wbeaumont | 0:2afae79ea9ca | 105 | |
NickRyder | 9:a68c382dea12 | 106 | int sscm_comm::check_ranges(ssc_cmd * sc) { |
NickRyder | 9:a68c382dea12 | 107 | int rv = 1; // no check done |
NickRyder | 9:a68c382dea12 | 108 | // devnr check |
NickRyder | 9:a68c382dea12 | 109 | if (sc->con < 1 || sc->con > 2) { |
NickRyder | 9:a68c382dea12 | 110 | rv = -43; |
NickRyder | 9:a68c382dea12 | 111 | goto RVOUT; // goto jail. Do not collect £200. |
NickRyder | 9:a68c382dea12 | 112 | } |
NickRyder | 9:a68c382dea12 | 113 | switch (sc->dev) { |
NickRyder | 9:a68c382dea12 | 114 | case ADC: |
NickRyder | 9:a68c382dea12 | 115 | if (sc->devnr < 1 || sc->devnr > 2) { |
NickRyder | 9:a68c382dea12 | 116 | rv = -23; |
NickRyder | 9:a68c382dea12 | 117 | break; |
NickRyder | 9:a68c382dea12 | 118 | } |
NickRyder | 9:a68c382dea12 | 119 | break; |
NickRyder | 9:a68c382dea12 | 120 | case TEMP: |
NickRyder | 9:a68c382dea12 | 121 | if (sc->ch < 1 || sc->ch > 2) { |
NickRyder | 9:a68c382dea12 | 122 | rv = -22; |
NickRyder | 9:a68c382dea12 | 123 | break; |
NickRyder | 9:a68c382dea12 | 124 | } |
NickRyder | 9:a68c382dea12 | 125 | break; |
NickRyder | 9:a68c382dea12 | 126 | default: |
NickRyder | 9:a68c382dea12 | 127 | rv = 1; |
NickRyder | 9:a68c382dea12 | 128 | } |
NickRyder | 9:a68c382dea12 | 129 | RVOUT: |
NickRyder | 9:a68c382dea12 | 130 | return rv; |
wbeaumont | 2:1f9887337a1b | 131 | } |
wbeaumont | 2:1f9887337a1b | 132 | |
NickRyder | 9:a68c382dea12 | 133 | void sscm_comm::encode_cmd(char * output, ssc_cmd * sc) { |
NickRyder | 9:a68c382dea12 | 134 | sprintf(output, |
NickRyder | 9:a68c382dea12 | 135 | "%c%02X%c%02X%c%02X%c%02X%c%c%c%c%c%c%02X%c%04X%c%04X%c%02X%c%c\0", |
NickRyder | 9:a68c382dea12 | 136 | CMDSTART, sc->module, SEP, sc->con, SEP, sc->dev, SEP, sc->devnr, |
NickRyder | 9:a68c382dea12 | 137 | SEP, sc->cmd[0], sc->cmd[1], sc->cmd[2], sc->cmd[3], |
NickRyder | 9:a68c382dea12 | 138 | SEP, sc->ch, SEP, sc->datain, SEP, sc->dataout, SEP, |
NickRyder | 9:a68c382dea12 | 139 | sc->status, SEP, CMDSTOP); |
NickRyder | 9:a68c382dea12 | 140 | } |
wbeaumont | 0:2afae79ea9ca | 141 | |
NickRyder | 9:a68c382dea12 | 142 | void sscm_comm::getmodulecordinate(u8 plane, u8& modulenr, u8& connr, u8& serialnr) { |
wbeaumont | 1:288db0531b1f | 143 | // to be implemented |
wbeaumont | 1:288db0531b1f | 144 | modulenr=0; |
wbeaumont | 6:d9a96735d0fb | 145 | } |
wbeaumont | 6:d9a96735d0fb | 146 | |
wbeaumont | 7:6d3c421026df | 147 | /* |
wbeaumont | 7:6d3c421026df | 148 | u16 sscm_comm::getSrcVersion(){ |
NickRyder | 9:a68c382dea12 | 149 | return get_hex_version_nr(SSCM_COMM_LIB_SRC_VERSION); |
wbeaumont | 7:6d3c421026df | 150 | } |
wbeaumont | 6:d9a96735d0fb | 151 | |
wbeaumont | 7:6d3c421026df | 152 | u16 sscm_comm::getHdrVersion(){ |
NickRyder | 9:a68c382dea12 | 153 | return get_hex_version_nr(SSCM_COMM_LIB_HDR_VERSION ); |
wbeaumont | 7:6d3c421026df | 154 | } |
wbeaumont | 7:6d3c421026df | 155 | */ |
NickRyder | 9:a68c382dea12 | 156 | |
NickRyder | 9:a68c382dea12 | 157 | void sscm_comm::get_mppc_dac_chnr(u8 plane, u8 x, u8 y, u8& ch, u8& modulenr, |
NickRyder | 9:a68c382dea12 | 158 | u8& connr, u8& dacch, u8& serialnr) { |
NickRyder | 9:a68c382dea12 | 159 | } |
wbeaumont | 7:6d3c421026df | 160 | |
NickRyder | 9:a68c382dea12 | 161 | void sscm_comm::get_mppc_adc_chnr(u8 plane, u8 x , u8 y, u8& ch, u8& modulenr, |
NickRyder | 9:a68c382dea12 | 162 | u8& connr, u8& adcdevnr, u8& adcchnr, |
NickRyder | 9:a68c382dea12 | 163 | u8& serialnr) { |
NickRyder | 9:a68c382dea12 | 164 | } |
wbeaumont | 7:6d3c421026df | 165 | |
NickRyder | 9:a68c382dea12 | 166 | sscm_comm::getsscmVersion::getsscmVersion(): |
NickRyder | 9:a68c382dea12 | 167 | getVersion(SSCM_COMM_LIB_HDR_VERSION, SSCM_COMM_LIB_SRC_VERSION, __TIME__, __DATE__){ |
NickRyder | 9:a68c382dea12 | 168 | } |