K22F Power Conditioner

Dependencies:   NetworkServices W5500Interface

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?

UserRevisionLine numberNew 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