スマートコンセント(富士通 FX-5204PS)をIEEE1888 StorageにWRITEするサンプルプログラムです。

Dependencies:   EthernetInterface FiapV2 HTTPClientForSOAP NTPClient TextLCD mbed-rtos mbed spxml

Fork of BlueUSB_f by Yasushi TAUCHI

スマートコンセント(富士通 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との整合により難しいかもしれません)

Files at this revision

API Documentation at this revision

Comitter:
yueee_yt
Date:
Sun Sep 30 07:41:28 2012 +0000
Parent:
4:357ea5242a16
Child:
6:08a406cd2726
Commit message:
?????1????????????OK?
;

Changed in this revision

AutoEvents.cpp Show annotated file Show diff for this revision Revisions of this file
FatFileSystem.lib Show diff for this revision Revisions of this file
FiapV2.lib Show annotated file Show diff for this revision Revisions of this file
MassStorage.cpp Show diff for this revision Revisions of this file
USBHost.cpp Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/AutoEvents.cpp	Sun Sep 30 05:44:10 2012 +0000
+++ b/AutoEvents.cpp	Sun Sep 30 07:41:28 2012 +0000
@@ -127,8 +127,6 @@
     return 0;
 }
 
-//  Implemented in main.cpp
-int OnDiskInsert(int device);
 
 //  Implemented in TestShell.cpp
 int OnBluetoothInsert(int device);
