スマートコンセント 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:
2:32a2d06f4fe2
Parent:
1:3f2890d103fb
--- a/usps.cpp	Wed Sep 26 06:29:47 2012 +0000
+++ b/usps.cpp	Thu Sep 27 13:04:36 2012 +0000
@@ -6,6 +6,11 @@
 int nUSPS;
 int dUSPS[10];
 int eUSPS[10];
+int SerialNo[10];
+float TempData[10];
+float VoltData[10];
+float FreqData[10];
+float WattData1[10],WattData2[10],WattData3[10],WattData4[10];
 void usps_cmd(int device,int cmd,int val,int len,int evt);
 void usps_measurement_mode(int device);
 void USPS_Refresh();
@@ -38,20 +43,22 @@
 float freq;
 float power1,power2,power3,power4;
 unsigned char cmdFlag;
-
+bool initFlag;
 void InitUSPS()
 {
+    int i;
     nUSPS=0;
+    for(i=0; i<10; i++)SerialNo[i]=0;
+    initFlag=false;
 }
 
 void UspsEventCallback(int device, int endpoint, int status, u8* data, int len, void* userData)
 {
-    int i;
+    int i,i1,i2,sn;
     int Flag=0;
-    int ptr = 0;
     if(status!=0) {
-        int i1=0;
-   if(usps_debug)     printf("USPS Callback Status %d \n\r",status);
+        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;
@@ -62,84 +69,178 @@
             for(i=i1+1; i<nUSPS; i++) {
                 dUSPS[i-1]=dUSPS[i];
                 eUSPS[i-1]=eUSPS[i];
+                SerialNo[i-1]=SerialNo[i];
+                TempData[i-1]=TempData[i];
+                VoltData[i-1]=VoltData[i];
+                FreqData[i-1]=FreqData[i];
+                WattData1[i-1]=WattData1[i];
+                WattData2[i-1]=WattData2[i];
+                WattData3[i-1]=WattData3[i];
+                WattData4[i-1]=WattData4[i];
             }
             nUSPS--;
         }
         return;
     }
-    switch((int)userData) {
+    i2=(int)userData;
+    switch(i2) {
         case EVENT_GET_FIRMWARE:
-             if(usps_debug) printf("USPS Device#%X Firmware VOL%X REL%X\r\n",device,data[0],data[1]);
+            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);
+            i1=0;
+            sn=data[0]<<16|data[1]<<8|data[2];
+            if(usps_debug) printf("USPS Device#%x SerialNo %X \r\n",device,sn);
+            for(i=0; i<nUSPS; i++) {
+                if(SerialNo[i]==sn) {
+                    i1=i;
+                    Flag=1;
+                }
+            }
+            if(Flag==1) {
+                for(i=i1+1; i<nUSPS; i++) {
+                    dUSPS[i-1]=dUSPS[i];
+                    eUSPS[i-1]=eUSPS[i];
+                    SerialNo[i-1]=SerialNo[i];
+                    TempData[i-1]=TempData[i];
+                    VoltData[i-1]=VoltData[i];
+                    FreqData[i-1]=FreqData[i];
+                    WattData1[i-1]=WattData1[i];
+                    WattData2[i-1]=WattData2[i];
+                    WattData3[i-1]=WattData3[i];
+                    WattData4[i-1]=WattData4[i];
+                }
+                nUSPS--;
+            }
+            for(i=0; i<nUSPS; i++) {
+                if(dUSPS[i]==device)SerialNo[i]=sn;
+            }
+            for(i=0; i<nUSPS; i++) {
+                if(usps_debug)     printf( "Serial(%d) : %X \n\r",i,SerialNo[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);
+            for(i=0; i<nUSPS; i++) {
+                if(dUSPS[i]==device)TempData[i]=temp;
+            }
             break;
+
         case EVENT_GET_VOLT:
             volt=data[0];
-           if(usps_debug)   printf("USPS Device#%x Volt %6.2f \r\n",device,volt);
+            if(usps_debug)   printf("USPS Device#%x Volt %6.2f \r\n",device,volt);
+            for(i=0; i<nUSPS; i++) {
+                if(dUSPS[i]==device)VoltData[i]=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);
+            for(i=0; i<nUSPS; i++) {
+                if(dUSPS[i]==device)FreqData[i]=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);
+            for(i=0; i<nUSPS; i++) {
+                if(dUSPS[i]==device) {
+                    WattData1[i]=power1;
+                    WattData2[i]=power2;
+                    WattData3[i]=power3;
+                    WattData4[i]=power4;
+                }
+            }
             break;
+
         default:
-           if(usps_debug)   printf("usps response \r\n");
+            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);
+            break;
     }
 }
 
 //  Add Usps Interface
 void USPS_Refresh()
 {
-    int i;
+    static int i=0;
+    static int k=0;
     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);
+    //for (i=0; i<nUSPS; i++) {
+    if(nUSPS==0)return;
+    if(initFlag==true) {
+        for(i=0; i<nUSPS; i++) {
+            if(SerialNo[i]==0) {
+                usps_cmd(dUSPS[i],USPS_CMD_GET_SERIAL  ,0,3,EVENT_GET_SERIAL);
+                usps_measurement_mode(dUSPS[i]);
+            }
+        }
+        k=0;
+        for(i=0; i<nUSPS; i++)if(SerialNo[i]==0)k=1;
+        if(k==0)initFlag=false;
+    } else {
+        if(i==nUSPS)i=0;
+        switch(k) {
+            case 0:
+                usps_cmd(dUSPS[i],USPS_CMD_GET_TEMP ,0,2,EVENT_GET_TEMP);
+                k++;
+                break;
+            case 1:
+                usps_cmd(dUSPS[i],USPS_CMD_GET_VOLTAGE, 0, 1,EVENT_GET_VOLT);
+                k++;
+                break;
+            case 2:
+                usps_cmd(dUSPS[i],USPS_CMD_GET_FREQ, 0, 8,EVENT_GET_FREQ);
+                k++;
+                break;
+            case 3:
+                USBInterruptTransfer(dUSPS[i], eUSPS[i], dst,0x10, UspsEventCallback, (void*)EVENT_GET_POWER);
+                k=0;
+                i++;
+                break;
+        }
     }
+    //}
 }
 
 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;
+    SerialNo[nUSPS]=0;
     nUSPS++;
+    if(usps_debug)  printf("No of USPS :%d\n\r",nUSPS);
+    initFlag=true;
+//    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);
 }
 
 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
+    USBControlTransfer(device, 0x40, USPS_CMD_START ,0, 0, dst, 0,UspsEventCallback,(void*)EVENT_START); //UT_Vendor_Write
+    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;
+    // printf("req\n\r");
     i= USBControlTransfer(device, 0xc0,  cmd,val, 0, dst, len,UspsEventCallback,(void*)evt);
     if(i!=-100) printf("status : %d \r\n",i);
 }
@@ -154,7 +255,7 @@
     u8* d = buffer;
     u8* end = d + len;
 
-     if(usps_debug) printf("OnUspsInsert %02X %02X\r\n",device,len); //
+    if(usps_debug) printf("OnUspsInsert %02X %02X\r\n",device,len); //
     //printfBytes("  -->",d,len);
     while (d < end) {
         if (d[1] == DESCRIPTOR_TYPE_INTERFACE) {