スマートコンセント(富士通 FX-5204PS)をIEEE1888 StorageにWRITEするサンプルプログラムです。

Dependencies:   EthernetInterface FiapV2 HTTPClientForSOAP NTPClient TextLCD mbed-rtos mbed spxml

Fork of BlueUSB_f by Yasushi TAUCHI

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers usps.cpp Source File

usps.cpp

00001 #include "mbed.h"
00002 #include "USBHost.h"
00003 #include "Utils.h"
00004 
00005 u8 ms_buf[0x1A];  // USPS Streaming Buffer
00006 int nUSPS;
00007 int dUSPS[10];
00008 int eUSPS[10];
00009 int SerialNo[10];
00010 float TempData[10];
00011 float VoltData[10];
00012 float FreqData[10];
00013 float WattData1[10],WattData2[10],WattData3[10],WattData4[10];
00014 void usps_cmd(int device,int cmd,int val,int len,int evt);
00015 void usps_measurement_mode(int device);
00016 void USPS_Refresh();
00017 
00018 bool usps_debug=true;
00019 
00020 /* protocol */
00021 #define USPS_CMD_START        0x01
00022 #define USPS_CMD_VALUE        0x20
00023 #define USPS_CMD_GET_FIRMWARE    0xc0
00024 #define USPS_CMD_GET_SERIAL    0xc1
00025 #define USPS_CMD_GET_VOLTAGE    0xb0
00026 #define USPS_CMD_GET_TEMP    0xb4
00027 #define USPS_CMD_GET_FREQ    0xa1
00028 
00029 #define USPS_MODE_WATTAGE    0x10
00030 #define USPS_MODE_CURRENT    0x30
00031 
00032 #define EVENT_GET_FIRMWARE 0x11
00033 #define EVENT_GET_SERIAL   0x12
00034 #define EVENT_GET_TEMP   0x21
00035 #define EVENT_GET_VOLT   0x22
00036 #define EVENT_GET_FREQ   0x23
00037 #define EVENT_GET_POWER   0x24
00038 #define EVENT_START   0x13
00039 #define EVENT_VALUE   0x14
00040 
00041 float temp;
00042 float volt;
00043 float freq;
00044 float power1,power2,power3,power4;
00045 unsigned char cmdFlag;
00046 bool initFlag;
00047 void InitUSPS()
00048 {
00049     int i;
00050     nUSPS=0;
00051     for(i=0; i<10; i++)SerialNo[i]=0;
00052     initFlag=false;
00053 }
00054 
00055 void UspsEventCallback(int device, int endpoint, int status, u8* data, int len, void* userData)
00056 {
00057     int i,i1,i2,sn;
00058     int Flag=0;
00059     if(status!=0) {
00060         i1=0;
00061         if(usps_debug)     printf("USPS Callback Status %d \n\r",status);
00062         for(i=0; i<nUSPS; i++) {
00063             if(dUSPS[i]==device) {
00064                 i1=i;
00065                 Flag=1;
00066             }
00067         }
00068         if(Flag==1) {
00069             for(i=i1+1; i<nUSPS; i++) {
00070                 dUSPS[i-1]=dUSPS[i];
00071                 eUSPS[i-1]=eUSPS[i];
00072                 SerialNo[i-1]=SerialNo[i];
00073                 TempData[i-1]=TempData[i];
00074                 VoltData[i-1]=VoltData[i];
00075                 FreqData[i-1]=FreqData[i];
00076                 WattData1[i-1]=WattData1[i];
00077                 WattData2[i-1]=WattData2[i];
00078                 WattData3[i-1]=WattData3[i];
00079                 WattData4[i-1]=WattData4[i];
00080             }
00081             nUSPS--;
00082         }
00083         return;
00084     }
00085     i2=(int)userData;
00086     switch(i2) {
00087         case EVENT_GET_FIRMWARE:
00088             if(usps_debug) printf("USPS Device#%X Firmware VOL%X REL%X\r\n",device,data[0],data[1]);
00089             break;
00090 
00091         case EVENT_GET_SERIAL:
00092             i1=0;
00093             sn=data[0]<<16|data[1]<<8|data[2];
00094             if(usps_debug) printf("USPS Device#%x SerialNo %X \r\n",device,sn);
00095             for(i=0; i<nUSPS; i++) {
00096                 if(SerialNo[i]==sn) {
00097                     i1=i;
00098                     Flag=1;
00099                 }
00100             }
00101             if(Flag==1) {
00102                 for(i=i1+1; i<nUSPS; i++) {
00103                     dUSPS[i-1]=dUSPS[i];
00104                     eUSPS[i-1]=eUSPS[i];
00105                     SerialNo[i-1]=SerialNo[i];
00106                     TempData[i-1]=TempData[i];
00107                     VoltData[i-1]=VoltData[i];
00108                     FreqData[i-1]=FreqData[i];
00109                     WattData1[i-1]=WattData1[i];
00110                     WattData2[i-1]=WattData2[i];
00111                     WattData3[i-1]=WattData3[i];
00112                     WattData4[i-1]=WattData4[i];
00113                 }
00114                 nUSPS--;
00115             }
00116             for(i=0; i<nUSPS; i++) {
00117                 if(dUSPS[i]==device)SerialNo[i]=sn;
00118             }
00119             for(i=0; i<nUSPS; i++) {
00120                 if(usps_debug)     printf( "Serial(%d) : %X \n\r",i,SerialNo[i]);
00121             }
00122             break;
00123 
00124         case EVENT_GET_TEMP:
00125             i=data[1]<<8|data[0];
00126             temp=i/100.0;
00127             if(usps_debug)  printf("USPS Device#%x Temp %5.2f \r\n",device,temp);
00128             for(i=0; i<nUSPS; i++) {
00129                 if(dUSPS[i]==device)TempData[i]=temp;
00130             }
00131             break;
00132 
00133         case EVENT_GET_VOLT:
00134             volt=data[0];
00135             if(usps_debug)   printf("USPS Device#%x Volt %6.2f \r\n",device,volt);
00136             for(i=0; i<nUSPS; i++) {
00137                 if(dUSPS[i]==device)VoltData[i]=volt;
00138             }
00139             break;
00140 
00141         case EVENT_GET_FREQ:
00142             i=data[1]<<8|data[0];
00143             freq=2000000.0/i;
00144             if(usps_debug)  printf("USPS Device#%x Freq %5.2f \r\n",device,freq);
00145             for(i=0; i<nUSPS; i++) {
00146                 if(dUSPS[i]==device)FreqData[i]=freq;
00147             }
00148             break;
00149 
00150         case EVENT_GET_POWER:
00151             power4=(unsigned short)(data[0xf]<<8|data[0xe]);
00152             power3=(unsigned short)(data[0xd]<<8|data[0xc]);
00153             power2=(unsigned short)(data[0xb]<<8|data[0xa]);
00154             power1=(unsigned short)(data[0x9]<<8|data[0x8]);
00155             if(usps_debug)  printf("USPS Device#%x:Power1 %5.0f[W]:Power2 %5.0f[W]:Power3 %5.0f[W]:Power4 %5.0f[W]\r\n",device,power1,power2,power3,power4);
00156             for(i=0; i<nUSPS; i++) {
00157                 if(dUSPS[i]==device) {
00158                     WattData1[i]=power1;
00159                     WattData2[i]=power2;
00160                     WattData3[i]=power3;
00161                     WattData4[i]=power4;
00162                 }
00163             }
00164             break;
00165 
00166         default:
00167             if(usps_debug)   printf("usps response \r\n");
00168             if(usps_debug)  printf("USPS %02X %02X %02X \r\n",device,status,len);
00169             if(usps_debug)  printfBytes("",data,len);
00170             break;
00171     }
00172 }
00173 
00174 //  Add Usps Interface
00175 void USPS_Refresh()
00176 {
00177     static int i=0;
00178     static int k=0;
00179     u8* dst = ms_buf;
00180     //for (i=0; i<nUSPS; i++) {
00181     if(nUSPS==0)return;
00182     if(initFlag==true) {
00183         for(i=0; i<nUSPS; i++) {
00184             if(SerialNo[i]==0) {
00185                 usps_cmd(dUSPS[i],USPS_CMD_GET_SERIAL  ,0,3,EVENT_GET_SERIAL);
00186                 usps_measurement_mode(dUSPS[i]);
00187             }
00188         }
00189         k=0;
00190         for(i=0; i<nUSPS; i++)if(SerialNo[i]==0)k=1;
00191         if(k==0)initFlag=false;
00192     } else {
00193         if(i==nUSPS)i=0;
00194         switch(k) {
00195             case 0:
00196                 usps_cmd(dUSPS[i],USPS_CMD_GET_TEMP ,0,2,EVENT_GET_TEMP);
00197                 k++;
00198                 break;
00199             case 1:
00200                 usps_cmd(dUSPS[i],USPS_CMD_GET_VOLTAGE, 0, 1,EVENT_GET_VOLT);
00201                 k++;
00202                 break;
00203             case 2:
00204                 usps_cmd(dUSPS[i],USPS_CMD_GET_FREQ, 0, 8,EVENT_GET_FREQ);
00205                 k++;
00206                 break;
00207             case 3:
00208                 USBInterruptTransfer(dUSPS[i], eUSPS[i], dst,0x10, UspsEventCallback, (void*)EVENT_GET_POWER);
00209                 k=0;
00210                 i++;
00211                 break;
00212         }
00213     }
00214     //}
00215 }
00216 
00217 void AddUspsInterface(int device, InterfaceDescriptor* id, EndpointDescriptor* ed,int len)
00218 {
00219     if ((ed->bmAttributes & 3) != ENDPOINT_INTERRUPT || !(ed->bEndpointAddress & 0x80))
00220         return;
00221     dUSPS[nUSPS]=device;
00222     eUSPS[nUSPS]=ed->bEndpointAddress;
00223     SerialNo[nUSPS]=0;
00224     nUSPS++;
00225     if(usps_debug)  printf("No of USPS :%d\n\r",nUSPS);
00226     initFlag=true;
00227 //    usps_cmd(device,USPS_CMD_GET_FIRMWARE ,0,2,EVENT_GET_FIRMWARE);
00228 //    usps_cmd(device,USPS_CMD_GET_SERIAL  ,0,3,EVENT_GET_SERIAL);
00229 //    usps_measurement_mode(device);
00230 }
00231 
00232 void usps_measurement_mode(int device)
00233 {
00234     u8* dst = ms_buf;
00235     USBControlTransfer(device, 0x40, USPS_CMD_START ,0, 0, dst, 0,UspsEventCallback,(void*)EVENT_START); //UT_Vendor_Write
00236     USBControlTransfer(device, 0x40, USPS_CMD_VALUE ,USPS_MODE_WATTAGE , 0, dst, 0,UspsEventCallback,(void*)EVENT_VALUE); //UT_Vendor_Write
00237 }
00238 
00239 void usps_cmd(int device,int cmd,int val,int len,int evt)
00240 {
00241     int i;
00242     u8* dst = ms_buf;
00243     // printf("req\n\r");
00244     i= USBControlTransfer(device, 0xc0,  cmd,val, 0, dst, len,UspsEventCallback,(void*)evt);
00245     if(i!=-100) printf("status : %d \r\n",i);
00246 }
00247 //  Detected USPS Device
00248 int OnUspsInsert(int device)
00249 {
00250     u8 buffer[255];
00251     int err = GetDescriptor(device,DESCRIPTOR_TYPE_CONFIGURATION,0,buffer,255);
00252     if (err < 0)
00253         return err;
00254     int len = buffer[2] | (buffer[3] << 8);
00255     u8* d = buffer;
00256     u8* end = d + len;
00257 
00258     if(usps_debug) printf("OnUspsInsert %02X %02X\r\n",device,len); //
00259     //printfBytes("  -->",d,len);
00260     while (d < end) {
00261         if (d[1] == DESCRIPTOR_TYPE_INTERFACE) {
00262             InterfaceDescriptor* id = (InterfaceDescriptor*)d;
00263             d += d[0];
00264             while (d < end) {
00265                 if (d[1] == DESCRIPTOR_TYPE_ENDPOINT) {
00266                     if(usps_debug)  printfBytes("Usps Endpoint",d,d[0]);
00267                     AddUspsInterface(device,id,(EndpointDescriptor*)d,d[4]);
00268                 }
00269                 d += d[0];
00270             }
00271         }
00272         d += d[0];
00273     }
00274     return 0;
00275 }