スマートコンセント PS-5204PSをmbedで

Dependencies:   FatFileSystemCpp mbed TextLCD

Fork of BlueUSB by Peter Barrett

Fusjitsu スマートコンセント FX-5204PSを利用できます。

BlueUSBを利用していますが、Bluetoothは兼用できません。

複数台利用するには、USBハブを使用してください。ただし相性があります。
・良ければ10台まで利用できるかも。
・稼働中に追加はできますが、外すことはできません。



LED1-3, スマートコンセント接続状態(3台まで表示)
LED4、点滅で正常動作

Committer:
yueee_yt
Date:
Wed Sep 26 06:29:47 2012 +0000
Revision:
1:3f2890d103fb
Child:
2:32a2d06f4fe2
Initial Version
;

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 1:3f2890d103fb 9 void usps_cmd(int device,int cmd,int val,int len,int evt);
yueee_yt 1:3f2890d103fb 10 void usps_measurement_mode(int device);
yueee_yt 1:3f2890d103fb 11 void USPS_Refresh();
yueee_yt 1:3f2890d103fb 12
yueee_yt 1:3f2890d103fb 13 bool usps_debug=true;
yueee_yt 1:3f2890d103fb 14
yueee_yt 1:3f2890d103fb 15 /* protocol */
yueee_yt 1:3f2890d103fb 16 #define USPS_CMD_START 0x01
yueee_yt 1:3f2890d103fb 17 #define USPS_CMD_VALUE 0x20
yueee_yt 1:3f2890d103fb 18 #define USPS_CMD_GET_FIRMWARE 0xc0
yueee_yt 1:3f2890d103fb 19 #define USPS_CMD_GET_SERIAL 0xc1
yueee_yt 1:3f2890d103fb 20 #define USPS_CMD_GET_VOLTAGE 0xb0
yueee_yt 1:3f2890d103fb 21 #define USPS_CMD_GET_TEMP 0xb4
yueee_yt 1:3f2890d103fb 22 #define USPS_CMD_GET_FREQ 0xa1
yueee_yt 1:3f2890d103fb 23
yueee_yt 1:3f2890d103fb 24 #define USPS_MODE_WATTAGE 0x10
yueee_yt 1:3f2890d103fb 25 #define USPS_MODE_CURRENT 0x30
yueee_yt 1:3f2890d103fb 26
yueee_yt 1:3f2890d103fb 27 #define EVENT_GET_FIRMWARE 0x11
yueee_yt 1:3f2890d103fb 28 #define EVENT_GET_SERIAL 0x12
yueee_yt 1:3f2890d103fb 29 #define EVENT_GET_TEMP 0x21
yueee_yt 1:3f2890d103fb 30 #define EVENT_GET_VOLT 0x22
yueee_yt 1:3f2890d103fb 31 #define EVENT_GET_FREQ 0x23
yueee_yt 1:3f2890d103fb 32 #define EVENT_GET_POWER 0x24
yueee_yt 1:3f2890d103fb 33 #define EVENT_START 0x13
yueee_yt 1:3f2890d103fb 34 #define EVENT_VALUE 0x14
yueee_yt 1:3f2890d103fb 35
yueee_yt 1:3f2890d103fb 36 float temp;
yueee_yt 1:3f2890d103fb 37 float volt;
yueee_yt 1:3f2890d103fb 38 float freq;
yueee_yt 1:3f2890d103fb 39 float power1,power2,power3,power4;
yueee_yt 1:3f2890d103fb 40 unsigned char cmdFlag;
yueee_yt 1:3f2890d103fb 41
yueee_yt 1:3f2890d103fb 42 void InitUSPS()
yueee_yt 1:3f2890d103fb 43 {
yueee_yt 1:3f2890d103fb 44 nUSPS=0;
yueee_yt 1:3f2890d103fb 45 }
yueee_yt 1:3f2890d103fb 46
yueee_yt 1:3f2890d103fb 47 void UspsEventCallback(int device, int endpoint, int status, u8* data, int len, void* userData)
yueee_yt 1:3f2890d103fb 48 {
yueee_yt 1:3f2890d103fb 49 int i;
yueee_yt 1:3f2890d103fb 50 int Flag=0;
yueee_yt 1:3f2890d103fb 51 int ptr = 0;
yueee_yt 1:3f2890d103fb 52 if(status!=0) {
yueee_yt 1:3f2890d103fb 53 int i1=0;
yueee_yt 1:3f2890d103fb 54 if(usps_debug) printf("USPS Callback Status %d \n\r",status);
yueee_yt 1:3f2890d103fb 55 for(i=0; i<nUSPS; i++) {
yueee_yt 1:3f2890d103fb 56 if(dUSPS[i]==device) {
yueee_yt 1:3f2890d103fb 57 i1=i;
yueee_yt 1:3f2890d103fb 58 Flag=1;
yueee_yt 1:3f2890d103fb 59 }
yueee_yt 1:3f2890d103fb 60 }
yueee_yt 1:3f2890d103fb 61 if(Flag==1) {
yueee_yt 1:3f2890d103fb 62 for(i=i1+1; i<nUSPS; i++) {
yueee_yt 1:3f2890d103fb 63 dUSPS[i-1]=dUSPS[i];
yueee_yt 1:3f2890d103fb 64 eUSPS[i-1]=eUSPS[i];
yueee_yt 1:3f2890d103fb 65 }
yueee_yt 1:3f2890d103fb 66 nUSPS--;
yueee_yt 1:3f2890d103fb 67 }
yueee_yt 1:3f2890d103fb 68 return;
yueee_yt 1:3f2890d103fb 69 }
yueee_yt 1:3f2890d103fb 70 switch((int)userData) {
yueee_yt 1:3f2890d103fb 71 case EVENT_GET_FIRMWARE:
yueee_yt 1:3f2890d103fb 72 if(usps_debug) printf("USPS Device#%X Firmware VOL%X REL%X\r\n",device,data[0],data[1]);
yueee_yt 1:3f2890d103fb 73 break;
yueee_yt 1:3f2890d103fb 74 case EVENT_GET_SERIAL:
yueee_yt 1:3f2890d103fb 75 i=data[0]<<16|data[1]<<8|data[2];
yueee_yt 1:3f2890d103fb 76 if(usps_debug) printf("USPS Device#%x SerialNo %X \r\n",device,i);
yueee_yt 1:3f2890d103fb 77 break;
yueee_yt 1:3f2890d103fb 78 case EVENT_GET_TEMP:
yueee_yt 1:3f2890d103fb 79 i=data[1]<<8|data[0];
yueee_yt 1:3f2890d103fb 80 temp=i/100.0;
yueee_yt 1:3f2890d103fb 81 if(usps_debug) printf("USPS Device#%x Temp %5.2f \r\n",device,temp);
yueee_yt 1:3f2890d103fb 82 break;
yueee_yt 1:3f2890d103fb 83 case EVENT_GET_VOLT:
yueee_yt 1:3f2890d103fb 84 volt=data[0];
yueee_yt 1:3f2890d103fb 85 if(usps_debug) printf("USPS Device#%x Volt %6.2f \r\n",device,volt);
yueee_yt 1:3f2890d103fb 86 break;
yueee_yt 1:3f2890d103fb 87 case EVENT_GET_FREQ:
yueee_yt 1:3f2890d103fb 88 i=data[1]<<8|data[0];
yueee_yt 1:3f2890d103fb 89 freq=2000000.0/i;
yueee_yt 1:3f2890d103fb 90 if(usps_debug) printf("USPS Device#%x Freq %5.2f \r\n",device,freq);
yueee_yt 1:3f2890d103fb 91 break;
yueee_yt 1:3f2890d103fb 92 case EVENT_GET_POWER:
yueee_yt 1:3f2890d103fb 93 power4=(unsigned short)(data[0xf]<<8|data[0xe]);
yueee_yt 1:3f2890d103fb 94 power3=(unsigned short)(data[0xd]<<8|data[0xc]);
yueee_yt 1:3f2890d103fb 95 power2=(unsigned short)(data[0xb]<<8|data[0xa]);
yueee_yt 1:3f2890d103fb 96 power1=(unsigned short)(data[0x9]<<8|data[0x8]);
yueee_yt 1:3f2890d103fb 97 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 1:3f2890d103fb 98 break;
yueee_yt 1:3f2890d103fb 99 default:
yueee_yt 1:3f2890d103fb 100 if(usps_debug) printf("usps response \r\n");
yueee_yt 1:3f2890d103fb 101 if(usps_debug) printf("USPS %02X %02X %02X \r\n",device,status,len);
yueee_yt 1:3f2890d103fb 102 if(usps_debug) printfBytes("",data,len);
yueee_yt 1:3f2890d103fb 103 }
yueee_yt 1:3f2890d103fb 104 }
yueee_yt 1:3f2890d103fb 105
yueee_yt 1:3f2890d103fb 106 // Add Usps Interface
yueee_yt 1:3f2890d103fb 107 void USPS_Refresh()
yueee_yt 1:3f2890d103fb 108 {
yueee_yt 1:3f2890d103fb 109 int i;
yueee_yt 1:3f2890d103fb 110 u8* dst = ms_buf;
yueee_yt 1:3f2890d103fb 111 for (i=0; i<nUSPS; i++) {
yueee_yt 1:3f2890d103fb 112 usps_cmd(dUSPS[i],USPS_CMD_GET_TEMP ,0,2,EVENT_GET_TEMP);
yueee_yt 1:3f2890d103fb 113 usps_cmd(dUSPS[i],USPS_CMD_GET_VOLTAGE, 0, 1,EVENT_GET_VOLT);
yueee_yt 1:3f2890d103fb 114 usps_cmd(dUSPS[i],USPS_CMD_GET_FREQ, 0, 8,EVENT_GET_FREQ);
yueee_yt 1:3f2890d103fb 115 USBInterruptTransfer(dUSPS[i], eUSPS[i], dst,0x10, UspsEventCallback, (void*)EVENT_GET_POWER);
yueee_yt 1:3f2890d103fb 116 }
yueee_yt 1:3f2890d103fb 117 }
yueee_yt 1:3f2890d103fb 118
yueee_yt 1:3f2890d103fb 119 void AddUspsInterface(int device, InterfaceDescriptor* id, EndpointDescriptor* ed,int len)
yueee_yt 1:3f2890d103fb 120 {
yueee_yt 1:3f2890d103fb 121 if ((ed->bmAttributes & 3) != ENDPOINT_INTERRUPT || !(ed->bEndpointAddress & 0x80))
yueee_yt 1:3f2890d103fb 122 return;
yueee_yt 1:3f2890d103fb 123 usps_cmd(device,USPS_CMD_GET_FIRMWARE ,0,2,EVENT_GET_FIRMWARE);
yueee_yt 1:3f2890d103fb 124 usps_cmd(device,USPS_CMD_GET_SERIAL ,0,3,EVENT_GET_SERIAL);
yueee_yt 1:3f2890d103fb 125 usps_measurement_mode(device);
yueee_yt 1:3f2890d103fb 126 dUSPS[nUSPS]=device;
yueee_yt 1:3f2890d103fb 127 eUSPS[nUSPS]=ed->bEndpointAddress;
yueee_yt 1:3f2890d103fb 128 nUSPS++;
yueee_yt 1:3f2890d103fb 129 }
yueee_yt 1:3f2890d103fb 130
yueee_yt 1:3f2890d103fb 131 void usps_measurement_mode(int device)
yueee_yt 1:3f2890d103fb 132 {
yueee_yt 1:3f2890d103fb 133 int i;
yueee_yt 1:3f2890d103fb 134 u8* dst = ms_buf;
yueee_yt 1:3f2890d103fb 135 i= USBControlTransfer(device, 0x40, USPS_CMD_START ,0, 0, dst, 0,UspsEventCallback,(void*)EVENT_START); //UT_Vendor_Write
yueee_yt 1:3f2890d103fb 136 i= USBControlTransfer(device, 0x40, USPS_CMD_VALUE ,USPS_MODE_WATTAGE , 0, dst, 0,UspsEventCallback,(void*)EVENT_VALUE); //UT_Vendor_Write
yueee_yt 1:3f2890d103fb 137 }
yueee_yt 1:3f2890d103fb 138
yueee_yt 1:3f2890d103fb 139 void usps_cmd(int device,int cmd,int val,int len,int evt)
yueee_yt 1:3f2890d103fb 140 {
yueee_yt 1:3f2890d103fb 141 int i;
yueee_yt 1:3f2890d103fb 142 u8* dst = ms_buf;
yueee_yt 1:3f2890d103fb 143 i= USBControlTransfer(device, 0xc0, cmd,val, 0, dst, len,UspsEventCallback,(void*)evt);
yueee_yt 1:3f2890d103fb 144 if(i!=-100) printf("status : %d \r\n",i);
yueee_yt 1:3f2890d103fb 145 }
yueee_yt 1:3f2890d103fb 146 // Detected USPS Device
yueee_yt 1:3f2890d103fb 147 int OnUspsInsert(int device)
yueee_yt 1:3f2890d103fb 148 {
yueee_yt 1:3f2890d103fb 149 u8 buffer[255];
yueee_yt 1:3f2890d103fb 150 int err = GetDescriptor(device,DESCRIPTOR_TYPE_CONFIGURATION,0,buffer,255);
yueee_yt 1:3f2890d103fb 151 if (err < 0)
yueee_yt 1:3f2890d103fb 152 return err;
yueee_yt 1:3f2890d103fb 153 int len = buffer[2] | (buffer[3] << 8);
yueee_yt 1:3f2890d103fb 154 u8* d = buffer;
yueee_yt 1:3f2890d103fb 155 u8* end = d + len;
yueee_yt 1:3f2890d103fb 156
yueee_yt 1:3f2890d103fb 157 if(usps_debug) printf("OnUspsInsert %02X %02X\r\n",device,len); //
yueee_yt 1:3f2890d103fb 158 //printfBytes(" -->",d,len);
yueee_yt 1:3f2890d103fb 159 while (d < end) {
yueee_yt 1:3f2890d103fb 160 if (d[1] == DESCRIPTOR_TYPE_INTERFACE) {
yueee_yt 1:3f2890d103fb 161 InterfaceDescriptor* id = (InterfaceDescriptor*)d;
yueee_yt 1:3f2890d103fb 162 d += d[0];
yueee_yt 1:3f2890d103fb 163 while (d < end) {
yueee_yt 1:3f2890d103fb 164 if (d[1] == DESCRIPTOR_TYPE_ENDPOINT) {
yueee_yt 1:3f2890d103fb 165 if(usps_debug) printfBytes("Usps Endpoint",d,d[0]);
yueee_yt 1:3f2890d103fb 166 AddUspsInterface(device,id,(EndpointDescriptor*)d,d[4]);
yueee_yt 1:3f2890d103fb 167 }
yueee_yt 1:3f2890d103fb 168 d += d[0];
yueee_yt 1:3f2890d103fb 169 }
yueee_yt 1:3f2890d103fb 170 }
yueee_yt 1:3f2890d103fb 171 d += d[0];
yueee_yt 1:3f2890d103fb 172 }
yueee_yt 1:3f2890d103fb 173 return 0;
yueee_yt 1:3f2890d103fb 174 }