@@ -153,10 +151,6 @@
     
     switch (interfaceDesc->bInterfaceClass)
     {
-        case CLASS_MASS_STORAGE:
-            if (interfaceDesc->bInterfaceSubClass == 0x06 && interfaceDesc->bInterfaceProtocol == 0x50)
-                OnDiskInsert(device);    // it's SCSI!
-            break;
         case CLASS_WIRELESS_CONTROLLER:
             if (interfaceDesc->bInterfaceSubClass == 0x01 && interfaceDesc->bInterfaceProtocol == 0x01)
                 OnBluetoothInsert(device);    // it's bluetooth!
--- a/FatFileSystem.lib	Sun Sep 30 05:44:10 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-http://mbed.org/users/igorsk/code/FatFileSystemCpp/#88f22c32a456
--- a/FiapV2.lib	Sun Sep 30 05:44:10 2012 +0000
+++ b/FiapV2.lib	Sun Sep 30 07:41:28 2012 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/yueee_yt/code/FiapV2/#52e95ea60ec1
+http://mbed.org/users/yueee_yt/code/FiapV2/#cc924e783dff
--- a/MassStorage.cpp	Sun Sep 30 05:44:10 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,180 +0,0 @@
-
-/*
-Copyright (c) 2010 Peter Barrett
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include "stdlib.h"
-#include "stdio.h"
-#include "string.h"
-
-#include "Utils.h"
-#include "USBHost.h"
-
-
-int MassStorage_ReadCapacity(int device, u32* blockCount, u32* blockSize);
-int MassStorage_ReadBlock(int device, u32 block, u8* dst);
-int MassStorage_WriteBlock(int device, u32 block, const u8* dst);
-
-
-#define ERR_BAD_CSW_SIGNATURE -200
-
-#define CBW_SIGNATURE  0x43425355
-#define CSW_SIGNATURE  0x53425355
-
-//  Command Block
-typedef struct
-{
-    u32 Signature;
-    u32 Tag;
-    u32 TransferLength;
-    u8 Flags;
-    u8 LUN;
-    u8 CBLength;
-    u8 CB[16];   // only 6 really
-} CBW;
-
-//  Status block
-typedef struct
-{
-    u32 Signature;
-    u32 Tag;
-    u32 DataResidue;
-    u8 Status;
-} CSW;
-
-int SCSIRequestSense(int device);
-
-int DoSCSI(int device, const u8* cmd, int cmdLen, int flags, u8* data, u32 transferLen)
-{
-    CBW cbw;
-    cbw.Signature = CBW_SIGNATURE;
-    cbw.Tag = 0;
-    cbw.TransferLength = transferLen;
-    cbw.Flags = flags;
-    cbw.LUN = 0;
-    cbw.CBLength = cmdLen;
-    memset(cbw.CB,0,sizeof(cbw.CB));
-    memcpy(cbw.CB,cmd,cmdLen);
-
-    int r;
-    r = USBBulkTransfer(device,0x01,(u8*)&cbw,31);   // Send the command
-    if (r < 0)
-        return r;
-
-    if (data)
-    {
-        r = USBBulkTransfer(device,flags | 1,data,transferLen);
-        if (r < 0)
-            return r;
-    }
-
-    CSW csw;
-    csw.Signature = 0;
-    r = USBBulkTransfer(device,0x81,(u8*)&csw,13);
-    if (r < 0)
-        return r;
-
-    if (csw.Signature != CSW_SIGNATURE)
-        return ERR_BAD_CSW_SIGNATURE;
-
-    // ModeSense?
-    if (csw.Status == 1 && cmd[0] != 3)
-        return SCSIRequestSense(device);
-
-    return csw.Status;
-}
-
-int SCSITestUnitReady(int device)
-{
-    u8 cmd[6];
-    memset(cmd,0,6);
-    return DoSCSI(device,cmd,6,DEVICE_TO_HOST,0,0);
-}
-
-int SCSIRequestSense(int device)
-{
-    u8 cmd[6] = {0x03,0,0,0,18,0};
-    u8 result[18];
-    int r = DoSCSI(device,cmd,6,DEVICE_TO_HOST,result,18);
-    return r;
-}
-
-int SCSIInquiry(int device)
-{
-    u8 cmd[6] = {0x12,0,0,0,36,0};
-    u8 result[36+2];
-    result[36] = '\n';
-    result[37] = 0;
-    int r = DoSCSI(device,cmd,6,DEVICE_TO_HOST,result,36);
-    if (r == 0)
-        printf((const char*)result + 8);
-    return r;
-}
-
-int SCSIReadCapacity(int device, u32* blockCount, u32* blockSize)
-{
-    u8 cmd[10] = {0x25,0,0,0,8,0,0,0,0,0};
-    u8 result[8];
-    *blockSize = 0;
-    *blockCount = 0;
-    int r = DoSCSI(device,cmd,10,DEVICE_TO_HOST,result,8);
-    if (r == 0)
-    {
-        *blockCount = BE32(result);
-        *blockSize = BE32(result+4);
-    }
-    return r;
-}
-
-int SCSITransfer(int device, u32 blockAddr, u32 blockCount, u8* dst, u32 blockSize, int direction)
-{
-    //  USB hardware will only do 4k per transfer
-    while (blockCount*blockSize > 4096)
-    {
-        int count = 4096/blockSize;
-        int r = SCSITransfer(device,blockAddr,count,dst,blockSize,direction);
-        dst += count*blockSize;
-        blockAddr += count;
-        blockCount -= count;
-    }
-
-    u8 cmd[10];
-    memset(cmd,0,10);
-    cmd[0] = (direction == DEVICE_TO_HOST) ? 0x28 : 0x2A;
-    BE32(blockAddr,cmd+2);
-    BE16(blockCount,cmd+7);
-    return DoSCSI(device,cmd,10,direction,dst,blockSize*blockCount);
-}
-
-int MassStorage_ReadCapacity(int device, u32* blockCount, u32* blockSize)
-{
-    return SCSIReadCapacity(device,blockCount,blockSize);
-}
-
-int MassStorage_Read(int device, u32 blockAddr, u32 blockCount, u8* dst, u32 blockSize = 512)
-{
-    return SCSITransfer(device,blockAddr,blockCount,dst,blockSize,DEVICE_TO_HOST);
-}
-
-int MassStorage_Write(int device, u32 blockAddr, u32 blockCount, u8* dst, u32 blockSize = 512)
-{
-    return SCSITransfer(device,blockAddr,blockCount,dst,blockSize,HOST_TO_DEVICE);
-}
--- a/USBHost.cpp	Sun Sep 30 05:44:10 2012 +0000
+++ b/USBHost.cpp	Sun Sep 30 07:41:28 2012 +0000
@@ -37,8 +37,9 @@
 
 // USB host structures
 
-#define USB_RAM_SIZE 16*1024    // AHB SRAM block 1 TODO MACHINE DEPENDENT
-#define USB_RAM_BASE 0x20080000
+#define USB_RAM_SIZE 4096    // AHB SRAM block 1 TODO MACHINE DEPENDENT
+//#define USB_RAM_SIZE 16*1024    // AHB SRAM block 1 TODO MACHINE DEPENDENT
+//#define USB_RAM_BASE 0x20080000
 //#define USB_RAM_BASE 0x2007C000
 
 #define TOKEN_SETUP 0
@@ -894,7 +895,7 @@
 //      Host controller instance and Interrupt handler
 
 //static HostController _controller __attribute__((at(USB_RAM_BASE)));
-static HostController _controller __attribute__((section(".ARM.__AT_0x20080000")));
+static __align(4096) HostController _controller __attribute__((section("AHBSRAM1")));
 
 extern "C" void USB_IRQHandler(void) __irq;
 void USB_IRQHandler (void) __irq
--- a/main.cpp	Sun Sep 30 05:44:10 2012 +0000
+++ b/main.cpp	Sun Sep 30 07:41:28 2012 +0000
@@ -22,7 +22,6 @@
 
 #include "USBHost.h"
 #include "Utils.h"
-#include "FATFileSystem.h"
 #include "TextLCD.h"
 #include "EthernetInterface.h"
 #include "NTPClient.h"
@@ -37,89 +36,18 @@
 Ticker timer1;
 time_t ctTime;
 char timezone[] = "+09:00";  // JST
-char atemp1[6],atemp2[6],avolt1[6],avolt2[6],afreq1[6],afreq2[6];
-char apower_a1[6],apower_a2[6],apower_b1[6],apower_b2[6],apower_c1[6],apower_c2[6],apower_d1[6],apower_d2[6];
+char atemp[6],avolt[6],afreq[6], apower1[6],apower2[6],apower3[6],apower4[6];
 FIAP fiap("http://192.168.1.3/axis2/services/FIAPStorage");
 struct fiap_element element[]= {
-    {"http://www.gutp.jp/SmartTap1/temp",atemp1,NULL,NULL,NULL,NULL,NULL,NULL,timezone},
-    {"http://www.gutp.jp/SmartTap1/volt",avolt1,NULL,NULL,NULL,NULL,NULL,NULL,timezone},
-    {"http://www.gutp.jp/SmartTap1/freq",afreq1,NULL,NULL,NULL,NULL,NULL,NULL,timezone},
-    {"http://www.gutp.jp/SmartTap1/watt_1",apower_a1,NULL,NULL,NULL,NULL,NULL,NULL,timezone},
-    {"http://www.gutp.jp/SmartTap1/watt_2",apower_b1,NULL,NULL,NULL,NULL,NULL,NULL,timezone},
-    {"http://www.gutp.jp/SmartTap1/watt_3",apower_c1,NULL,NULL,NULL,NULL,NULL,NULL,timezone},
-    {"http://www.gutp.jp/SmartTap1/watt_4",apower_d1,NULL,NULL,NULL,NULL,NULL,NULL,timezone},
-    {"http://www.gutp.jp/SmartTap2/temp",atemp2,NULL,NULL,NULL,NULL,NULL,NULL,timezone},
-    {"http://www.gutp.jp/SmartTap2/volt",avolt2,NULL,NULL,NULL,NULL,NULL,NULL,timezone},
-    {"http://www.gutp.jp/SmartTap2/freq",afreq2,NULL,NULL,NULL,NULL,NULL,NULL,timezone},
-    {"http://www.gutp.jp/SmartTap2/watt_1",apower_a2,NULL,NULL,NULL,NULL,NULL,NULL,timezone},
-    {"http://www.gutp.jp/SmartTap2/watt_2",apower_b2,NULL,NULL,NULL,NULL,NULL,NULL,timezone},
-    {"http://www.gutp.jp/SmartTap2/watt_3",apower_c2,NULL,NULL,NULL,NULL,NULL,NULL,timezone},
-    {"http://www.gutp.jp/SmartTap2/watt_4",apower_d2,NULL,NULL,NULL,NULL,NULL,NULL,timezone},
+    {"http://www.gutp.jp/SmartTap1/temp",atemp,NULL,NULL,NULL,NULL,NULL,NULL,timezone},
+    {"http://www.gutp.jp/SmartTap1/volt",avolt,NULL,NULL,NULL,NULL,NULL,NULL,timezone},
+    {"http://www.gutp.jp/SmartTap1/freq",afreq,NULL,NULL,NULL,NULL,NULL,NULL,timezone},
+    {"http://www.gutp.jp/SmartTap1/watt_1",apower1,NULL,NULL,NULL,NULL,NULL,NULL,timezone},
+    {"http://www.gutp.jp/SmartTap1/watt_2",apower2,NULL,NULL,NULL,NULL,NULL,NULL,timezone},
+    {"http://www.gutp.jp/SmartTap1/watt_3",apower3,NULL,NULL,NULL,NULL,NULL,NULL,timezone},
+    {"http://www.gutp.jp/SmartTap1/watt_4",apower4,NULL,NULL,NULL,NULL,NULL,NULL,timezone},
 };
 
-int MassStorage_ReadCapacity(int device, u32* blockCount, u32* blockSize);
-int MassStorage_Read(int device, u32 blockAddr, u32 blockCount, u8* dst, u32 blockSize);
-int MassStorage_Write(int device, u32 blockAddr, u32 blockCount, u8* dst, u32 blockSize);
-
-class USBFileSystem : public FATFileSystem
-{
-    int _device;
-    u32 _blockSize;
-    u32 _blockCount;
-
-public:
-    USBFileSystem() : FATFileSystem("usb"),_device(0),_blockSize(0),_blockCount(0) {
-    }
-
-    void SetDevice(int device) {
-        _device = device;
-    }
-
-    virtual int disk_initialize() {
-        return MassStorage_ReadCapacity(_device,&_blockCount,&_blockSize);
-    }
-
-    virtual int disk_write(const char *buffer, int block_number) {
-        return MassStorage_Write(_device,block_number,1,(u8*)buffer,_blockSize);
-    }
-
-    virtual int disk_read(char *buffer, int block_number) {
-        return MassStorage_Read(_device,block_number,1,(u8*)buffer,_blockSize);
-    }
-
-    virtual int disk_sectors() {
-        return _blockCount;
-    }
-};
-
-void DumpFS(int depth, int count)
-{
-    DIR *d = opendir("/usb");
-    if (!d) {
-        printf("USB file system borked\n");
-        return;
-    }
-
-    printf("\nDumping root dir\n");
-    struct dirent *p;
-    for(;;) {
-        p = readdir(d);
-        if (!p)
-            break;
-        int len = sizeof( dirent);
-        printf("%s %d\n", p->d_name, len);
-    }
-    closedir(d);
-}
-
-int OnDiskInsert(int device)
-{
-    USBFileSystem fs;
-    fs.SetDevice(device);
-    DumpFS(0,0);
-    return 0;
-}
-
 /*
     Simple test shell to exercise mouse,keyboard,mass storage and hubs.
     Add 2 15k pulldown resistors between D+/D- and ground, attach a usb socket and have at it.
@@ -178,6 +106,7 @@
 
     InitUSPS();
     USBInit();
+    fiap.debug_mode=1;
     t.start();
     t2.start();
     t3.start();
@@ -192,16 +121,13 @@
             t2.start();
             if(SerialNo[0]==0)led1=0;
             else led1=1;
-            if(SerialNo[1]==0)led2=0;
-            else led2=1;
-            if(SerialNo[2]==0)led3=0;
-            else led3=1;
             lcd.locate(0,0);
             lcd.printf("1:%4.0fW  2:%4.0fW",WattData1[0],WattData2[0]);
             lcd.locate(0,1);
             lcd.printf("3:%4.0fW  4:%4.0fW",WattData3[0],WattData4[0]);
         }
         if(t3>60) { //Data to FiapStorage
+            led3=1;
             t3.start();
             char buffer[9];
             ctTime = time(NULL);
@@ -209,37 +135,24 @@
             printf("Storage Store %s \r\n",buffer);
 // Save to FIAPStorage
             struct tm t = *localtime(&ctTime);
-            for(i=0; i<14; i++) {
-                element[0].year=t.tm_year+1900;
-                element[0].month=t.tm_mon+1;
-                element[0].day=t.tm_mday;
-                element[0].hour=t.tm_hour;
-                element[0].minute=t.tm_min;
-                element[0].second=t.tm_sec;
+            for(i=0; i<7; i++) {
+                element[i].year=t.tm_year+1900;
+                element[i].month=t.tm_mon+1;
+                element[i].day=t.tm_mday;
+                element[i].hour=t.tm_hour;
+                element[i].minute=t.tm_min;
+                element[i].second=t.tm_sec;
             }
-            for(i=0; i<2; i++) {
-                switch(SerialNo[i]) {
-                    case 0x1737:
-                        sprintf(atemp1,"%4.1f",TempData[i]);
-                        sprintf(avolt1,"%4.1f",VoltData[i]);
-                        sprintf(afreq1,"%4.1f",FreqData[i]);
-                        sprintf(apower_a1,"%4.0f",WattData1[i]);
-                        sprintf(apower_b1,"%4.0f",WattData2[i]);
-                        sprintf(apower_c1,"%4.0f",WattData3[i]);
-                        sprintf(apower_d1,"%4.0f",WattData4[i]);
-                        break;
-                    case 0x1871:
-                        sprintf(atemp2,"%4.1f",TempData[i]);
-                        sprintf(avolt2,"%4.1f",VoltData[i]);
-                        sprintf(afreq2,"%4.1f",FreqData[i]);
-                        sprintf(apower_a2,"%4.0f",WattData1[i]);
-                        sprintf(apower_b2,"%4.0f",WattData2[i]);
-                        sprintf(apower_c2,"%4.0f",WattData3[i]);
-                        sprintf(apower_d2,"%4.0f",WattData4[i]);
-                        break;
-                }
-            }
-            fiap.post(element,1);
+            sprintf(atemp,"%4.1f",TempData[0]);
+            sprintf(avolt,"%4.1f",VoltData[0]);
+            sprintf(afreq,"%4.1f",FreqData[0]);
+            sprintf(apower1,"%4.0f",WattData1[0]);
+            sprintf(apower2,"%4.0f",WattData2[0]);
+            sprintf(apower3,"%4.0f",WattData3[0]);
+            sprintf(apower4,"%4.0f",WattData4[0]);
+            fiap.post(element,7);
+            led3=0;
+            led2=!led2;
         }
     }
 }