スマートコンセント PS-5204PSをmbedで
Dependencies: FatFileSystemCpp mbed TextLCD
Fork of BlueUSB by
Fusjitsu スマートコンセント FX-5204PSを利用できます。
BlueUSBを利用していますが、Bluetoothは兼用できません。
複数台利用するには、USBハブを使用してください。ただし相性があります。
・良ければ10台まで利用できるかも。
・稼働中に追加はできますが、外すことはできません。
LED1-3, スマートコンセント接続状態(3台まで表示)
LED4、点滅で正常動作
usps.cpp
- Committer:
- yueee_yt
- Date:
- 2012-09-26
- Revision:
- 1:3f2890d103fb
- Child:
- 2:32a2d06f4fe2
File content as of revision 1:3f2890d103fb:
#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; }