baseline build
Dependencies: FastPWM mbed-os mbed
CMSerial.cpp@0:8a420ac6394e, 2017-06-19 (annotated)
- Committer:
- jrhodes5150
- Date:
- Mon Jun 19 15:55:51 2017 +0000
- Revision:
- 0:8a420ac6394e
initial build - baseline;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jrhodes5150 | 0:8a420ac6394e | 1 | |
jrhodes5150 | 0:8a420ac6394e | 2 | #include "CMSerial.h" |
jrhodes5150 | 0:8a420ac6394e | 3 | #include "DeviceProperties.h" |
jrhodes5150 | 0:8a420ac6394e | 4 | |
jrhodes5150 | 0:8a420ac6394e | 5 | const char VERSION_STRING[] = "0.6"; |
jrhodes5150 | 0:8a420ac6394e | 6 | |
jrhodes5150 | 0:8a420ac6394e | 7 | |
jrhodes5150 | 0:8a420ac6394e | 8 | CMSerial::CMSerial(void) : led(LED2), serial(p13, p14) |
jrhodes5150 | 0:8a420ac6394e | 9 | { |
jrhodes5150 | 0:8a420ac6394e | 10 | lineLength = 0; |
jrhodes5150 | 0:8a420ac6394e | 11 | serial.baud(115200); |
jrhodes5150 | 0:8a420ac6394e | 12 | threadSerial.start(this, &CMSerial::ThreadEntry); |
jrhodes5150 | 0:8a420ac6394e | 13 | } |
jrhodes5150 | 0:8a420ac6394e | 14 | |
jrhodes5150 | 0:8a420ac6394e | 15 | void CMSerial::ThreadEntry(void) |
jrhodes5150 | 0:8a420ac6394e | 16 | { |
jrhodes5150 | 0:8a420ac6394e | 17 | while(true) |
jrhodes5150 | 0:8a420ac6394e | 18 | { |
jrhodes5150 | 0:8a420ac6394e | 19 | char c = serial.getc(); |
jrhodes5150 | 0:8a420ac6394e | 20 | led = !led; |
jrhodes5150 | 0:8a420ac6394e | 21 | if( c == '\n' ) |
jrhodes5150 | 0:8a420ac6394e | 22 | continue; |
jrhodes5150 | 0:8a420ac6394e | 23 | if (c == '\r') |
jrhodes5150 | 0:8a420ac6394e | 24 | { |
jrhodes5150 | 0:8a420ac6394e | 25 | line[lineLength] = 0; |
jrhodes5150 | 0:8a420ac6394e | 26 | ProcessCommand(); |
jrhodes5150 | 0:8a420ac6394e | 27 | lineLength = 0; |
jrhodes5150 | 0:8a420ac6394e | 28 | continue; |
jrhodes5150 | 0:8a420ac6394e | 29 | } |
jrhodes5150 | 0:8a420ac6394e | 30 | if (lineLength < sizeof(line) - 1) |
jrhodes5150 | 0:8a420ac6394e | 31 | line[lineLength++] = c; |
jrhodes5150 | 0:8a420ac6394e | 32 | } |
jrhodes5150 | 0:8a420ac6394e | 33 | } |
jrhodes5150 | 0:8a420ac6394e | 34 | |
jrhodes5150 | 0:8a420ac6394e | 35 | void CMSerial::ProcessCommand(void) |
jrhodes5150 | 0:8a420ac6394e | 36 | { |
jrhodes5150 | 0:8a420ac6394e | 37 | |
jrhodes5150 | 0:8a420ac6394e | 38 | if (CommandIs("status")) |
jrhodes5150 | 0:8a420ac6394e | 39 | { |
jrhodes5150 | 0:8a420ac6394e | 40 | serial.printf("<status"); |
jrhodes5150 | 0:8a420ac6394e | 41 | serial.printf(" version=\"%s\"", VERSION_STRING); |
jrhodes5150 | 0:8a420ac6394e | 42 | serial.printf(" AcquisitionNumber=\"%d\"", Device.GetAcquisitionNumber()); |
jrhodes5150 | 0:8a420ac6394e | 43 | serial.printf(" AcquisitionSamples=\"%d\"", Device.GetAcquisitionSampleCount()); |
jrhodes5150 | 0:8a420ac6394e | 44 | // Control Parameters |
jrhodes5150 | 0:8a420ac6394e | 45 | serial.printf(" OutputMode=\"%d\"", (int)Device.deviceConfig.outputMode); |
jrhodes5150 | 0:8a420ac6394e | 46 | serial.printf(" ConstantVoltage=\"%f\"", Device.deviceConfig.constantVoltage); |
jrhodes5150 | 0:8a420ac6394e | 47 | serial.printf(" ConstantPower=\"%f\"", Device.deviceConfig.constantPower); |
jrhodes5150 | 0:8a420ac6394e | 48 | serial.printf(" KP=\"%lf\"", Device.deviceConfig.kp); |
jrhodes5150 | 0:8a420ac6394e | 49 | serial.printf(" KI=\"%lf\"", Device.deviceConfig.ki); |
jrhodes5150 | 0:8a420ac6394e | 50 | serial.printf(" KD=\"%lf\"", Device.deviceConfig.kd); |
jrhodes5150 | 0:8a420ac6394e | 51 | serial.printf(" VoltageCal=\"%lf\"", Device.deviceConfig.voltageCal); |
jrhodes5150 | 0:8a420ac6394e | 52 | serial.printf(" CurrentCal=\"%lf\"", Device.deviceConfig.currentCal); |
jrhodes5150 | 0:8a420ac6394e | 53 | serial.printf(" vLim=\"%lf\"", Device.deviceConfig.vLim); |
jrhodes5150 | 0:8a420ac6394e | 54 | serial.printf(" iLim=\"%lf\"", Device.deviceConfig.iLim); |
jrhodes5150 | 0:8a420ac6394e | 55 | // Activation Parameters |
jrhodes5150 | 0:8a420ac6394e | 56 | serial.printf(" PwmFrequency=\"%lf\"", Device.GetActualPWMFrequency()); |
jrhodes5150 | 0:8a420ac6394e | 57 | serial.printf(" OpenLoopDuration=\"%d\"", Device.deviceConfig.msOpenLoopDuration); |
jrhodes5150 | 0:8a420ac6394e | 58 | serial.printf(" TotalDuration=\"%lf\"", Device.deviceConfig.TotalDurationSeconds); |
jrhodes5150 | 0:8a420ac6394e | 59 | serial.printf(" RampDuration=\"%lf\"", Device.deviceConfig.msRampDuration); |
jrhodes5150 | 0:8a420ac6394e | 60 | serial.printf(" RampStartPower=\"%lf\"", Device.deviceConfig.rampStartPower); |
jrhodes5150 | 0:8a420ac6394e | 61 | serial.printf(" RampEndPower=\"%lf\"", Device.deviceConfig.rampEndPower); |
jrhodes5150 | 0:8a420ac6394e | 62 | serial.printf(" StartVoltage=\"%lf\"", Device.deviceConfig.startVoltage); |
jrhodes5150 | 0:8a420ac6394e | 63 | serial.printf(" SamplePeriod=\"%d\"", Device.deviceConfig.msSamplePeriod); |
jrhodes5150 | 0:8a420ac6394e | 64 | serial.printf("/>\r\n"); |
jrhodes5150 | 0:8a420ac6394e | 65 | return; |
jrhodes5150 | 0:8a420ac6394e | 66 | } |
jrhodes5150 | 0:8a420ac6394e | 67 | |
jrhodes5150 | 0:8a420ac6394e | 68 | if( CommandIs("GetSample")) |
jrhodes5150 | 0:8a420ac6394e | 69 | { |
jrhodes5150 | 0:8a420ac6394e | 70 | int acquisition = (int)GetNumericArgument(1, 0); |
jrhodes5150 | 0:8a420ac6394e | 71 | int sample = (int)GetNumericArgument(2, 0); |
jrhodes5150 | 0:8a420ac6394e | 72 | AcquisitionData sampleData = Device.GetAcquisitionSample(acquisition, sample); |
jrhodes5150 | 0:8a420ac6394e | 73 | serial.printf("<sample"); |
jrhodes5150 | 0:8a420ac6394e | 74 | serial.printf(" Time=\"%f\"", sampleData.timestampMilliseconds); |
jrhodes5150 | 0:8a420ac6394e | 75 | serial.printf(" TargetVoltage=\"%f\"", Device.deviceConfig.constantVoltage); |
jrhodes5150 | 0:8a420ac6394e | 76 | serial.printf(" Isns=\"%f\"", sampleData.iSense); |
jrhodes5150 | 0:8a420ac6394e | 77 | serial.printf(" Vsns=\"%f\"", sampleData.vSense); |
jrhodes5150 | 0:8a420ac6394e | 78 | serial.printf(" Irms=\"%f\"", sampleData.iRMS); |
jrhodes5150 | 0:8a420ac6394e | 79 | serial.printf(" Vrms=\"%f\"", sampleData.vRMS); |
jrhodes5150 | 0:8a420ac6394e | 80 | serial.printf("/>\r\n"); |
jrhodes5150 | 0:8a420ac6394e | 81 | return; |
jrhodes5150 | 0:8a420ac6394e | 82 | } |
jrhodes5150 | 0:8a420ac6394e | 83 | |
jrhodes5150 | 0:8a420ac6394e | 84 | if (CommandIs("version")) |
jrhodes5150 | 0:8a420ac6394e | 85 | { |
jrhodes5150 | 0:8a420ac6394e | 86 | serial.printf("%s\r\n", VERSION_STRING); |
jrhodes5150 | 0:8a420ac6394e | 87 | return; |
jrhodes5150 | 0:8a420ac6394e | 88 | } |
jrhodes5150 | 0:8a420ac6394e | 89 | |
jrhodes5150 | 0:8a420ac6394e | 90 | if( CommandIs("OutputMode")) |
jrhodes5150 | 0:8a420ac6394e | 91 | { |
jrhodes5150 | 0:8a420ac6394e | 92 | Device.deviceConfig.outputMode = (OutputMode) (int)GetNumericArgument(1, (int)Device.deviceConfig.outputMode); |
jrhodes5150 | 0:8a420ac6394e | 93 | serial.printf("%d\r\n", Device.deviceConfig.outputMode); |
jrhodes5150 | 0:8a420ac6394e | 94 | return; |
jrhodes5150 | 0:8a420ac6394e | 95 | } |
jrhodes5150 | 0:8a420ac6394e | 96 | |
jrhodes5150 | 0:8a420ac6394e | 97 | if( CommandIs("ConstantVoltage")) |
jrhodes5150 | 0:8a420ac6394e | 98 | { |
jrhodes5150 | 0:8a420ac6394e | 99 | Device.deviceConfig.constantVoltage = GetNumericArgument(1, Device.deviceConfig.constantVoltage); |
jrhodes5150 | 0:8a420ac6394e | 100 | serial.printf("%lf\r\n", Device.deviceConfig.constantVoltage); |
jrhodes5150 | 0:8a420ac6394e | 101 | return; |
jrhodes5150 | 0:8a420ac6394e | 102 | } |
jrhodes5150 | 0:8a420ac6394e | 103 | |
jrhodes5150 | 0:8a420ac6394e | 104 | if( CommandIs("ConstantPower")) |
jrhodes5150 | 0:8a420ac6394e | 105 | { |
jrhodes5150 | 0:8a420ac6394e | 106 | Device.deviceConfig.constantPower = GetNumericArgument(1, Device.deviceConfig.constantPower); |
jrhodes5150 | 0:8a420ac6394e | 107 | serial.printf("%lf\r\n", Device.deviceConfig.constantPower); |
jrhodes5150 | 0:8a420ac6394e | 108 | return; |
jrhodes5150 | 0:8a420ac6394e | 109 | } |
jrhodes5150 | 0:8a420ac6394e | 110 | |
jrhodes5150 | 0:8a420ac6394e | 111 | if( CommandIs("KP")) |
jrhodes5150 | 0:8a420ac6394e | 112 | { |
jrhodes5150 | 0:8a420ac6394e | 113 | Device.deviceConfig.kp = GetNumericArgument(1, Device.deviceConfig.kp); |
jrhodes5150 | 0:8a420ac6394e | 114 | serial.printf("%lf\r\n", Device.deviceConfig.kp); |
jrhodes5150 | 0:8a420ac6394e | 115 | return; |
jrhodes5150 | 0:8a420ac6394e | 116 | } |
jrhodes5150 | 0:8a420ac6394e | 117 | |
jrhodes5150 | 0:8a420ac6394e | 118 | if( CommandIs("KI")) |
jrhodes5150 | 0:8a420ac6394e | 119 | { |
jrhodes5150 | 0:8a420ac6394e | 120 | Device.deviceConfig.ki = GetNumericArgument(1, Device.deviceConfig.ki); |
jrhodes5150 | 0:8a420ac6394e | 121 | serial.printf("%lf\r\n", Device.deviceConfig.ki); |
jrhodes5150 | 0:8a420ac6394e | 122 | return; |
jrhodes5150 | 0:8a420ac6394e | 123 | } |
jrhodes5150 | 0:8a420ac6394e | 124 | |
jrhodes5150 | 0:8a420ac6394e | 125 | if( CommandIs("KD")) |
jrhodes5150 | 0:8a420ac6394e | 126 | { |
jrhodes5150 | 0:8a420ac6394e | 127 | Device.deviceConfig.kd = GetNumericArgument(1, Device.deviceConfig.kd); |
jrhodes5150 | 0:8a420ac6394e | 128 | serial.printf("%lf\r\n", Device.deviceConfig.kd); |
jrhodes5150 | 0:8a420ac6394e | 129 | return; |
jrhodes5150 | 0:8a420ac6394e | 130 | } |
jrhodes5150 | 0:8a420ac6394e | 131 | |
jrhodes5150 | 0:8a420ac6394e | 132 | if( CommandIs("VoltageCal")) |
jrhodes5150 | 0:8a420ac6394e | 133 | { |
jrhodes5150 | 0:8a420ac6394e | 134 | Device.deviceConfig.voltageCal = GetNumericArgument(1, Device.deviceConfig.voltageCal); |
jrhodes5150 | 0:8a420ac6394e | 135 | serial.printf("%lf\r\n", Device.deviceConfig.voltageCal); |
jrhodes5150 | 0:8a420ac6394e | 136 | return; |
jrhodes5150 | 0:8a420ac6394e | 137 | } |
jrhodes5150 | 0:8a420ac6394e | 138 | |
jrhodes5150 | 0:8a420ac6394e | 139 | if( CommandIs("CurrentCal")) |
jrhodes5150 | 0:8a420ac6394e | 140 | { |
jrhodes5150 | 0:8a420ac6394e | 141 | Device.deviceConfig.currentCal = GetNumericArgument(1, Device.deviceConfig.currentCal); |
jrhodes5150 | 0:8a420ac6394e | 142 | serial.printf("%lf\r\n", Device.deviceConfig.currentCal); |
jrhodes5150 | 0:8a420ac6394e | 143 | return; |
jrhodes5150 | 0:8a420ac6394e | 144 | } |
jrhodes5150 | 0:8a420ac6394e | 145 | |
jrhodes5150 | 0:8a420ac6394e | 146 | if( CommandIs("vLim")) |
jrhodes5150 | 0:8a420ac6394e | 147 | { |
jrhodes5150 | 0:8a420ac6394e | 148 | Device.deviceConfig.vLim = GetNumericArgument(1, Device.deviceConfig.vLim); |
jrhodes5150 | 0:8a420ac6394e | 149 | serial.printf("%lf\r\n", Device.deviceConfig.vLim); |
jrhodes5150 | 0:8a420ac6394e | 150 | return; |
jrhodes5150 | 0:8a420ac6394e | 151 | } |
jrhodes5150 | 0:8a420ac6394e | 152 | |
jrhodes5150 | 0:8a420ac6394e | 153 | if( CommandIs("iLim")) |
jrhodes5150 | 0:8a420ac6394e | 154 | { |
jrhodes5150 | 0:8a420ac6394e | 155 | Device.deviceConfig.iLim = GetNumericArgument(1, Device.deviceConfig.iLim); |
jrhodes5150 | 0:8a420ac6394e | 156 | serial.printf("%lf\r\n", Device.deviceConfig.iLim); |
jrhodes5150 | 0:8a420ac6394e | 157 | return; |
jrhodes5150 | 0:8a420ac6394e | 158 | } |
jrhodes5150 | 0:8a420ac6394e | 159 | |
jrhodes5150 | 0:8a420ac6394e | 160 | // Activation Parameters |
jrhodes5150 | 0:8a420ac6394e | 161 | if( CommandIs("PwmFrequency")) |
jrhodes5150 | 0:8a420ac6394e | 162 | { |
jrhodes5150 | 0:8a420ac6394e | 163 | Device.deviceConfig.pwmFrequency = GetNumericArgument(1, Device.deviceConfig.pwmFrequency); |
jrhodes5150 | 0:8a420ac6394e | 164 | serial.printf("%lf\r\n", Device.deviceConfig.pwmFrequency); |
jrhodes5150 | 0:8a420ac6394e | 165 | return; |
jrhodes5150 | 0:8a420ac6394e | 166 | } |
jrhodes5150 | 0:8a420ac6394e | 167 | |
jrhodes5150 | 0:8a420ac6394e | 168 | if( CommandIs("OpenLoopDuration")) |
jrhodes5150 | 0:8a420ac6394e | 169 | { |
jrhodes5150 | 0:8a420ac6394e | 170 | Device.deviceConfig.msOpenLoopDuration = GetNumericArgument(1, Device.deviceConfig.msOpenLoopDuration); |
jrhodes5150 | 0:8a420ac6394e | 171 | serial.printf("%lf\r\n", Device.deviceConfig.msOpenLoopDuration); |
jrhodes5150 | 0:8a420ac6394e | 172 | return; |
jrhodes5150 | 0:8a420ac6394e | 173 | } |
jrhodes5150 | 0:8a420ac6394e | 174 | |
jrhodes5150 | 0:8a420ac6394e | 175 | if( CommandIs("TotalDuration")) |
jrhodes5150 | 0:8a420ac6394e | 176 | { |
jrhodes5150 | 0:8a420ac6394e | 177 | Device.deviceConfig.TotalDurationSeconds = GetNumericArgument(1, Device.deviceConfig.TotalDurationSeconds); |
jrhodes5150 | 0:8a420ac6394e | 178 | serial.printf("%lf\r\n", Device.deviceConfig.TotalDurationSeconds); |
jrhodes5150 | 0:8a420ac6394e | 179 | return; |
jrhodes5150 | 0:8a420ac6394e | 180 | } |
jrhodes5150 | 0:8a420ac6394e | 181 | |
jrhodes5150 | 0:8a420ac6394e | 182 | if( CommandIs("RampDuration")) |
jrhodes5150 | 0:8a420ac6394e | 183 | { |
jrhodes5150 | 0:8a420ac6394e | 184 | Device.deviceConfig.msRampDuration = GetNumericArgument(1, Device.deviceConfig.msRampDuration); |
jrhodes5150 | 0:8a420ac6394e | 185 | serial.printf("%lf\r\n", Device.deviceConfig.msRampDuration); |
jrhodes5150 | 0:8a420ac6394e | 186 | return; |
jrhodes5150 | 0:8a420ac6394e | 187 | } |
jrhodes5150 | 0:8a420ac6394e | 188 | |
jrhodes5150 | 0:8a420ac6394e | 189 | if( CommandIs("RampStartPower")) |
jrhodes5150 | 0:8a420ac6394e | 190 | { |
jrhodes5150 | 0:8a420ac6394e | 191 | Device.deviceConfig.rampStartPower = GetNumericArgument(1, Device.deviceConfig.rampStartPower); |
jrhodes5150 | 0:8a420ac6394e | 192 | serial.printf("%lf\r\n", Device.deviceConfig.rampStartPower); |
jrhodes5150 | 0:8a420ac6394e | 193 | return; |
jrhodes5150 | 0:8a420ac6394e | 194 | } |
jrhodes5150 | 0:8a420ac6394e | 195 | |
jrhodes5150 | 0:8a420ac6394e | 196 | if( CommandIs("RampEndPower")) |
jrhodes5150 | 0:8a420ac6394e | 197 | { |
jrhodes5150 | 0:8a420ac6394e | 198 | Device.deviceConfig.rampEndPower = GetNumericArgument(1, Device.deviceConfig.rampEndPower); |
jrhodes5150 | 0:8a420ac6394e | 199 | serial.printf("%lf\r\n", Device.deviceConfig.rampEndPower); |
jrhodes5150 | 0:8a420ac6394e | 200 | return; |
jrhodes5150 | 0:8a420ac6394e | 201 | } |
jrhodes5150 | 0:8a420ac6394e | 202 | |
jrhodes5150 | 0:8a420ac6394e | 203 | if( CommandIs("StartVoltage")) |
jrhodes5150 | 0:8a420ac6394e | 204 | { |
jrhodes5150 | 0:8a420ac6394e | 205 | Device.deviceConfig.startVoltage = GetNumericArgument(1, Device.deviceConfig.startVoltage); |
jrhodes5150 | 0:8a420ac6394e | 206 | serial.printf("%lf\r\n", Device.deviceConfig.startVoltage); |
jrhodes5150 | 0:8a420ac6394e | 207 | return; |
jrhodes5150 | 0:8a420ac6394e | 208 | } |
jrhodes5150 | 0:8a420ac6394e | 209 | |
jrhodes5150 | 0:8a420ac6394e | 210 | if( CommandIs("SamplePeriod")) |
jrhodes5150 | 0:8a420ac6394e | 211 | { |
jrhodes5150 | 0:8a420ac6394e | 212 | Device.deviceConfig.msSamplePeriod = GetNumericArgument(1, Device.deviceConfig.msSamplePeriod); |
jrhodes5150 | 0:8a420ac6394e | 213 | serial.printf("%lf\r\n", Device.deviceConfig.msSamplePeriod); |
jrhodes5150 | 0:8a420ac6394e | 214 | return; |
jrhodes5150 | 0:8a420ac6394e | 215 | } |
jrhodes5150 | 0:8a420ac6394e | 216 | |
jrhodes5150 | 0:8a420ac6394e | 217 | serial.printf("Unrecognized command: %s\r\n", line); |
jrhodes5150 | 0:8a420ac6394e | 218 | } |
jrhodes5150 | 0:8a420ac6394e | 219 | |
jrhodes5150 | 0:8a420ac6394e | 220 | bool CMSerial::CommandIs(const char *command) |
jrhodes5150 | 0:8a420ac6394e | 221 | { |
jrhodes5150 | 0:8a420ac6394e | 222 | int length = strlen(command); |
jrhodes5150 | 0:8a420ac6394e | 223 | if (strncmp(command, line, length) != 0) |
jrhodes5150 | 0:8a420ac6394e | 224 | return false; |
jrhodes5150 | 0:8a420ac6394e | 225 | if (line[length]!=0 && line[length]!=' ') |
jrhodes5150 | 0:8a420ac6394e | 226 | return false; |
jrhodes5150 | 0:8a420ac6394e | 227 | return true; |
jrhodes5150 | 0:8a420ac6394e | 228 | } |
jrhodes5150 | 0:8a420ac6394e | 229 | |
jrhodes5150 | 0:8a420ac6394e | 230 | double CMSerial::GetNumericArgument(int index, double defaultValue) |
jrhodes5150 | 0:8a420ac6394e | 231 | { |
jrhodes5150 | 0:8a420ac6394e | 232 | // for the moment we just require that arguments be separated by a single space |
jrhodes5150 | 0:8a420ac6394e | 233 | const char *start = line; |
jrhodes5150 | 0:8a420ac6394e | 234 | for (int i=0; i<index; ++i) |
jrhodes5150 | 0:8a420ac6394e | 235 | { |
jrhodes5150 | 0:8a420ac6394e | 236 | start = strchr(start, ' '); |
jrhodes5150 | 0:8a420ac6394e | 237 | if (start == NULL) |
jrhodes5150 | 0:8a420ac6394e | 238 | return defaultValue; |
jrhodes5150 | 0:8a420ac6394e | 239 | ++start; |
jrhodes5150 | 0:8a420ac6394e | 240 | } |
jrhodes5150 | 0:8a420ac6394e | 241 | |
jrhodes5150 | 0:8a420ac6394e | 242 | double result; |
jrhodes5150 | 0:8a420ac6394e | 243 | if (1 != sscanf(start, "%lf", &result)) |
jrhodes5150 | 0:8a420ac6394e | 244 | return defaultValue; |
jrhodes5150 | 0:8a420ac6394e | 245 | return result; |
jrhodes5150 | 0:8a420ac6394e | 246 | } |
jrhodes5150 | 0:8a420ac6394e | 247 |