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

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

Fork of BlueUSB_f by Yasushi TAUCHI

スマートコンセント(富士通 FX-5204PS)をIEEE1888 StorageにWRITEするサンプルプログラムです。
USB HUBを使用して2台利用した例です。
表示のみは http://mbed.org/users/yueee_yt/code/BlueUSB_f/で公開しています。

BlueUSBより派生していますが、BluetoothとMass Storage Classは利用できません。

2台まで確認していますが、プログラム的には10台まで接続できるようにしています。
(RTOSとの整合により難しいかもしれません)

Committer:
yueee_yt
Date:
Sun Sep 30 12:45:05 2012 +0000
Revision:
6:08a406cd2726
Parent:
2:32a2d06f4fe2
2????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yueee_yt 1:3f2890d103fb 1 #include "mbed.h"
yueee_yt 1:3f2890d103fb 2 #include "USBHost.h"
yueee_yt 1:3f2890d103fb 3 #include "Utils.h"
yueee_yt 1:3f2890d103fb 4
yueee_yt 1:3f2890d103fb 5 u8 ms_buf[0x1A]; // USPS Streaming Buffer
yueee_yt 1:3f2890d103fb 6 int nUSPS;
yueee_yt 1:3f2890d103fb 7 int dUSPS[10];
yueee_yt 1:3f2890d103fb 8 int eUSPS[10];
yueee_yt 2:32a2d06f4fe2 9 int SerialNo[10];
yueee_yt 2:32a2d06f4fe2 10 float TempData[10];
yueee_yt 2:32a2d06f4fe2 11 float VoltData[10];
yueee_yt 2:32a2d06f4fe2 12 float FreqData[10];
yueee_yt 2:32a2d06f4fe2 13 float WattData1[10],WattData2[10],WattData3[10],WattData4[10];
yueee_yt 1:3f2890d103fb 14 void usps_cmd(int device,int cmd,int val,int len,int evt);
yueee_yt 1:3f2890d103fb 15 void usps_measurement_mode(int device);
yueee_yt 1:3f2890d103fb 16 void USPS_Refresh();
yueee_yt 1:3f2890d103fb 17
yueee_yt 1:3f2890d103fb 18 bool usps_debug=true;
yueee_yt 1:3f2890d103fb 19
yueee_yt 1:3f2890d103fb 20 /* protocol */
yueee_yt 1:3f2890d103fb 21 #define USPS_CMD_START 0x01
yueee_yt 1:3f2890d103fb 22 #define USPS_CMD_VALUE 0x20
yueee_yt 1:3f2890d103fb 23 #define USPS_CMD_GET_FIRMWARE 0xc0
yueee_yt 1:3f2890d103fb 24 #define USPS_CMD_GET_SERIAL 0xc1
yueee_yt 1:3f2890d103fb 25 #define USPS_CMD_GET_VOLTAGE 0xb0
yueee_yt 1:3f2890d103fb 26 #define USPS_CMD_GET_TEMP 0xb4
yueee_yt 1:3f2890d103fb 27 #define USPS_CMD_GET_FREQ 0xa1
yueee_yt 1:3f2890d103fb 28
yueee_yt 1:3f2890d103fb 29 #define USPS_MODE_WATTAGE 0x10
yueee_yt 1:3f2890d103fb 30 #define USPS_MODE_CURRENT 0x30
yueee_yt 1:3f2890d103fb 31
yueee_yt 1:3f2890d103fb 32 #define EVENT_GET_FIRMWARE 0x11
yueee_yt 1:3f2890d103fb 33 #define EVENT_GET_SERIAL 0x12
yueee_yt 1:3f2890d103fb 34 #define EVENT_GET_TEMP 0x21
yueee_yt 1:3f2890d103fb 35 #define EVENT_GET_VOLT 0x22
yueee_yt 1:3f2890d103fb 36 #define EVENT_GET_FREQ 0x23
yueee_yt 1:3f2890d103fb 37 #define EVENT_GET_POWER 0x24
yueee_yt 1:3f2890d103fb 38 #define EVENT_START 0x13
yueee_yt 1:3f2890d103fb 39 #define EVENT_VALUE 0x14
yueee_yt 1:3f2890d103fb 40
yueee_yt 1:3f2890d103fb 41 float temp;
yueee_yt 1:3f2890d103fb 42 float volt;
yueee_yt 1:3f2890d103fb 43 float freq;
yueee_yt 1:3f2890d103fb 44 float power1,power2,power3,power4;
yueee_yt 1:3f2890d103fb 45 unsigned char cmdFlag;
yueee_yt 2:32a2d06f4fe2 46 bool initFlag;
yueee_yt 1:3f2890d103fb 47 void InitUSPS()
yueee_yt 1:3f2890d103fb 48 {
yueee_yt 2:32a2d06f4fe2 49 int i;
yueee_yt 1:3f2890d103fb 50 nUSPS=0;
yueee_yt 2:32a2d06f4fe2 51 for(i=0; i<10; i++)SerialNo[i]=0;
yueee_yt 2:32a2d06f4fe2 52 initFlag=false;
yueee_yt 1:3f2890d103fb 53 }
yueee_yt 1:3f2890d103fb 54
yueee_yt 1:3f2890d103fb 55 void UspsEventCallback(int device, int endpoint, int status, u8* data, int len, void* userData)
yueee_yt 1:3f2890d103fb 56 {
yueee_yt 2:32a2d06f4fe2 57 int i,i1,i2,sn;
yueee_yt 1:3f2890d103fb 58 int Flag=0;
yueee_yt 1:3f2890d103fb 59 if(status!=0) {
yueee_yt 2:32a2d06f4fe2 60 i1=0;
yueee_yt 2:32a2d06f4fe2 61 if(usps_debug) printf("USPS Callback Status %d \n\r",status);
yueee_yt 1:3f2890d103fb 62 for(i=0; i<nUSPS; i++) {
yueee_yt 1:3f2890d103fb 63 if(dUSPS[i]==device) {
yueee_yt 1:3f2890d103fb 64 i1=i;
yueee_yt 1:3f2890d103fb 65 Flag=1;
yueee_yt 1:3f2890d103fb 66 }
yueee_yt 1:3f2890d103fb 67 }
yueee_yt 1:3f2890d103fb 68 if(Flag==1) {
yueee_yt 1:3f2890d103fb 69 for(i=i1+1; i<nUSPS; i++) {
yueee_yt 1:3f2890d103fb 70 dUSPS[i-1]=dUSPS[i];
yueee_yt 1:3f2890d103fb 71 eUSPS[i-1]=eUSPS[i];
yueee_yt 2:32a2d06f4fe2 72 SerialNo[i-1]=SerialNo[i];
yueee_yt 2:32a2d06f4fe2 73 TempData[i-1]=TempData[i];
yueee_yt 2:32a2d06f4fe2 74 VoltData[i-1]=VoltData[i];
yueee_yt 2:32a2d06f4fe2 75 FreqData[i-1]=FreqData[i];
yueee_yt 2:32a2d06f4fe2 76 WattData1[i-1]=WattData1[i];
yueee_yt 2:32a2d06f4fe2 77 WattData2[i-1]=WattData2[i];
yueee_yt 2:32a2d06f4fe2 78 WattData3[i-1]=WattData3[i];
yueee_yt 2:32a2d06f4fe2 79 WattData4[i-1]=WattData4[i];
yueee_yt 1:3f2890d103fb 80 }
yueee_yt 1:3f2890d103fb 81 nUSPS--;
yueee_yt 1:3f2890d103fb 82 }
yueee_yt 1:3f2890d103fb 83 return;
yueee_yt 1:3f2890d103fb 84 }
yueee_yt 2:32a2d06f4fe2 85 i2=(int)userData;
yueee_yt 2:32a2d06f4fe2 86 switch(i2) {
yueee_yt 1:3f2890d103fb 87 case EVENT_GET_FIRMWARE:
yueee_yt 2:32a2d06f4fe2 88 if(usps_debug) printf("USPS Device#%X Firmware VOL%X REL%X\r\n",device,data[0],data[1]);
yueee_yt 1:3f2890d103fb 89 break;
yueee_yt 2:32a2d06f4fe2 90
yueee_yt 1:3f2890d103fb 91 case EVENT_GET_SERIAL:
yueee_yt 2:32a2d06f4fe2 92 i1=0;
yueee_yt 2:32a2d06f4fe2 93 sn=data[0]<<16|data[1]<<8|data[2];
yueee_yt 2:32a2d06f4fe2 94 if(usps_debug) printf("USPS Device#%x SerialNo %X \r\n",device,sn);
yueee_yt 2:32a2d06f4fe2 95 for(i=0; i<nUSPS; i++) {
yueee_yt 2:32a2d06f4fe2 96 if(SerialNo[i]==sn) {
yueee_yt 2:32a2d06f4fe2 97 i1=i;
yueee_yt 2:32a2d06f4fe2 98 Flag=1;
yueee_yt 2:32a2d06f4fe2 99 }
yueee_yt 2:32a2d06f4fe2 100 }
yueee_yt 2:32a2d06f4fe2 101 if(Flag==1) {
yueee_yt 2:32a2d06f4fe2 102 for(i=i1+1; i<nUSPS; i++) {
yueee_yt 2:32a2d06f4fe2 103 dUSPS[i-1]=dUSPS[i];
yueee_yt 2:32a2d06f4fe2 104 eUSPS[i-1]=eUSPS[i];
yueee_yt 2:32a2d06f4fe2 105 SerialNo[i-1]=SerialNo[i];
yueee_yt 2:32a2d06f4fe2 106 TempData[i-1]=TempData[i];
yueee_yt 2:32a2d06f4fe2 107 VoltData[i-1]=VoltData[i];
yueee_yt 2:32a2d06f4fe2 108 FreqData[i-1]=FreqData[i];
yueee_yt 2:32a2d06f4fe2 109 WattData1[i-1]=WattData1[i];
yueee_yt 2:32a2d06f4fe2 110 WattData2[i-1]=WattData2[i];
yueee_yt 2:32a2d06f4fe2 111 WattData3[i-1]=WattData3[i];
yueee_yt 2:32a2d06f4fe2 112 WattData4[i-1]=WattData4[i];
yueee_yt 2:32a2d06f4fe2 113 }
yueee_yt 2:32a2d06f4fe2 114 nUSPS--;
yueee_yt 2:32a2d06f4fe2 115 }
yueee_yt 2:32a2d06f4fe2 116 for(i=0; i<nUSPS; i++) {
yueee_yt 2:32a2d06f4fe2 117 if(dUSPS[i]==device)SerialNo[i]=sn;
yueee_yt 2:32a2d06f4fe2 118 }
yueee_yt 2:32a2d06f4fe2 119 for(i=0; i<nUSPS; i++) {
yueee_yt 2:32a2d06f4fe2 120 if(usps_debug) printf( "Serial(%d) : %X \n\r",i,SerialNo[i]);
yueee_yt 2:32a2d06f4fe2 121 }
yueee_yt 1:3f2890d103fb 122 break;
yueee_yt 2:32a2d06f4fe2 123
yueee_yt 1:3f2890d103fb 124 case EVENT_GET_TEMP:
yueee_yt 1:3f2890d103fb 125 i=data[1]<<8|data[0];
yueee_yt 1:3f2890d103fb 126 temp=i/100.0;
yueee_yt 1:3f2890d103fb 127 if(usps_debug) printf("USPS Device#%x Temp %5.2f \r\n",device,temp);
yueee_yt 2:32a2d06f4fe2 128 for(i=0; i<nUSPS; i++) {
yueee_yt 2:32a2d06f4fe2 129 if(dUSPS[i]==device)TempData[i]=temp;
yueee_yt 2:32a2d06f4fe2 130 }
yueee_yt 1:3f2890d103fb 131 break;
yueee_yt 2:32a2d06f4fe2 132
yueee_yt 1:3f2890d103fb 133 case EVENT_GET_VOLT:
yueee_yt 1:3f2890d103fb 134 volt=data[0];
yueee_yt 2:32a2d06f4fe2 135 if(usps_debug) printf("USPS Device#%x Volt %6.2f \r\n",device,volt);
yueee_yt 2:32a2d06f4fe2 136 for(i=0; i<nUSPS; i++) {
yueee_yt 2:32a2d06f4fe2 137 if(dUSPS[i]==device)VoltData[i]=volt;
yueee_yt 2:32a2d06f4fe2 138 }
yueee_yt 1:3f2890d103fb 139 break;
yueee_yt 2:32a2d06f4fe2 140
yueee_yt 1:3f2890d103fb 141 case EVENT_GET_FREQ:
yueee_yt 1:3f2890d103fb 142 i=data[1]<<8|data[0];
yueee_yt 1:3f2890d103fb 143 freq=2000000.0/i;
yueee_yt 1:3f2890d103fb 144 if(usps_debug) printf("USPS Device#%x Freq %5.2f \r\n",device,freq);
yueee_yt 2:32a2d06f4fe2 145 for(i=0; i<nUSPS; i++) {
yueee_yt 2:32a2d06f4fe2 146 if(dUSPS[i]==device)FreqData[i]=freq;
yueee_yt 2:32a2d06f4fe2 147 }
yueee_yt 1:3f2890d103fb 148 break;
yueee_yt 2:32a2d06f4fe2 149
yueee_yt 1:3f2890d103fb 150 case EVENT_GET_POWER:
yueee_yt 1:3f2890d103fb 151 power4=(unsigned short)(data[0xf]<<8|data[0xe]);
yueee_yt 1:3f2890d103fb 152 power3=(unsigned short)(data[0xd]<<8|data[0xc]);
yueee_yt 1:3f2890d103fb 153 power2=(unsigned short)(data[0xb]<<8|data[0xa]);
yueee_yt 1:3f2890d103fb 154 power1=(unsigned short)(data[0x9]<<8|data[0x8]);
yueee_yt 1:3f2890d103fb 155 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);
yueee_yt 2:32a2d06f4fe2 156 for(i=0; i<nUSPS; i++) {
yueee_yt 2:32a2d06f4fe2 157 if(dUSPS[i]==device) {
yueee_yt 2:32a2d06f4fe2 158 WattData1[i]=power1;
yueee_yt 2:32a2d06f4fe2 159 WattData2[i]=power2;
yueee_yt 2:32a2d06f4fe2 160 WattData3[i]=power3;
yueee_yt 2:32a2d06f4fe2 161 WattData4[i]=power4;
yueee_yt 2:32a2d06f4fe2 162 }
yueee_yt 2:32a2d06f4fe2 163 }
yueee_yt 1:3f2890d103fb 164 break;
yueee_yt 2:32a2d06f4fe2 165
yueee_yt 1:3f2890d103fb 166 default:
yueee_yt 2:32a2d06f4fe2 167 if(usps_debug) printf("usps response \r\n");
yueee_yt 1:3f2890d103fb 168 if(usps_debug) printf("USPS %02X %02X %02X \r\n",device,status,len);
yueee_yt 1:3f2890d103fb 169 if(usps_debug) printfBytes("",data,len);
yueee_yt 2:32a2d06f4fe2 170 break;
yueee_yt 1:3f2890d103fb 171 }
yueee_yt 1:3f2890d103fb 172 }
yueee_yt 1:3f2890d103fb 173
yueee_yt 1:3f2890d103fb 174 // Add Usps Interface
yueee_yt 1:3f2890d103fb 175 void USPS_Refresh()
yueee_yt 1:3f2890d103fb 176 {
yueee_yt 2:32a2d06f4fe2 177 static int i=0;
yueee_yt 2:32a2d06f4fe2 178 static int k=0;
yueee_yt 1:3f2890d103fb 179 u8* dst = ms_buf;
yueee_yt 2:32a2d06f4fe2 180 //for (i=0; i<nUSPS; i++) {
yueee_yt 2:32a2d06f4fe2 181 if(nUSPS==0)return;
yueee_yt 2:32a2d06f4fe2 182 if(initFlag==true) {
yueee_yt 2:32a2d06f4fe2 183 for(i=0; i<nUSPS; i++) {
yueee_yt 2:32a2d06f4fe2 184 if(SerialNo[i]==0) {
yueee_yt 2:32a2d06f4fe2 185 usps_cmd(dUSPS[i],USPS_CMD_GET_SERIAL ,0,3,EVENT_GET_SERIAL);
yueee_yt 2:32a2d06f4fe2 186 usps_measurement_mode(dUSPS[i]);
yueee_yt 2:32a2d06f4fe2 187 }
yueee_yt 2:32a2d06f4fe2 188 }
yueee_yt 2:32a2d06f4fe2 189 k=0;
yueee_yt 2:32a2d06f4fe2 190 for(i=0; i<nUSPS; i++)if(SerialNo[i]==0)k=1;
yueee_yt 2:32a2d06f4fe2 191 if(k==0)initFlag=false;
yueee_yt 2:32a2d06f4fe2 192 } else {
yueee_yt 2:32a2d06f4fe2 193 if(i==nUSPS)i=0;
yueee_yt 2:32a2d06f4fe2 194 switch(k) {
yueee_yt 2:32a2d06f4fe2 195 case 0:
yueee_yt 2:32a2d06f4fe2 196 usps_cmd(dUSPS[i],USPS_CMD_GET_TEMP ,0,2,EVENT_GET_TEMP);
yueee_yt 2:32a2d06f4fe2 197 k++;
yueee_yt 2:32a2d06f4fe2 198 break;
yueee_yt 2:32a2d06f4fe2 199 case 1:
yueee_yt 2:32a2d06f4fe2 200 usps_cmd(dUSPS[i],USPS_CMD_GET_VOLTAGE, 0, 1,EVENT_GET_VOLT);
yueee_yt 2:32a2d06f4fe2 201 k++;
yueee_yt 2:32a2d06f4fe2 202 break;
yueee_yt 2:32a2d06f4fe2 203 case 2:
yueee_yt 2:32a2d06f4fe2 204 usps_cmd(dUSPS[i],USPS_CMD_GET_FREQ, 0, 8,EVENT_GET_FREQ);
yueee_yt 2:32a2d06f4fe2 205 k++;
yueee_yt 2:32a2d06f4fe2 206 break;
yueee_yt 2:32a2d06f4fe2 207 case 3:
yueee_yt 2:32a2d06f4fe2 208 USBInterruptTransfer(dUSPS[i], eUSPS[i], dst,0x10, UspsEventCallback, (void*)EVENT_GET_POWER);
yueee_yt 2:32a2d06f4fe2 209 k=0;
yueee_yt 2:32a2d06f4fe2 210 i++;
yueee_yt 2:32a2d06f4fe2 211 break;
yueee_yt 2:32a2d06f4fe2 212 }
yueee_yt 1:3f2890d103fb 213 }
yueee_yt 2:32a2d06f4fe2 214 //}
yueee_yt 1:3f2890d103fb 215 }
yueee_yt 1:3f2890d103fb 216
yueee_yt 1:3f2890d103fb 217 void AddUspsInterface(int device, InterfaceDescriptor* id, EndpointDescriptor* ed,int len)
yueee_yt 1:3f2890d103fb 218 {
yueee_yt 1:3f2890d103fb 219 if ((ed->bmAttributes & 3) != ENDPOINT_INTERRUPT || !(ed->bEndpointAddress & 0x80))
yueee_yt 1:3f2890d103fb 220 return;
yueee_yt 1:3f2890d103fb 221 dUSPS[nUSPS]=device;
yueee_yt 1:3f2890d103fb 222 eUSPS[nUSPS]=ed->bEndpointAddress;
yueee_yt 2:32a2d06f4fe2 223 SerialNo[nUSPS]=0;
yueee_yt 1:3f2890d103fb 224 nUSPS++;
yueee_yt 2:32a2d06f4fe2 225 if(usps_debug) printf("No of USPS :%d\n\r",nUSPS);
yueee_yt 2:32a2d06f4fe2 226 initFlag=true;
yueee_yt 2:32a2d06f4fe2 227 // usps_cmd(device,USPS_CMD_GET_FIRMWARE ,0,2,EVENT_GET_FIRMWARE);
yueee_yt 2:32a2d06f4fe2 228 // usps_cmd(device,USPS_CMD_GET_SERIAL ,0,3,EVENT_GET_SERIAL);
yueee_yt 2:32a2d06f4fe2 229 // usps_measurement_mode(device);
yueee_yt 1:3f2890d103fb 230 }
yueee_yt 1:3f2890d103fb 231
yueee_yt 1:3f2890d103fb 232 void usps_measurement_mode(int device)
yueee_yt 1:3f2890d103fb 233 {
yueee_yt 1:3f2890d103fb 234 u8* dst = ms_buf;
yueee_yt 2:32a2d06f4fe2 235 USBControlTransfer(device, 0x40, USPS_CMD_START ,0, 0, dst, 0,UspsEventCallback,(void*)EVENT_START); //UT_Vendor_Write
yueee_yt 2:32a2d06f4fe2 236 USBControlTransfer(device, 0x40, USPS_CMD_VALUE ,USPS_MODE_WATTAGE , 0, dst, 0,UspsEventCallback,(void*)EVENT_VALUE); //UT_Vendor_Write
yueee_yt 1:3f2890d103fb 237 }
yueee_yt 1:3f2890d103fb 238
yueee_yt 1:3f2890d103fb 239 void usps_cmd(int device,int cmd,int val,int len,int evt)
yueee_yt 1:3f2890d103fb 240 {
yueee_yt 1:3f2890d103fb 241 int i;
yueee_yt 1:3f2890d103fb 242 u8* dst = ms_buf;
yueee_yt 2:32a2d06f4fe2 243 // printf("req\n\r");
yueee_yt 1:3f2890d103fb 244 i= USBControlTransfer(device, 0xc0, cmd,val, 0, dst, len,UspsEventCallback,(void*)evt);
yueee_yt 1:3f2890d103fb 245 if(i!=-100) printf("status : %d \r\n",i);
yueee_yt 1:3f2890d103fb 246 }
yueee_yt 1:3f2890d103fb 247 // Detected USPS Device
yueee_yt 1:3f2890d103fb 248 int OnUspsInsert(int device)
yueee_yt 1:3f2890d103fb 249 {
yueee_yt 1:3f2890d103fb 250 u8 buffer[255];
yueee_yt 1:3f2890d103fb 251 int err = GetDescriptor(device,DESCRIPTOR_TYPE_CONFIGURATION,0,buffer,255);
yueee_yt 1:3f2890d103fb 252 if (err < 0)
yueee_yt 1:3f2890d103fb 253 return err;
yueee_yt 1:3f2890d103fb 254 int len = buffer[2] | (buffer[3] << 8);
yueee_yt 1:3f2890d103fb 255 u8* d = buffer;
yueee_yt 1:3f2890d103fb 256 u8* end = d + len;
yueee_yt 1:3f2890d103fb 257
yueee_yt 2:32a2d06f4fe2 258 if(usps_debug) printf("OnUspsInsert %02X %02X\r\n",device,len); //
yueee_yt 1:3f2890d103fb 259 //printfBytes(" -->",d,len);
yueee_yt 1:3f2890d103fb 260 while (d < end) {
yueee_yt 1:3f2890d103fb 261 if (d[1] == DESCRIPTOR_TYPE_INTERFACE) {
yueee_yt 1:3f2890d103fb 262 InterfaceDescriptor* id = (InterfaceDescriptor*)d;
yueee_yt 1:3f2890d103fb 263 d += d[0];
yueee_yt 1:3f2890d103fb 264 while (d < end) {
yueee_yt 1:3f2890d103fb 265 if (d[1] == DESCRIPTOR_TYPE_ENDPOINT) {
yueee_yt 1:3f2890d103fb 266 if(usps_debug) printfBytes("Usps Endpoint",d,d[0]);
yueee_yt 1:3f2890d103fb 267 AddUspsInterface(device,id,(EndpointDescriptor*)d,d[4]);
yueee_yt 1:3f2890d103fb 268 }
yueee_yt 1:3f2890d103fb 269 d += d[0];
yueee_yt 1:3f2890d103fb 270 }
yueee_yt 1:3f2890d103fb 271 }
yueee_yt 1:3f2890d103fb 272 d += d[0];
yueee_yt 1:3f2890d103fb 273 }
yueee_yt 1:3f2890d103fb 274 return 0;
yueee_yt 1:3f2890d103fb 275 }