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

Dependencies:   FatFileSystemCpp mbed TextLCD

Fork of BlueUSB by Peter Barrett

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

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

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



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

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;
+}