スマートコンセント(富士通 FX-5204PS)をIEEE1888 StorageにWRITEするサンプルプログラムです。
Dependencies: EthernetInterface FiapV2 HTTPClientForSOAP NTPClient TextLCD mbed-rtos mbed spxml
Fork of BlueUSB_f by
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 }
Generated on Tue Jul 12 2022 22:55:45 by 1.7.2