K22F Power Conditioner
Dependencies: NetworkServices W5500Interface
main.cpp@2:ab7e8b9c7903, 2017-06-15 (annotated)
- Committer:
- dgriffin65
- Date:
- Thu Jun 15 20:27:02 2017 +0000
- Revision:
- 2:ab7e8b9c7903
- Parent:
- 1:f857c10c3cd2
Added HTTP server
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
amccartney | 0:9d0945119ba4 | 1 | #include "mbed.h" |
dgriffin65 | 2:ab7e8b9c7903 | 2 | #include "W5500Interface.h" |
dgriffin65 | 2:ab7e8b9c7903 | 3 | #include "Websocket.h" |
dgriffin65 | 2:ab7e8b9c7903 | 4 | #include "SNTPClient.h" |
dgriffin65 | 2:ab7e8b9c7903 | 5 | #include "DHCPClient.h" |
dgriffin65 | 2:ab7e8b9c7903 | 6 | #include "DNSClient.h" |
dgriffin65 | 2:ab7e8b9c7903 | 7 | #include "HTTPD.h" |
amccartney | 1:f857c10c3cd2 | 8 | #include "config.h" |
amccartney | 0:9d0945119ba4 | 9 | |
dgriffin65 | 2:ab7e8b9c7903 | 10 | |
dgriffin65 | 2:ab7e8b9c7903 | 11 | //** prototypes **************************************************************** |
dgriffin65 | 2:ab7e8b9c7903 | 12 | int getCuspp(const char* cmd, char* out); |
dgriffin65 | 2:ab7e8b9c7903 | 13 | |
dgriffin65 | 2:ab7e8b9c7903 | 14 | //****************************************************************************** |
dgriffin65 | 2:ab7e8b9c7903 | 15 | |
amccartney | 1:f857c10c3cd2 | 16 | #define READBUFFERSIZE (32) |
amccartney | 1:f857c10c3cd2 | 17 | |
amccartney | 1:f857c10c3cd2 | 18 | RawSerial pc(USBTX, USBRX); |
dgriffin65 | 2:ab7e8b9c7903 | 19 | char pcRxBuffer[32]; //port C RX Buffer |
dgriffin65 | 2:ab7e8b9c7903 | 20 | |
amccartney | 0:9d0945119ba4 | 21 | DigitalIn sw2(SW2); |
amccartney | 0:9d0945119ba4 | 22 | DigitalIn sw3(SW3); |
amccartney | 1:f857c10c3cd2 | 23 | InterruptIn zeroCross(A2);//Arduino A2 |
amccartney | 1:f857c10c3cd2 | 24 | Timer halfCycle; |
amccartney | 1:f857c10c3cd2 | 25 | Ticker freqGen; |
amccartney | 1:f857c10c3cd2 | 26 | Ticker sampler; |
amccartney | 1:f857c10c3cd2 | 27 | DigitalOut do1(D7);//Arduino D7 |
amccartney | 1:f857c10c3cd2 | 28 | DigitalOut do2(D6);//Arduino D6 |
amccartney | 1:f857c10c3cd2 | 29 | AnalogIn Vrms(A0); |
amccartney | 1:f857c10c3cd2 | 30 | AnalogIn Arms(A1); |
amccartney | 1:f857c10c3cd2 | 31 | //LocalFileSystem local("local"); |
amccartney | 1:f857c10c3cd2 | 32 | //FlashIAP flash; |
amccartney | 0:9d0945119ba4 | 33 | |
dgriffin65 | 2:ab7e8b9c7903 | 34 | int flip = 0; |
dgriffin65 | 2:ab7e8b9c7903 | 35 | int halfPeriod = 16600; |
dgriffin65 | 2:ab7e8b9c7903 | 36 | float freq = 60; |
dgriffin65 | 2:ab7e8b9c7903 | 37 | float period = 0; |
amccartney | 1:f857c10c3cd2 | 38 | double setFreq = 50.00; |
amccartney | 1:f857c10c3cd2 | 39 | double periodFreqGen; |
dgriffin65 | 2:ab7e8b9c7903 | 40 | float Vsample[32]; |
dgriffin65 | 2:ab7e8b9c7903 | 41 | float Asample[32]; |
dgriffin65 | 2:ab7e8b9c7903 | 42 | int sample = 0; |
dgriffin65 | 2:ab7e8b9c7903 | 43 | int sampleMax = 0; |
dgriffin65 | 2:ab7e8b9c7903 | 44 | float Vhold[32]; |
dgriffin65 | 2:ab7e8b9c7903 | 45 | float Ahold[32]; |
dgriffin65 | 2:ab7e8b9c7903 | 46 | int cycleFlag = 0; |
amccartney | 1:f857c10c3cd2 | 47 | double VsumSq = 0; |
amccartney | 1:f857c10c3cd2 | 48 | double Vmean = 0; |
amccartney | 1:f857c10c3cd2 | 49 | double Vroot = 0; |
amccartney | 1:f857c10c3cd2 | 50 | double AsumSq = 0; |
amccartney | 1:f857c10c3cd2 | 51 | double Amean = 0; |
amccartney | 1:f857c10c3cd2 | 52 | double Aroot = 0; |
dgriffin65 | 2:ab7e8b9c7903 | 53 | float VA; |
dgriffin65 | 2:ab7e8b9c7903 | 54 | int PercentLoad = 0; |
dgriffin65 | 2:ab7e8b9c7903 | 55 | |
amccartney | 1:f857c10c3cd2 | 56 | char k = 0; |
amccartney | 1:f857c10c3cd2 | 57 | char c; |
dgriffin65 | 2:ab7e8b9c7903 | 58 | int i; |
dgriffin65 | 2:ab7e8b9c7903 | 59 | int j; |
amccartney | 0:9d0945119ba4 | 60 | |
dgriffin65 | 2:ab7e8b9c7903 | 61 | //***************************************************************************** |
dgriffin65 | 2:ab7e8b9c7903 | 62 | |
dgriffin65 | 2:ab7e8b9c7903 | 63 | //** NETWORKING *************************************************************** |
dgriffin65 | 2:ab7e8b9c7903 | 64 | |
dgriffin65 | 2:ab7e8b9c7903 | 65 | DHCPClient dhcp; |
dgriffin65 | 2:ab7e8b9c7903 | 66 | DNSClient dns; |
dgriffin65 | 2:ab7e8b9c7903 | 67 | HTTPD httpd; |
dgriffin65 | 2:ab7e8b9c7903 | 68 | NetworkStack* ns; |
dgriffin65 | 2:ab7e8b9c7903 | 69 | |
dgriffin65 | 2:ab7e8b9c7903 | 70 | void httpdJson (int id) { |
dgriffin65 | 2:ab7e8b9c7903 | 71 | httpd.hprintf(id, "{\n"); |
dgriffin65 | 2:ab7e8b9c7903 | 72 | httpd.hprintf(id, "\"UID.MANUF\":\"%s\",\n", "AMETEK-POWERVAR"); |
dgriffin65 | 2:ab7e8b9c7903 | 73 | httpd.hprintf(id, "\"UID.MODEL\":\"%s\",\n", MODEL); |
dgriffin65 | 2:ab7e8b9c7903 | 74 | httpd.hprintf(id, "\"UID.ULMODEL\":\"%s\",\n", "ABC"); |
dgriffin65 | 2:ab7e8b9c7903 | 75 | httpd.hprintf(id, "\"UID.SERNUM\":\"%s\",\n", SERIALNO); |
dgriffin65 | 2:ab7e8b9c7903 | 76 | httpd.hprintf(id, "\"UID.FAMILY\":\"%s\",\n", "Power Conditioner"); |
dgriffin65 | 2:ab7e8b9c7903 | 77 | httpd.hprintf(id, "\"OUT.FREQ\":%3.1f,\n", freq); |
dgriffin65 | 2:ab7e8b9c7903 | 78 | httpd.hprintf(id, "\"OUT.VOLT\":%3.1f,\n", Vroot); |
dgriffin65 | 2:ab7e8b9c7903 | 79 | httpd.hprintf(id, "\"OUT.AMP\":%3.1f,\n", Aroot); |
dgriffin65 | 2:ab7e8b9c7903 | 80 | httpd.hprintf(id, "\"OUT.PWR\":%.0f,\n", VA); |
dgriffin65 | 2:ab7e8b9c7903 | 81 | httpd.hprintf(id, "\"OUT.PERCNT\":%d,\n", PercentLoad); |
dgriffin65 | 2:ab7e8b9c7903 | 82 | httpd.hprintf(id, "\"SYS.INVOLT\":%d,\n", NOMV); |
dgriffin65 | 2:ab7e8b9c7903 | 83 | httpd.hprintf(id, "\"SYS.INFRQ\":%d,\n", NOMF); |
dgriffin65 | 2:ab7e8b9c7903 | 84 | httpd.hprintf(id, "\"SYS.OUTVLT\":%d,\n", NOMV); |
dgriffin65 | 2:ab7e8b9c7903 | 85 | httpd.hprintf(id, "\"SYS.OUTFRQ\":%d,\n", NOMF); |
dgriffin65 | 2:ab7e8b9c7903 | 86 | httpd.hprintf(id, "\"SYS.OUTVA\":%d,\n", NOMVA); |
dgriffin65 | 2:ab7e8b9c7903 | 87 | httpd.hprintf(id, "\"SYS.OUTPWR\":%d,\n", NOMVA); |
dgriffin65 | 2:ab7e8b9c7903 | 88 | httpd.hprintf(id, "}\n"); |
dgriffin65 | 2:ab7e8b9c7903 | 89 | } |
dgriffin65 | 2:ab7e8b9c7903 | 90 | |
dgriffin65 | 2:ab7e8b9c7903 | 91 | void httpdCuspp (int id) { |
dgriffin65 | 2:ab7e8b9c7903 | 92 | const char* qs = httpd.getQueryString(id); |
dgriffin65 | 2:ab7e8b9c7903 | 93 | char out[256]; |
dgriffin65 | 2:ab7e8b9c7903 | 94 | |
dgriffin65 | 2:ab7e8b9c7903 | 95 | if (qs == NULL) { |
dgriffin65 | 2:ab7e8b9c7903 | 96 | getCuspp("PID.FORMAT", out); |
dgriffin65 | 2:ab7e8b9c7903 | 97 | httpd.hprintf(id, out); |
dgriffin65 | 2:ab7e8b9c7903 | 98 | |
dgriffin65 | 2:ab7e8b9c7903 | 99 | getCuspp("PID", out); |
dgriffin65 | 2:ab7e8b9c7903 | 100 | httpd.hprintf(id, out); |
dgriffin65 | 2:ab7e8b9c7903 | 101 | |
dgriffin65 | 2:ab7e8b9c7903 | 102 | getCuspp("UID.FORMAT", out); |
dgriffin65 | 2:ab7e8b9c7903 | 103 | httpd.hprintf(id, out); |
dgriffin65 | 2:ab7e8b9c7903 | 104 | |
dgriffin65 | 2:ab7e8b9c7903 | 105 | getCuspp("UID", out); |
dgriffin65 | 2:ab7e8b9c7903 | 106 | httpd.hprintf(id, out); |
dgriffin65 | 2:ab7e8b9c7903 | 107 | |
dgriffin65 | 2:ab7e8b9c7903 | 108 | getCuspp("OUT.FORMAT", out); |
dgriffin65 | 2:ab7e8b9c7903 | 109 | httpd.hprintf(id, out); |
dgriffin65 | 2:ab7e8b9c7903 | 110 | |
dgriffin65 | 2:ab7e8b9c7903 | 111 | getCuspp("OUT", out); |
dgriffin65 | 2:ab7e8b9c7903 | 112 | httpd.hprintf(id, out); |
dgriffin65 | 2:ab7e8b9c7903 | 113 | |
dgriffin65 | 2:ab7e8b9c7903 | 114 | getCuspp("SYS.FORMAT", out); |
dgriffin65 | 2:ab7e8b9c7903 | 115 | httpd.hprintf(id, out); |
dgriffin65 | 2:ab7e8b9c7903 | 116 | |
dgriffin65 | 2:ab7e8b9c7903 | 117 | getCuspp("SYS", out); |
dgriffin65 | 2:ab7e8b9c7903 | 118 | httpd.hprintf(id, out); |
dgriffin65 | 2:ab7e8b9c7903 | 119 | |
dgriffin65 | 2:ab7e8b9c7903 | 120 | return; |
dgriffin65 | 2:ab7e8b9c7903 | 121 | } |
dgriffin65 | 2:ab7e8b9c7903 | 122 | |
dgriffin65 | 2:ab7e8b9c7903 | 123 | if (!strcmp(qs, "JSON")) { |
dgriffin65 | 2:ab7e8b9c7903 | 124 | httpdJson(id); |
dgriffin65 | 2:ab7e8b9c7903 | 125 | } else { |
dgriffin65 | 2:ab7e8b9c7903 | 126 | getCuspp(qs, out); |
dgriffin65 | 2:ab7e8b9c7903 | 127 | httpd.hprintf(id, out); |
dgriffin65 | 2:ab7e8b9c7903 | 128 | } |
dgriffin65 | 2:ab7e8b9c7903 | 129 | } |
dgriffin65 | 2:ab7e8b9c7903 | 130 | |
dgriffin65 | 2:ab7e8b9c7903 | 131 | int startNetworking() { |
dgriffin65 | 2:ab7e8b9c7903 | 132 | |
dgriffin65 | 2:ab7e8b9c7903 | 133 | #if defined(TARGET_K22F) |
dgriffin65 | 2:ab7e8b9c7903 | 134 | SPI *spi = new SPI(D11, D12, D13); // mosi, miso, sclk |
dgriffin65 | 2:ab7e8b9c7903 | 135 | //eth = new W5500Interface(D11, D12, D13, D10, D9); |
dgriffin65 | 2:ab7e8b9c7903 | 136 | W5500Interface* eth = new W5500Interface(spi, D10, D9);//D10 CS, D9 Reset |
dgriffin65 | 2:ab7e8b9c7903 | 137 | ns = eth; |
dgriffin65 | 2:ab7e8b9c7903 | 138 | |
dgriffin65 | 2:ab7e8b9c7903 | 139 | spi->format(8,0); // 8bit, mode 0 |
dgriffin65 | 2:ab7e8b9c7903 | 140 | spi->frequency(7000000); // 7MHz |
dgriffin65 | 2:ab7e8b9c7903 | 141 | wait(1); // 1 second for stable state |
dgriffin65 | 2:ab7e8b9c7903 | 142 | #endif |
dgriffin65 | 2:ab7e8b9c7903 | 143 | |
dgriffin65 | 2:ab7e8b9c7903 | 144 | printf("\r\n"); |
dgriffin65 | 2:ab7e8b9c7903 | 145 | printf("DHCP Started, waiting for IP...\r\n"); |
dgriffin65 | 2:ab7e8b9c7903 | 146 | int timeout_ms = 15*1000; |
dgriffin65 | 2:ab7e8b9c7903 | 147 | int err = dhcp.setup(eth, timeout_ms); |
dgriffin65 | 2:ab7e8b9c7903 | 148 | if (err == (-1)) { |
dgriffin65 | 2:ab7e8b9c7903 | 149 | printf("Timeout.\n"); |
dgriffin65 | 2:ab7e8b9c7903 | 150 | return -1; |
dgriffin65 | 2:ab7e8b9c7903 | 151 | } |
dgriffin65 | 2:ab7e8b9c7903 | 152 | |
dgriffin65 | 2:ab7e8b9c7903 | 153 | printf("Connected, IP: %d.%d.%d.%d\r\n", dhcp.yiaddr[0], dhcp.yiaddr[1], dhcp.yiaddr[2], dhcp.yiaddr[3]); |
dgriffin65 | 2:ab7e8b9c7903 | 154 | |
dgriffin65 | 2:ab7e8b9c7903 | 155 | char ip[24], gateway[24], netmask[24], dnsaddr[24]; |
dgriffin65 | 2:ab7e8b9c7903 | 156 | sprintf(ip, "%d.%d.%d.%d", dhcp.yiaddr[0], dhcp.yiaddr[1], dhcp.yiaddr[2], dhcp.yiaddr[3]); |
dgriffin65 | 2:ab7e8b9c7903 | 157 | sprintf(gateway, "%d.%d.%d.%d", dhcp.gateway[0], dhcp.gateway[1], dhcp.gateway[2], dhcp.gateway[3]); |
dgriffin65 | 2:ab7e8b9c7903 | 158 | sprintf(netmask, "%d.%d.%d.%d", dhcp.netmask[0], dhcp.netmask[1], dhcp.netmask[2], dhcp.netmask[3]); |
dgriffin65 | 2:ab7e8b9c7903 | 159 | sprintf(dnsaddr, "%d.%d.%d.%d", dhcp.dnsaddr[0], dhcp.dnsaddr[1], dhcp.dnsaddr[2], dhcp.dnsaddr[3]); |
dgriffin65 | 2:ab7e8b9c7903 | 160 | |
dgriffin65 | 2:ab7e8b9c7903 | 161 | eth->init(ip, netmask, gateway); |
dgriffin65 | 2:ab7e8b9c7903 | 162 | eth->connect(); |
dgriffin65 | 2:ab7e8b9c7903 | 163 | printf("IP Address is %s\r\n", eth->get_ip_address()); |
dgriffin65 | 2:ab7e8b9c7903 | 164 | printf("DNS Address is %s\r\n", dnsaddr); |
dgriffin65 | 2:ab7e8b9c7903 | 165 | |
dgriffin65 | 2:ab7e8b9c7903 | 166 | dns.setup(eth); |
dgriffin65 | 2:ab7e8b9c7903 | 167 | dns.set_server(dnsaddr); |
dgriffin65 | 2:ab7e8b9c7903 | 168 | |
dgriffin65 | 2:ab7e8b9c7903 | 169 | httpd.attach ("/CUSPP", &httpdCuspp); |
dgriffin65 | 2:ab7e8b9c7903 | 170 | httpd.attach ("/cuspp", &httpdCuspp); |
dgriffin65 | 2:ab7e8b9c7903 | 171 | httpd.attach ("/JSON", &httpdJson); |
dgriffin65 | 2:ab7e8b9c7903 | 172 | httpd.attach ("/json", &httpdJson); |
dgriffin65 | 2:ab7e8b9c7903 | 173 | httpd.start(eth); |
dgriffin65 | 2:ab7e8b9c7903 | 174 | return 0; |
dgriffin65 | 2:ab7e8b9c7903 | 175 | } |
dgriffin65 | 2:ab7e8b9c7903 | 176 | |
dgriffin65 | 2:ab7e8b9c7903 | 177 | //** NETWORKING *************************************************************** |
dgriffin65 | 2:ab7e8b9c7903 | 178 | |
dgriffin65 | 2:ab7e8b9c7903 | 179 | Thread *_thdCuspp = NULL; |
dgriffin65 | 2:ab7e8b9c7903 | 180 | |
dgriffin65 | 2:ab7e8b9c7903 | 181 | void pcRxCallback() |
amccartney | 0:9d0945119ba4 | 182 | { |
dgriffin65 | 2:ab7e8b9c7903 | 183 | static char tempBuffer[32]; |
amccartney | 1:f857c10c3cd2 | 184 | do1 = 1; |
amccartney | 1:f857c10c3cd2 | 185 | c = pc.getc(); |
amccartney | 1:f857c10c3cd2 | 186 | do1 = 0; |
amccartney | 1:f857c10c3cd2 | 187 | tempBuffer[k] = c; |
amccartney | 1:f857c10c3cd2 | 188 | k++; |
amccartney | 1:f857c10c3cd2 | 189 | do1 = 1; |
amccartney | 1:f857c10c3cd2 | 190 | if ( c == '\n' ) |
amccartney | 1:f857c10c3cd2 | 191 | { |
amccartney | 1:f857c10c3cd2 | 192 | k = 0; |
dgriffin65 | 2:ab7e8b9c7903 | 193 | strncpy(pcRxBuffer,tempBuffer,sizeof(tempBuffer)); |
amccartney | 1:f857c10c3cd2 | 194 | memset(tempBuffer,0,sizeof(tempBuffer)); |
dgriffin65 | 2:ab7e8b9c7903 | 195 | //signal the CUSPP thread to process the command |
dgriffin65 | 2:ab7e8b9c7903 | 196 | if (_thdCuspp) _thdCuspp->signal_set(1); |
amccartney | 0:9d0945119ba4 | 197 | } |
dgriffin65 | 2:ab7e8b9c7903 | 198 | //pc.printf("\n%s\n", pcRxBuffer); //echo back to terminal |
amccartney | 1:f857c10c3cd2 | 199 | do1 = 0; |
amccartney | 0:9d0945119ba4 | 200 | } |
amccartney | 0:9d0945119ba4 | 201 | |
amccartney | 1:f857c10c3cd2 | 202 | void sampleTimer() |
amccartney | 1:f857c10c3cd2 | 203 | { |
amccartney | 1:f857c10c3cd2 | 204 | do2 = 1; |
amccartney | 1:f857c10c3cd2 | 205 | Asample[sample] = ( 1 / 0.34286 ) * 3.3 * Arms.read(); |
amccartney | 1:f857c10c3cd2 | 206 | Vsample[sample] = 64.7519 * 3.3 * Vrms.read(); |
amccartney | 1:f857c10c3cd2 | 207 | sample++; |
amccartney | 1:f857c10c3cd2 | 208 | if ( sample == 33 ) //In case there is no zero cross signal |
amccartney | 1:f857c10c3cd2 | 209 | { |
amccartney | 1:f857c10c3cd2 | 210 | sample = 0; |
amccartney | 1:f857c10c3cd2 | 211 | cycleFlag = 1; |
dgriffin65 | 2:ab7e8b9c7903 | 212 | } |
amccartney | 1:f857c10c3cd2 | 213 | do2 = 0; |
amccartney | 1:f857c10c3cd2 | 214 | } |
amccartney | 1:f857c10c3cd2 | 215 | |
amccartney | 1:f857c10c3cd2 | 216 | void startMeasFreq() |
amccartney | 0:9d0945119ba4 | 217 | { |
amccartney | 1:f857c10c3cd2 | 218 | halfCycle.start(); |
amccartney | 1:f857c10c3cd2 | 219 | sampler.detach(); |
amccartney | 1:f857c10c3cd2 | 220 | sampler.attach(&sampleTimer, (periodFreqGen / 32) ); |
amccartney | 1:f857c10c3cd2 | 221 | for (j = 0; j < 32; j++) { |
amccartney | 1:f857c10c3cd2 | 222 | Vhold[j] = Vsample[j]; |
amccartney | 1:f857c10c3cd2 | 223 | Ahold[j] = Asample[j]; |
amccartney | 1:f857c10c3cd2 | 224 | } |
amccartney | 1:f857c10c3cd2 | 225 | cycleFlag = 1; |
amccartney | 1:f857c10c3cd2 | 226 | sampleMax = sample; |
amccartney | 1:f857c10c3cd2 | 227 | sample = 0; //Reset the sample counter |
amccartney | 0:9d0945119ba4 | 228 | } |
amccartney | 0:9d0945119ba4 | 229 | |
amccartney | 1:f857c10c3cd2 | 230 | void stopMeasFreq() |
amccartney | 1:f857c10c3cd2 | 231 | { |
amccartney | 1:f857c10c3cd2 | 232 | halfPeriod = ( halfPeriod + halfCycle.read_us() ) /2; |
amccartney | 1:f857c10c3cd2 | 233 | halfCycle.stop(); |
amccartney | 1:f857c10c3cd2 | 234 | halfCycle.reset(); |
dgriffin65 | 2:ab7e8b9c7903 | 235 | } |
amccartney | 0:9d0945119ba4 | 236 | |
dgriffin65 | 2:ab7e8b9c7903 | 237 | int getCuspp(const char* cmd, char* out) { |
dgriffin65 | 2:ab7e8b9c7903 | 238 | if (strncmp (cmd, "PID.FORMAT",10) == 0) |
dgriffin65 | 2:ab7e8b9c7903 | 239 | { |
dgriffin65 | 2:ab7e8b9c7903 | 240 | sprintf(out, "PID.FORMAT=PROT;VER;UID;BAT;BTM;INP;OUT;ALM;TST;SET;PDU;SYS;OEM;BUZ\n"); |
dgriffin65 | 2:ab7e8b9c7903 | 241 | } else if (strncmp (cmd,"PID",3) == 0) |
dgriffin65 | 2:ab7e8b9c7903 | 242 | { |
dgriffin65 | 2:ab7e8b9c7903 | 243 | sprintf(out, "PID=CUSPP;1.13;1;0;0;0;1;0;0;0;0;1;0;0\n"); |
dgriffin65 | 2:ab7e8b9c7903 | 244 | } else if (strncmp (cmd, "UID.FORMAT",10) == 0) |
dgriffin65 | 2:ab7e8b9c7903 | 245 | { |
dgriffin65 | 2:ab7e8b9c7903 | 246 | sprintf(out, "UID.FORMAT=MANUF.N;MODEL.N;ULMODEL.N;FAMILY.N;SWVER.N;CSWVER.N;NAME.W;SERNUM.P;MFGDT.P\n"); |
dgriffin65 | 2:ab7e8b9c7903 | 247 | } else if (strncmp (cmd,"UID",3) == 0) |
dgriffin65 | 2:ab7e8b9c7903 | 248 | { |
dgriffin65 | 2:ab7e8b9c7903 | 249 | sprintf(out, "UID=AMETEK-POWERVAR;%s;ABC;PowerCond;0;0;%s;%s;20150715\n", MODEL, "Power Conditioner", SERIALNO); |
dgriffin65 | 2:ab7e8b9c7903 | 250 | } else if (strncmp (cmd,"SYS.FORMAT",10) == 0) |
dgriffin65 | 2:ab7e8b9c7903 | 251 | { |
dgriffin65 | 2:ab7e8b9c7903 | 252 | sprintf(out, "SYS.FORMAT=TOPLGY.N;INVOLT.N;INFRQ.N;INPHS.N;OUTVLT.N;OUTFRQ.N;OUTVA.N;OUTPWR.N;OUTPHS.N;HITEMP.W;OUTQTY.N;OVRLOD.W\n"); |
dgriffin65 | 2:ab7e8b9c7903 | 253 | } else if (strncmp (cmd,"SYS",3) == 0) |
dgriffin65 | 2:ab7e8b9c7903 | 254 | { |
dgriffin65 | 2:ab7e8b9c7903 | 255 | sprintf(out, "SYS=0;%d;%d;1;%d;%d.%d;%d;1;35;1;100\n", NOMV, NOMF, NOMV, NOMF, NOMVA, NOMVA); |
dgriffin65 | 2:ab7e8b9c7903 | 256 | } else if (strncmp (cmd,"OUT.FORMAT",10) == 0) |
dgriffin65 | 2:ab7e8b9c7903 | 257 | { |
dgriffin65 | 2:ab7e8b9c7903 | 258 | sprintf(out, "OUT.FORMAT=SOURCE.N;FREQ.N;VOLT.N;AMP.N;PWR.N;PERCNT.N\n"); |
dgriffin65 | 2:ab7e8b9c7903 | 259 | } else if (strncmp (cmd,"OUT",3) == 0) |
dgriffin65 | 2:ab7e8b9c7903 | 260 | { |
dgriffin65 | 2:ab7e8b9c7903 | 261 | sprintf(out, "OUT=0;%3.1f;%3.1f;%3.1f:%.0f;%d\n", freq, Vroot, Aroot, VA, PercentLoad); |
dgriffin65 | 2:ab7e8b9c7903 | 262 | } else if ((cmd[0]) != 0) |
dgriffin65 | 2:ab7e8b9c7903 | 263 | { |
dgriffin65 | 2:ab7e8b9c7903 | 264 | sprintf(out, "?\n"); |
dgriffin65 | 2:ab7e8b9c7903 | 265 | } else { |
dgriffin65 | 2:ab7e8b9c7903 | 266 | return -1; |
dgriffin65 | 2:ab7e8b9c7903 | 267 | } |
dgriffin65 | 2:ab7e8b9c7903 | 268 | return 0; |
dgriffin65 | 2:ab7e8b9c7903 | 269 | } |
amccartney | 0:9d0945119ba4 | 270 | |
dgriffin65 | 2:ab7e8b9c7903 | 271 | void thdCuspp () { |
dgriffin65 | 2:ab7e8b9c7903 | 272 | static char out[256]; |
amccartney | 1:f857c10c3cd2 | 273 | do1 = 0; |
amccartney | 1:f857c10c3cd2 | 274 | do2 = 0; |
amccartney | 1:f857c10c3cd2 | 275 | |
dgriffin65 | 2:ab7e8b9c7903 | 276 | //wait for the serial port to become readable |
amccartney | 1:f857c10c3cd2 | 277 | while(pc.readable()) { |
amccartney | 1:f857c10c3cd2 | 278 | //char e = pc.getc(); |
dgriffin65 | 2:ab7e8b9c7903 | 279 | wait(0.1); |
amccartney | 0:9d0945119ba4 | 280 | } |
amccartney | 0:9d0945119ba4 | 281 | |
dgriffin65 | 2:ab7e8b9c7903 | 282 | //initialize the rx buffer |
dgriffin65 | 2:ab7e8b9c7903 | 283 | memset(pcRxBuffer,0,sizeof(pcRxBuffer)); |
dgriffin65 | 2:ab7e8b9c7903 | 284 | |
dgriffin65 | 2:ab7e8b9c7903 | 285 | pc.attach(&pcRxCallback, pc.RxIrq);//Serial::RxIrq); |
amccartney | 1:f857c10c3cd2 | 286 | |
dgriffin65 | 2:ab7e8b9c7903 | 287 | //wait for a cuspp command |
dgriffin65 | 2:ab7e8b9c7903 | 288 | while(true) { |
dgriffin65 | 2:ab7e8b9c7903 | 289 | //wait for signal from interrupt handler |
dgriffin65 | 2:ab7e8b9c7903 | 290 | printf("thdCuspp waiting for a signal from interrupt handler\n"); |
dgriffin65 | 2:ab7e8b9c7903 | 291 | Thread::signal_wait(1); |
dgriffin65 | 2:ab7e8b9c7903 | 292 | printf("thdCuspp got a signal from interrupt handler\n"); |
dgriffin65 | 2:ab7e8b9c7903 | 293 | if (getCuspp(pcRxBuffer, out) == 0) { |
dgriffin65 | 2:ab7e8b9c7903 | 294 | pc.printf(out); |
dgriffin65 | 2:ab7e8b9c7903 | 295 | memset(pcRxBuffer,0,sizeof(pcRxBuffer)); |
dgriffin65 | 2:ab7e8b9c7903 | 296 | } |
dgriffin65 | 2:ab7e8b9c7903 | 297 | } |
dgriffin65 | 2:ab7e8b9c7903 | 298 | } |
dgriffin65 | 2:ab7e8b9c7903 | 299 | |
dgriffin65 | 2:ab7e8b9c7903 | 300 | int main() |
dgriffin65 | 2:ab7e8b9c7903 | 301 | { |
dgriffin65 | 2:ab7e8b9c7903 | 302 | //NVIC_SetPriority(PORTC_IRQn, 2); |
dgriffin65 | 2:ab7e8b9c7903 | 303 | pc.baud(115200); |
dgriffin65 | 2:ab7e8b9c7903 | 304 | pc.printf("\n\nFRDM-K22F Power Conditioner.\n\n"); |
dgriffin65 | 2:ab7e8b9c7903 | 305 | |
dgriffin65 | 2:ab7e8b9c7903 | 306 | //start the networking services |
dgriffin65 | 2:ab7e8b9c7903 | 307 | startNetworking(); |
dgriffin65 | 2:ab7e8b9c7903 | 308 | |
dgriffin65 | 2:ab7e8b9c7903 | 309 | //start the CUSPP protocol thread |
dgriffin65 | 2:ab7e8b9c7903 | 310 | _thdCuspp = new Thread(osPriorityNormal, 1024); |
dgriffin65 | 2:ab7e8b9c7903 | 311 | _thdCuspp->start(thdCuspp); |
dgriffin65 | 2:ab7e8b9c7903 | 312 | |
amccartney | 1:f857c10c3cd2 | 313 | wait(2.0); |
dgriffin65 | 2:ab7e8b9c7903 | 314 | |
amccartney | 1:f857c10c3cd2 | 315 | periodFreqGen = ( ( 1 / freq ) ); |
amccartney | 1:f857c10c3cd2 | 316 | sampler.attach(&sampleTimer, (periodFreqGen / 32) ); |
amccartney | 1:f857c10c3cd2 | 317 | zeroCross.fall(&startMeasFreq); |
amccartney | 1:f857c10c3cd2 | 318 | zeroCross.rise(&stopMeasFreq); |
dgriffin65 | 2:ab7e8b9c7903 | 319 | |
amccartney | 1:f857c10c3cd2 | 320 | while(1) |
amccartney | 1:f857c10c3cd2 | 321 | { |
amccartney | 1:f857c10c3cd2 | 322 | period = halfPeriod * 2; |
amccartney | 1:f857c10c3cd2 | 323 | freq = 0.5 * ( 1000000 / halfPeriod ); |
amccartney | 1:f857c10c3cd2 | 324 | |
amccartney | 1:f857c10c3cd2 | 325 | if (cycleFlag == 1) |
amccartney | 1:f857c10c3cd2 | 326 | { |
amccartney | 1:f857c10c3cd2 | 327 | for (i=0; i<32; i++) |
amccartney | 1:f857c10c3cd2 | 328 | { |
amccartney | 1:f857c10c3cd2 | 329 | VsumSq = VsumSq + (Vhold[i] * Vhold[i]); |
amccartney | 1:f857c10c3cd2 | 330 | AsumSq = AsumSq + (Ahold[i] * Ahold[i]); |
amccartney | 1:f857c10c3cd2 | 331 | } |
amccartney | 1:f857c10c3cd2 | 332 | Vmean = VsumSq / 32; |
amccartney | 1:f857c10c3cd2 | 333 | Amean = AsumSq / 32; |
amccartney | 1:f857c10c3cd2 | 334 | Vroot = ( Vroot + sqrt(Vmean) ) / 2; |
amccartney | 1:f857c10c3cd2 | 335 | Aroot = ( Aroot + sqrt(Amean) ) / 2; |
amccartney | 1:f857c10c3cd2 | 336 | VA = Vroot * Aroot; |
amccartney | 1:f857c10c3cd2 | 337 | PercentLoad = (int)(100 * ( VA / NOMVA )); |
amccartney | 1:f857c10c3cd2 | 338 | |
amccartney | 1:f857c10c3cd2 | 339 | VsumSq = 0; |
amccartney | 1:f857c10c3cd2 | 340 | AsumSq = 0; |
amccartney | 1:f857c10c3cd2 | 341 | cycleFlag = 0; |
amccartney | 1:f857c10c3cd2 | 342 | } |
dgriffin65 | 2:ab7e8b9c7903 | 343 | |
amccartney | 1:f857c10c3cd2 | 344 | wait(1.0); |
amccartney | 1:f857c10c3cd2 | 345 | } |
amccartney | 1:f857c10c3cd2 | 346 | } |
amccartney | 1:f857c10c3cd2 | 347 |