スマートコンセント(富士通 FX-5204PS)をIEEE1888 StorageにWRITEするサンプルプログラムです。
Dependencies: EthernetInterface FiapV2 HTTPClientForSOAP NTPClient TextLCD mbed-rtos mbed spxml
Fork of BlueUSB_f by
スマートコンセント(富士通 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との整合により難しいかもしれません)
Diff: usps.cpp
- Revision:
- 1:3f2890d103fb
- Child:
- 2:32a2d06f4fe2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/usps.cpp Wed Sep 26 06:29:47 2012 +0000 @@ -0,0 +1,174 @@ +#include "mbed.h" +#include "USBHost.h" +#include "Utils.h" + +u8 ms_buf[0x1A]; // USPS Streaming Buffer +int nUSPS; +int dUSPS[10]; +int eUSPS[10]; +void usps_cmd(int device,int cmd,int val,int len,int evt); +void usps_measurement_mode(int device); +void USPS_Refresh(); + +bool usps_debug=true; + +/* protocol */ +#define USPS_CMD_START 0x01 +#define USPS_CMD_VALUE 0x20 +#define USPS_CMD_GET_FIRMWARE 0xc0 +#define USPS_CMD_GET_SERIAL 0xc1 +#define USPS_CMD_GET_VOLTAGE 0xb0 +#define USPS_CMD_GET_TEMP 0xb4 +#define USPS_CMD_GET_FREQ 0xa1 + +#define USPS_MODE_WATTAGE 0x10 +#define USPS_MODE_CURRENT 0x30 + +#define EVENT_GET_FIRMWARE 0x11 +#define EVENT_GET_SERIAL 0x12 +#define EVENT_GET_TEMP 0x21 +#define EVENT_GET_VOLT 0x22 +#define EVENT_GET_FREQ 0x23 +#define EVENT_GET_POWER 0x24 +#define EVENT_START 0x13 +#define EVENT_VALUE 0x14 + +float temp; +float volt; +float freq; +float power1,power2,power3,power4; +unsigned char cmdFlag; + +void InitUSPS() +{ + nUSPS=0; +} + +void UspsEventCallback(int device, int endpoint, int status, u8* data, int len, void* userData) +{ + int i; + int Flag=0; + int ptr = 0; + if(status!=0) { + int i1=0; + if(usps_debug) printf("USPS Callback Status %d \n\r",status); + for(i=0; i<nUSPS; i++) { + if(dUSPS[i]==device) { + i1=i; + Flag=1; + } + } + if(Flag==1) { + for(i=i1+1; i<nUSPS; i++) { + dUSPS[i-1]=dUSPS[i]; + eUSPS[i-1]=eUSPS[i]; + } + nUSPS--; + } + return; + } + switch((int)userData) { + case EVENT_GET_FIRMWARE: + if(usps_debug) printf("USPS Device#%X Firmware VOL%X REL%X\r\n",device,data[0],data[1]); + break; + case EVENT_GET_SERIAL: + i=data[0]<<16|data[1]<<8|data[2]; + if(usps_debug) printf("USPS Device#%x SerialNo %X \r\n",device,i); + break; + case EVENT_GET_TEMP: + i=data[1]<<8|data[0]; + temp=i/100.0; + if(usps_debug) printf("USPS Device#%x Temp %5.2f \r\n",device,temp); + break; + case EVENT_GET_VOLT: + volt=data[0]; + if(usps_debug) printf("USPS Device#%x Volt %6.2f \r\n",device,volt); + break; + case EVENT_GET_FREQ: + i=data[1]<<8|data[0]; + freq=2000000.0/i; + if(usps_debug) printf("USPS Device#%x Freq %5.2f \r\n",device,freq); + break; + case EVENT_GET_POWER: + power4=(unsigned short)(data[0xf]<<8|data[0xe]); + power3=(unsigned short)(data[0xd]<<8|data[0xc]); + power2=(unsigned short)(data[0xb]<<8|data[0xa]); + power1=(unsigned short)(data[0x9]<<8|data[0x8]); + 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); + break; + default: + if(usps_debug) printf("usps response \r\n"); + if(usps_debug) printf("USPS %02X %02X %02X \r\n",device,status,len); + if(usps_debug) printfBytes("",data,len); + } +} + +// Add Usps Interface +void USPS_Refresh() +{ + int i; + u8* dst = ms_buf; + for (i=0; i<nUSPS; i++) { + usps_cmd(dUSPS[i],USPS_CMD_GET_TEMP ,0,2,EVENT_GET_TEMP); + usps_cmd(dUSPS[i],USPS_CMD_GET_VOLTAGE, 0, 1,EVENT_GET_VOLT); + usps_cmd(dUSPS[i],USPS_CMD_GET_FREQ, 0, 8,EVENT_GET_FREQ); + USBInterruptTransfer(dUSPS[i], eUSPS[i], dst,0x10, UspsEventCallback, (void*)EVENT_GET_POWER); + } +} + +void AddUspsInterface(int device, InterfaceDescriptor* id, EndpointDescriptor* ed,int len) +{ + if ((ed->bmAttributes & 3) != ENDPOINT_INTERRUPT || !(ed->bEndpointAddress & 0x80)) + return; + usps_cmd(device,USPS_CMD_GET_FIRMWARE ,0,2,EVENT_GET_FIRMWARE); + usps_cmd(device,USPS_CMD_GET_SERIAL ,0,3,EVENT_GET_SERIAL); + usps_measurement_mode(device); + dUSPS[nUSPS]=device; + eUSPS[nUSPS]=ed->bEndpointAddress; + nUSPS++; +} + +void usps_measurement_mode(int device) +{ + int i; + u8* dst = ms_buf; + i= USBControlTransfer(device, 0x40, USPS_CMD_START ,0, 0, dst, 0,UspsEventCallback,(void*)EVENT_START); //UT_Vendor_Write + i= USBControlTransfer(device, 0x40, USPS_CMD_VALUE ,USPS_MODE_WATTAGE , 0, dst, 0,UspsEventCallback,(void*)EVENT_VALUE); //UT_Vendor_Write +} + +void usps_cmd(int device,int cmd,int val,int len,int evt) +{ + int i; + u8* dst = ms_buf; + i= USBControlTransfer(device, 0xc0, cmd,val, 0, dst, len,UspsEventCallback,(void*)evt); + if(i!=-100) printf("status : %d \r\n",i); +} +// Detected USPS Device +int OnUspsInsert(int device) +{ + u8 buffer[255]; + int err = GetDescriptor(device,DESCRIPTOR_TYPE_CONFIGURATION,0,buffer,255); + if (err < 0) + return err; + int len = buffer[2] | (buffer[3] << 8); + u8* d = buffer; + u8* end = d + len; + + if(usps_debug) printf("OnUspsInsert %02X %02X\r\n",device,len); // + //printfBytes(" -->",d,len); + while (d < end) { + if (d[1] == DESCRIPTOR_TYPE_INTERFACE) { + InterfaceDescriptor* id = (InterfaceDescriptor*)d; + d += d[0]; + while (d < end) { + if (d[1] == DESCRIPTOR_TYPE_ENDPOINT) { + if(usps_debug) printfBytes("Usps Endpoint",d,d[0]); + AddUspsInterface(device,id,(EndpointDescriptor*)d,d[4]); + } + d += d[0]; + } + } + d += d[0]; + } + return 0; +}