132

Dependencies:   DMSupport DMemWin

Fork of Motor_Embedded_3rd_emwin by Wei Chang Shen

Motor_Monitoring_Embedded.cpp

Committer:
Will_Lu
Date:
2017-07-12
Revision:
3:1823bfc913c1
Parent:
2:bfc676294e38

File content as of revision 3:1823bfc913c1:

#include <stddef.h>

#include "mbed.h"
#include "MCIFileSystem.h"
#include "EthernetInterface.h"
#include "HTTPClient.h"
#include "HTTPFile.h"
#include "Base64.h"


#include "ADC.h"
#include "MATH1.h"
#include "fft.h"

#include "DIALOG.h"

#define len 10000
#define pi  3.14159265359f
#define SPS 20000
#define N    8192

Serial pc(P0_2, P0_3); // tx, rx***

SPI spi2(P0_9, P0_8, P0_7); // mosi, miso, sclk .........//for voltage & current
SPI spi(P2_27, P2_26, P2_22); // mosi, miso, sclk .......//for vibration
ADS8556 adc2(&spi2, P0_6, P2_25, P0_25, P0_26);  // for voltage & current
ADS8556 adc(&spi, P2_23, P0_1, P0_0, P5_4);  // for vibration

EthernetInterface eth;
HTTPClient http;
Timer timer;
MATH math;
CFFT fft;

//GUI_RECT conditionmonitoring = {125, 90, 665, 180};
//GUI_RECT faultdiagnosis      = {60, 315, 730, 385};
//GUI_RECT no      = {445, 60, 725, 330};

char  MotorID[10], Volts[10], Amps[10], HP[10], Poles[10], RPM[10],
      IPADR[20], Netmask[20], Gateway[20],
      cIUR[10], cIUF[10], cTHDV[10], cVDFodd[10], cTHDI[10], cIDFodd[10], cPeakValue[10], cUBValue[10], cx_vel[10], cy_vel[10], cz_vel[10], cz_dis[10], cy_dis[10], cx_dis[10],
      cbk_PeakValue[10], cbk_UBValue[10], bkgPeakValue[10], bkgUBValue[10],
      cpCMS[10], cpH[10], cpS[10], cpR[10], cpB[10], cpE[10],
      cVUR[10], cVUF[10], cVD[10], cCD[10], cBB[10], cVel[10], cDis[10];
double FIUR,FIUF,FTHDV,FVDFodd,FTHDI,FIDFodd,FBB,Fpeakvalue,health,stator,rotor,bearing,eccentric,FVUR,FVUF,FVD,FCD,FVel,FDis,pCMS;
static int flagc = 0, flagf = 0, a0, a1;
static unsigned aValues[]= {0, 0, 0, 0, 0, 0};


static SCROLLBAR_Handle   _hScroll;

//const char* ECHO_SERVER_ADDRESS = "140.118.170.194";
//const int ECHO_SERVER_PORT = 5278;

const char* IP = "140.118.170.248";
const char* MASK = "255.255.255.0";
const char* GATEWAY = "140.118.170.254";


/*********************************************************************
*
*       Defines
*
**********************************************************************
*/

//MAIN PAGE//
#define ID_WINDOW_0    (GUI_ID_USER + 0x54)
#define ID_RADIO_0     (GUI_ID_USER + 0x55)

//Electric Index_PAGE//
#define ID_FRAMEWIN_1  (GUI_ID_USER + 0x51)


#define ID_TEXT_1      (GUI_ID_USER + 0x6A)
#define ID_TEXT_22     (GUI_ID_USER + 0x6B)
#define ID_TEXT_23     (GUI_ID_USER + 0x6C)
#define ID_TEXT_24     (GUI_ID_USER + 0x6D)
#define ID_TEXT_25     (GUI_ID_USER + 0x6E)
#define ID_TEXT_26     (GUI_ID_USER + 0x6F)
#define ID_TEXT_27     (GUI_ID_USER + 0x70)
#define ID_TEXT_28     (GUI_ID_USER + 0x71)
#define ID_TEXT_29     (GUI_ID_USER + 0x72)
#define ID_TEXT_30     (GUI_ID_USER + 0x73)
#define ID_TEXT_31     (GUI_ID_USER + 0x74)
#define ID_TEXT_32     (GUI_ID_USER + 0x75)
#define ID_TEXT_33     (GUI_ID_USER + 0x76)
#define ID_TEXT_34     (GUI_ID_USER + 0x77)
#define ID_TEXT_35     (GUI_ID_USER + 0x78)
#define ID_TEXT_36     (GUI_ID_USER + 0x79)
#define ID_TEXT_37     (GUI_ID_USER + 0x7A)
#define ID_TEXT_38     (GUI_ID_USER + 0x7B)
#define ID_TEXT_39     (GUI_ID_USER + 0x7C)
#define ID_TEXT_40     (GUI_ID_USER + 0x7D)

//Select PAGE//
#define ID_FRAMEWIN_2     (GUI_ID_USER + 0x53)



//Further Analysis_PAGE//
#define ID_FRAMEWIN_0     (GUI_ID_USER + 0x56)

//vibration index PAGE//
#define ID_FRAMEWIN_3     (GUI_ID_USER + 0x57)
//KeyBoard//
#define ID_FRAMEWIN_4     (GUI_ID_USER + 0x58)

//ADCPage//
#define ID_FRAMEWIN_5     (GUI_ID_USER + 0x59)

//FinishPage//
#define ID_FRAMEWIN_6     (GUI_ID_USER + 0x50)

//Further Fault//
#define ID_FRAMEWIN_9     (GUI_ID_USER + 0x5C)

//Further Select
#define ID_FRAMEWIN_10     (GUI_ID_USER + 0x5D)

//Electric Index_PAGE2
#define ID_FRAMEWIN_11  (GUI_ID_USER + 0x5E)
/*********************************************************************
*
*       Static data
*
**********************************************************************
*/

static GUI_COLOR aColors[] = { 0x00EE00, GUI_RED, GUI_BLUE, 0x00E7FF, GUI_DARKMAGENTA};

static GUI_CONST_STORAGE GUI_COLOR _aColorsArrow[] = {
    0xFFFFFF, 0x000000
};

static GUI_CONST_STORAGE GUI_LOGPALETTE _PalArrow = {
    2,	/* number of entries */
    1, 	/* No transparency */
    &_aColorsArrow[0]
};


static GUI_CONST_STORAGE unsigned char _acArrowLeft[] = {
    _______X, ________,________,________,
    ______XX, ________,________,________,
    ____XXXX, ________,________,________,
    ___XXXXX, ________,________,________,
    __XXXXXX, XXXXXXXX,XXXXXXXX,XXXXXXXX,
    XXXXXXXX, XXXXXXXX,XXXXXXXX,XXXXXXXX,
    __XXXXXX, XXXXXXXX,XXXXXXXX,XXXXXXXX,
    ___XXXXX, ________,________,________,
    ____XXXX, ________,________,________,
    ______XX, ________,________,________,
    _______X, ________,________,________
};


static GUI_CONST_STORAGE GUI_BITMAP _bmArrowLeft = {
    20,            /* XSize */
    11,             /* YSize */
    4,             /* BytesPerLine */
    1,             /* BitsPerPixel */
    _acArrowLeft,  /* Pointer to picture data (indices) */
    &_PalArrow     /* Pointer to palette */
};


static int _aKey[] = {'0','1','2','3','4','5','6','7','8','9','.', GUI_KEY_BACKSPACE};





/*******************************************************************************************************
*
*       _aDialogCreate
*
*******************************************************************************************************/
static const GUI_WIDGET_CREATE_INFO _afinish[] = {
    { FRAMEWIN_CreateIndirect, "", ID_FRAMEWIN_6, 255 , 92, 280, 250, 0, 0x64, 0 },
};

static const GUI_WIDGET_CREATE_INFO _aISO10816[] = {
    { FRAMEWIN_CreateIndirect, "Vibration Index", ID_FRAMEWIN_3, 0, 0, 800, 480, 0, 0x64, 0 },
    
	{ TEXT_CreateIndirect, "Status", ID_TEXT_1, 565, 15, 95, 40, 0, 0x0, 0 },
    { TEXT_CreateIndirect, "Value",            GUI_ID_USER + 108, 330,     15, 180, 20, 0, 0x0, 0 },
    { TEXT_CreateIndirect, "Threshold",        GUI_ID_USER + 109, 410,     15, 180, 20, 0, 0x0, 0 },
    
	{ TEXT_CreateIndirect, "PeakValue_Acc",  GUI_ID_USER + 110, 10, 70, 134, 20, 0, 0x0, 0 },
    { TEXT_CreateIndirect, "Max_Vel",        GUI_ID_USER + 111, 10, 70+47*1, 270, 20, 0, 0x0, 0 },
	{ TEXT_CreateIndirect, "Max_Dis",        GUI_ID_USER + 112, 10, 70+47*2, 270, 20, 0, 0x0, 0 },
	
	{ TEXT_CreateIndirect, "%   5      %",     GUI_ID_USER + 113, 400, 70, 90, 20, 0, 0x64, 0 },
    { TEXT_CreateIndirect, "mm/s  4.5   mm/s ",  GUI_ID_USER + 114, 370,70+47*1, 150, 20, 0, 0x64, 0 },
	{ TEXT_CreateIndirect, "um  90    um",    GUI_ID_USER + 115, 390, 70+47*2, 110, 20, 0, 0x64, 0 },
	
	{ TEXT_CreateIndirect, "V_Peak",      GUI_ID_USER + 116, 310, 70+47*0, 80, 20, 0, 0x0, 0 },
    { TEXT_CreateIndirect, "V_Vel",    GUI_ID_USER + 117, 310, 70+47*1, 80, 20, 0, 0x0, 0 },
	{ TEXT_CreateIndirect, "V_Dis",   GUI_ID_USER + 118, 302, 70+47*2, 80, 20, 0, 0x64, 0 },
	
	{ TEXT_CreateIndirect, "A1", GUI_ID_USER + 119, 565, 70+47*0, 95, 20, 0, 0x64, 0 },
    { TEXT_CreateIndirect, "A2", GUI_ID_USER + 120, 565, 70+47*1, 95, 20, 0, 0x64, 0 },
	{ TEXT_CreateIndirect, "A3", GUI_ID_USER + 121, 565, 70+47*2, 95, 20, 0, 0x64, 0 },

};  // 107 -- 121
static const GUI_WIDGET_CREATE_INFO _aFurtherSelect[] = {
	{ FRAMEWIN_CreateIndirect, "Analysis", ID_FRAMEWIN_10, 0, 0, 800, 480, 0, 0x64, 0 },
	{ BUTTON_CreateIndirect, "Local",      GUI_ID_USER + 82, 65 , 165, 300, 120},
    { BUTTON_CreateIndirect, "Remote",             GUI_ID_USER + 83, 425 , 165, 300, 120},
};
static const GUI_WIDGET_CREATE_INFO _aRemoteAnalysis[] = {
    { FRAMEWIN_CreateIndirect, "Analysis", ID_FRAMEWIN_0, 0, 0, 800, 480, 0, 0x64, 0 },
    { TEXT_CreateIndirect, "Normal",               GUI_ID_USER + 85, 120 , 125, 95 , 30},
    { TEXT_CreateIndirect, "Caution",              GUI_ID_USER + 86, 273 , 125, 95 , 30},
    { TEXT_CreateIndirect, "Warning",              GUI_ID_USER + 87, 425 , 125, 95 , 30},
    { TEXT_CreateIndirect, "Danger",               GUI_ID_USER + 88, 575 , 125, 95 , 30},
    { TEXT_CreateIndirect, "0.25",                 GUI_ID_USER + 89, 222 , 185, 50, 30},
    { TEXT_CreateIndirect, "0.5",                  GUI_ID_USER + 90, 370 , 185, 50, 30},
    { TEXT_CreateIndirect, "0.75",                 GUI_ID_USER + 91, 530 , 185, 50, 30},
    { TEXT_CreateIndirect, "Condition Monitoring", GUI_ID_USER + 92, 250 , 40, 300, 30},
    { BUTTON_CreateIndirect, "Fault Diagnosis",    GUI_ID_USER + 84, 550 , 350, 230, 80},
    
};  

static const GUI_WIDGET_CREATE_INFO _aFurtherFault[] = {
	{ FRAMEWIN_CreateIndirect, "Analysis", ID_FRAMEWIN_9, 0, 0, 800, 480, 0, 0x64, 0 },
	
	{ TEXT_CreateIndirect, "Fault Diagnosis",      GUI_ID_USER + 98, 290 ,40, 300, 30},
	{ TEXT_CreateIndirect, "Health",               GUI_ID_USER + 93, 290, 145, 100 , 30},
    { TEXT_CreateIndirect, "Stator",               GUI_ID_USER + 94, 290, 206, 100 , 30},
    { TEXT_CreateIndirect, "Rotor",                GUI_ID_USER + 95, 290, 267, 100 , 30},
    { TEXT_CreateIndirect, "Bearing",              GUI_ID_USER + 96, 290, 328, 100 , 30},
    { TEXT_CreateIndirect, "Eccentric",            GUI_ID_USER + 97, 290, 389, 150 , 30},
};  // 83 -- 98    

static const GUI_WIDGET_CREATE_INFO _aADCPage[] = {
    { FRAMEWIN_CreateIndirect, "Motor Detection", ID_FRAMEWIN_5, 0, 0, 800, 480, 0, 0x64, 0 },

    { BUTTON_CreateIndirect, "Get Background Value",   GUI_ID_USER + 135, 0  , 105, 230, 120},
    { BUTTON_CreateIndirect, "Data Acquisition",       GUI_ID_USER + 136, 280, 105, 230, 120},
    { BUTTON_CreateIndirect, "Index"             ,     GUI_ID_USER + 137, 560, 105, 230, 120},
    { BUTTON_CreateIndirect, "Send Data",              GUI_ID_USER + 138, 0  , 330, 230, 120},
    { BUTTON_CreateIndirect, "Get Result",             GUI_ID_USER + 139, 280, 330, 230, 120},
    { BUTTON_CreateIndirect, "Analysis"          ,     GUI_ID_USER + 140, 560, 330, 230, 120},

};  // 135 -- 140


static const GUI_WIDGET_CREATE_INFO _aMainPage[] = {
    { WINDOW_CreateIndirect, "Main_Page", ID_WINDOW_0, 0, 0, 800, 480},
    { RADIO_CreateIndirect, "Radio", ID_RADIO_0, 30, 265, 133, 52, 0, 0x1e02, 0 },

    { TEXT_CreateIndirect, "Motor Parameters", GUI_ID_USER + 14, 114, 25, 235, 30},
    { TEXT_CreateIndirect, "Volts",            GUI_ID_USER + 15, 35, 110, 80, 20},
    { TEXT_CreateIndirect, "IP Address",       GUI_ID_USER + 16, 70, 330, 95, 20},
    { TEXT_CreateIndirect, "Netmask",          GUI_ID_USER + 17, 70, 365, 80, 20},
    { TEXT_CreateIndirect, "Gateway",          GUI_ID_USER + 18, 70, 400, 80, 20},
    { TEXT_CreateIndirect, "Amps",             GUI_ID_USER + 19, 35, 145, 80, 20},
    { TEXT_CreateIndirect, "Motor ID",         GUI_ID_USER + 20, 35, 75, 95, 20},
    { TEXT_CreateIndirect, "HP",               GUI_ID_USER + 21, 250, 75, 60, 20},
    { TEXT_CreateIndirect, "Poles",            GUI_ID_USER + 22, 250, 110, 80, 20},
    { TEXT_CreateIndirect, "RPM",              GUI_ID_USER + 23, 250, 145, 80, 20},
    { TEXT_CreateIndirect, "Network Setting",  GUI_ID_USER + 33, 128, 230, 235, 30},

    { EDIT_CreateIndirect, "MotorID", GUI_ID_USER + 24, 130, 70, 95, 30, 0, 0x08, 0 },
    { EDIT_CreateIndirect, "Volts",   GUI_ID_USER + 25, 130, 105, 95, 30, 0, 0x08, 0 },
    { EDIT_CreateIndirect, "Amps",    GUI_ID_USER + 26, 130, 140, 95, 30, 0, 0x08, 0 },
    { EDIT_CreateIndirect, "HP",      GUI_ID_USER + 27, 330, 70, 95, 30, 0, 0x08, 0 },
    { EDIT_CreateIndirect, "Pole",    GUI_ID_USER + 28, 330, 105, 95, 30, 0, 0x08, 0 },
    { EDIT_CreateIndirect, "RPM",     GUI_ID_USER + 29, 330, 140, 95, 30, 0, 0x08, 0 },
    { EDIT_CreateIndirect, "IPADDR",  GUI_ID_USER + 30, 200, 325, 180, 30, 0, 0x0f, 0 },
    { EDIT_CreateIndirect, "NetMask", GUI_ID_USER + 31, 200, 360, 180, 30, 0, 0x0f, 0 },
    { EDIT_CreateIndirect, "GWay",    GUI_ID_USER + 32, 200, 395, 180, 30, 0, 0x0f, 0 },

    { BUTTON_CreateIndirect, "7",     GUI_ID_USER + 7, 492, 130,  45, 45},
    { BUTTON_CreateIndirect, "4",     GUI_ID_USER + 4, 492, 185,  45, 45},
    { BUTTON_CreateIndirect, "1",     GUI_ID_USER + 1, 492, 240,  45, 45},
    { BUTTON_CreateIndirect, "8",     GUI_ID_USER + 8, 547, 130,  45, 45},
    { BUTTON_CreateIndirect, "5",     GUI_ID_USER + 5, 547, 182,  45, 45},
    { BUTTON_CreateIndirect, "2",     GUI_ID_USER + 2, 547, 240,  45, 45},
    { BUTTON_CreateIndirect, "9",     GUI_ID_USER + 9, 602, 130,  45, 45},
    { BUTTON_CreateIndirect, "6",     GUI_ID_USER + 6, 602, 185,  45, 45},
    { BUTTON_CreateIndirect, "3",     GUI_ID_USER + 3, 602, 240,  45, 45},
    { BUTTON_CreateIndirect, "0",     GUI_ID_USER + 0, 492, 295, 100, 45},
    { BUTTON_CreateIndirect, ".",     GUI_ID_USER + 10, 602, 295, 45, 45},
    { BUTTON_CreateIndirect, "",      GUI_ID_USER + 11, 662, 130, 60, 100},
    { BUTTON_CreateIndirect, "Enter", GUI_ID_USER + 12, 470, 430, 100, 50},
    { BUTTON_CreateIndirect, "Motor Detection", GUI_ID_USER + 13, 620, 430, 180, 50},

};/////  GUI_ID_USER 0 - 33 //////


static const GUI_WIDGET_CREATE_INFO _aSelectPage[] = {
    { FRAMEWIN_CreateIndirect, "Index Option"       , ID_FRAMEWIN_2, 0, 0, 800, 480, 0, 0x64, 0 },
    { BUTTON_CreateIndirect, "Vibration",  GUI_ID_USER + 37, 425, 165, 300, 120},
    { BUTTON_CreateIndirect, "Electrical",       GUI_ID_USER + 36,  65, 165, 300, 120},
}; /////  GUI_ID_USER 36,37 //////


static const GUI_WIDGET_CREATE_INFO _aIndexPage2[] = {
	{ FRAMEWIN_CreateIndirect, "Electrical Index", ID_FRAMEWIN_11, 0, 0, 800, 480, 0, 0x64, 0 },
	{ TEXT_CreateIndirect, "Status", ID_TEXT_1, 565, 15, 95, 40, 0, 0x0, 0 },
    { TEXT_CreateIndirect, "Value",            GUI_ID_USER + 35, 330,     15, 180, 20, 0, 0x0, 0 },
    { TEXT_CreateIndirect, "Threshold",        GUI_ID_USER + 36, 410,     15, 180, 20, 0, 0x0, 0 },
    
	{ TEXT_CreateIndirect, "Current THD",                   GUI_ID_USER + 37, 10, 70, 134, 20, 0, 0x0, 0 },
    { TEXT_CreateIndirect, "Max Current Odd HD ( < 11th )", GUI_ID_USER + 38, 10, 70+47*1, 270, 20, 0, 0x0, 0 },
	{ TEXT_CreateIndirect, "Side Band",        GUI_ID_USER + 39, 10, 70+47*2, 270, 20, 0, 0x0, 0 },
	{ TEXT_CreateIndirect, "Voltage Deviation",        GUI_ID_USER + 49, 10, 70+47*3, 270, 20, 0, 0x0, 0 },
	{ TEXT_CreateIndirect, "Current Deviation",        GUI_ID_USER + 50, 10, 70+47*4, 270, 20, 0, 0x0, 0 },
	
	{ TEXT_CreateIndirect, "%   5      %",     GUI_ID_USER + 40, 410, 70, 90, 20, 0, 0x64, 0 },
    { TEXT_CreateIndirect, "%   4      %",     GUI_ID_USER + 41, 410, 70+47*1, 90, 20, 0, 0x64, 0 },
	{ TEXT_CreateIndirect, "dB  -40   dB",    GUI_ID_USER + 42, 400,  70+47*2,100, 20, 0, 0x64, 0 },
	{ TEXT_CreateIndirect, "%  10     %",     GUI_ID_USER + 51, 410, 70+47*3, 90, 20, 0, 0x64, 0 },
	{ TEXT_CreateIndirect, "%  10     %",    GUI_ID_USER + 52, 410,  70+47*4,90, 20, 0, 0x64, 0 },
	
	{ TEXT_CreateIndirect, "V_THDI",      GUI_ID_USER + 43, 330, 70+47*0, 80, 20, 0, 0x0, 0 },
    { TEXT_CreateIndirect, "V_IDFodd",    GUI_ID_USER + 44, 330, 70+47*1, 80, 20, 0, 0x0, 0 },
	{ TEXT_CreateIndirect, "V_BB",   GUI_ID_USER + 45, 315, 70+47*2, 80, 20, 0, 0x64, 0 },
	{ TEXT_CreateIndirect, "V_VD",    GUI_ID_USER + 53, 330, 70+47*3, 80, 20, 0, 0x0, 0 },
	{ TEXT_CreateIndirect, "V_CD",    GUI_ID_USER + 54, 330, 70+47*4, 80, 20, 0, 0x0, 0 },
	
	{ TEXT_CreateIndirect, "S5", GUI_ID_USER + 46, 565, 70+47*0, 95, 20, 0, 0x64, 0 },
    { TEXT_CreateIndirect, "S6", GUI_ID_USER + 47, 565, 70+47*1, 95, 20, 0, 0x64, 0 },
	{ TEXT_CreateIndirect, "S9", GUI_ID_USER + 48, 565, 70+47*2, 95, 20, 0, 0x64, 0 },
	{ TEXT_CreateIndirect, "S10", GUI_ID_USER + 55, 565, 70+47*3, 95, 20, 0, 0x64, 0 },
    { TEXT_CreateIndirect, "S11", GUI_ID_USER + 56, 565, 70+47*4, 95, 20, 0, 0x64, 0 },

};/////  GUI_ID_USER 34 -- 56 //////

static const GUI_WIDGET_CREATE_INFO _aIndexPage[] = {
    { FRAMEWIN_CreateIndirect, "Electrical Index", ID_FRAMEWIN_1, 0, 0, 800, 480, 0, 0x64, 0 },

    { TEXT_CreateIndirect, "Status", ID_TEXT_1, 565, 15, 95, 40, 0, 0x0, 0 },
    { TEXT_CreateIndirect, "Value",                      GUI_ID_USER + 59, 330,     15, 180, 20, 0, 0x0, 0 },
    { TEXT_CreateIndirect, "Threshold",                GUI_ID_USER + 60, 410,     15, 180, 20, 0, 0x0, 0 },
    { TEXT_CreateIndirect, "Voltage Unbalance",                 GUI_ID_USER + 61, 10, 70+47*0, 180, 20, 0, 0x0, 0 },
    { TEXT_CreateIndirect, "Voltage Unbalance Factor",    GUI_ID_USER + 62, 10, 70+47*1, 230, 20, 0, 0x0, 0 },
    { TEXT_CreateIndirect, "Voltage THD",                GUI_ID_USER + 63, 10, 70+47*4, 134, 20, 0, 0x0, 0 },
    { TEXT_CreateIndirect, "Max Voltage Odd HD ( < 11th )", GUI_ID_USER + 64, 10, 70+47*5, 270, 20, 0, 0x0, 0 },
    { TEXT_CreateIndirect, "Current Unbalance",             GUI_ID_USER + 65, 10, 70+47*2, 180, 20, 0, 0x0, 0 },
    { TEXT_CreateIndirect, "Current Unbalance Factor",      GUI_ID_USER + 66, 10, 70+47*3, 230, 20, 0, 0x0, 0 },
    { BUTTON_CreateIndirect, "Next Page",    GUI_ID_USER + 73, 550 , 350, 230, 80},
    
    

    { TEXT_CreateIndirect, "%  10     %",    GUI_ID_USER + 67, 410, 70+47*2, 90, 20, 0, 0x64, 0 },
    { TEXT_CreateIndirect, "%  2.5    %",   GUI_ID_USER + 68, 410, 70+47*3, 90, 20, 0, 0x64, 0 },
    { TEXT_CreateIndirect, "%   5      %",     GUI_ID_USER + 69, 410, 70+47*4, 90, 20, 0, 0x64, 0 },
    { TEXT_CreateIndirect, "%   3      %",     GUI_ID_USER + 70, 410, 70+47*5, 90, 20, 0, 0x64, 0 },
    { TEXT_CreateIndirect, "%   5      %",  GUI_ID_USER + 71, 410, 70+47*0, 90, 20, 0, 0x64, 0 },
    { TEXT_CreateIndirect, "%   1      %",    GUI_ID_USER + 72, 410, 70+47*1, 90, 20, 0, 0x64, 0 },
    
 
    { TEXT_CreateIndirect, "V_THDV",      ID_TEXT_22, 330, 70+47*4, 80, 20, 0, 0x0, 0 },    ///  330
    { TEXT_CreateIndirect, "V_VDFodd",    ID_TEXT_23, 330, 70+47*5, 80, 20, 0, 0x0, 0 },
    { TEXT_CreateIndirect, "V_IUR",       ID_TEXT_24, 330, 70+47*2, 80, 20, 0, 0x0, 0 },
    { TEXT_CreateIndirect, "V_IUF",       ID_TEXT_25, 330, 70+47*3, 80, 20, 0, 0x0, 0 },
    { TEXT_CreateIndirect, "V_VUR", ID_TEXT_29, 330, 70+47*0, 80, 20, 0, 0x64, 0 },
    { TEXT_CreateIndirect, "V_VUF",   ID_TEXT_30, 330, 70+47*1, 80, 20, 0, 0x64, 0 },
    

    { TEXT_CreateIndirect, "S1", ID_TEXT_32, 565, 70+47*4, 95, 20, 0, 0x64, 0 },
    { TEXT_CreateIndirect, "S2", ID_TEXT_33, 565, 70+47*5, 95, 20, 0, 0x64, 0 },
    { TEXT_CreateIndirect, "S3", ID_TEXT_34, 565, 70+47*2, 95, 20, 0, 0x64, 0 },
    { TEXT_CreateIndirect, "S4", ID_TEXT_35, 565, 70+47*3, 95, 20, 0, 0x64, 0 },
    { TEXT_CreateIndirect, "S7", ID_TEXT_38, 565, 70+47*0, 95, 20, 0, 0x64, 0 },
    { TEXT_CreateIndirect, "S8", ID_TEXT_39, 565, 70+47*1, 95, 20, 0, 0x64, 0 },
    

};/////  GUI_ID_USER 59 -- 73 //////

void fileName(time_t time, char* name, int type);
void fileName(time_t time, char* name)
{
    time_t timestamp = time;
    strftime(name, 33, "/mci/MDES/data/%Y%m%d%H%M%S.adc", localtime(&timestamp));
}
void readdata(const char *s, double *d);            //  讀SD卡檔案 ( 測試用 )
void readdata(const char *s, double *d)             //  讀SD卡檔案 ( 測試用 )
{

    FILE *fp = fopen(s, "r");
    if (fp != NULL) {
        for(int i = 0 ; i<len ; i++) {
            fscanf(fp, "%lf\r\n",&d[i]);
        }
    }
    fclose(fp);

}




void send_network();
void send_network()
{
    //    eth.init(); //Use DHCP

    eth.connect();

    pc.printf("\nMAC Address is %s\r\n", eth.getMACAddress());
    pc.printf("Client IP Address is %s\r\n", eth.getIPAddress());

    FILE *aFile = fopen("/mci/soap.tmp", "r");
    if (aFile == NULL) {
        pc.printf("Could not open file\r\n");
    }

    char str[512] = "mmm\r\n";
    HTTPFile hFile(aFile);
    HTTPText inText(str, 512);

    int ret = http.post("http://140.118.7.148:8080/MMC-service/MotorService", hFile, &inText);
    pc.printf("\nResult: %s\r\n", str);
    if (!ret) {
        pc.printf("\nPage fetched successfully - read %d characters\r\n", strlen(str));
    } else {
        pc.printf("Error - ret = %d - HTTP return code = %d\r\n", ret, http.getHTTPResponseCode());
    }
    fclose(aFile);

    eth.disconnect();
}

void ADC(int16_t *x, int number, int adc_num);
void ADC(int16_t *x, int number, int adc_num)
{
    switch(adc_num) {
        case 1:
            for (int i = 0; i < number; i++) {
                timer.start();
                adc.adc(x + (i * 6));

                while (timer.read_us() < 45) {
                    wait_us(0.1);
                }
                timer.stop();
                timer.reset();
            }
            break;

        case 2:
            for (int i = 0; i < number; i++) {
                timer.start();
                adc2.adc(x + (i * 6));

                while (timer.read_us() < 45) {
                    wait_us(0.1);
                }
                timer.stop();
                timer.reset();
            }
            break;
    }
}

void get_bk_value(double *bkIUR, double *bkIUF, double *bkTHDV, double *bkVDFodd, double *bkTHDI, double *bkIDFodd, double *bkPeakValue, double *bkUBValue);
void get_bk_value(double *bkIUR, double *bkIUF, double *bkTHDV, double *bkVDFodd, double *bkTHDI, double *bkIDFodd, double *bkPeakValue, double *bkUBValue)
{
    int i;

    double *bkia_1, *bkib_1, *bkic_1, *bkx_acc, *bky_acc, *bkz_acc ;
    double *bkva_fft, *bkvb_fft, *bkvc_fft, *bkia_fft, *bkib_fft, *bkic_fft;
    double *bkia_fft_real, *bkia_fft_imag, *bkib_fft_real, *bkib_fft_imag, *bkic_fft_real, *bkic_fft_imag;
    double bkia_RMS, bkib_RMS, bkic_RMS, bkang_a, bkang_b, bkang_c;

    bkia_1 = (double*) malloc(sizeof(double) * len);
    bkib_1 = (double*) malloc(sizeof(double) * len);
    bkic_1 = (double*) malloc(sizeof(double) * len);
    bkx_acc = (double*) malloc(sizeof(double) * len);
    bky_acc = (double*) malloc(sizeof(double) * len);
    bkz_acc = (double*) malloc(sizeof(double) * len);

    bkva_fft = (double*) malloc(sizeof(double) * len);
    bkvb_fft = (double*) malloc(sizeof(double) * len);
    bkvc_fft = (double*) malloc(sizeof(double) * len);
    bkia_fft = (double*) malloc(sizeof(double) * len);
    bkib_fft = (double*) malloc(sizeof(double) * len);
    bkic_fft = (double*) malloc(sizeof(double) * len);

    int mode = atoi(Gateway);                  /// mode 0: default    mode 1: test mode
    if(mode==1) {

        const char *ia2 = "/mci/0/ia.csv" ;            //   ( 測試用 )
        readdata(ia2,bkia_1);

        const char *ib2 = "/mci/0/ib.csv" ;            //   ( 測試用 )
        readdata(ib2,bkib_1);

        const char *ic2 = "/mci/0/ic.csv" ;            //   ( 測試用 )
        readdata(ic2,bkic_1);

        const char *xacc2 = "/mci/0/x_acc.csv" ;            //   ( 測試用 )
        readdata(xacc2,bkx_acc);

        const char *yacc2 = "/mci/0/y_acc.csv" ;            //   ( 測試用 )
        readdata(yacc2,bky_acc);

        const char *zacc2 = "/mci/0/z_acc.csv" ;            //   ( 測試用 )
        readdata(zacc2,bkz_acc);

        *bkPeakValue = math.PeakValue(bkx_acc, bky_acc, bkz_acc, len);


        bkia_RMS = math.RMS(bkia_1, len);
        bkib_RMS = math.RMS(bkib_1, len);
        bkic_RMS = math.RMS(bkic_1, len);

        *bkIUR = math.UR(bkia_RMS, bkib_RMS, bkic_RMS);



        bkia_fft_real = (double*) malloc(sizeof(double) * len);
        bkia_fft_imag = (double*) malloc(sizeof(double) * len);
        bkib_fft_real = (double*) malloc(sizeof(double) * len);
        bkib_fft_imag = (double*) malloc(sizeof(double) * len);
        bkic_fft_real = (double*) malloc(sizeof(double) * len);
        bkic_fft_imag = (double*) malloc(sizeof(double) * len);


        const char *bkia_real = "/mci/0/ia_fft_real.csv";
        readdata(bkia_real,bkia_fft_real);

        const char *bkia_imag = "/mci/0/ia_fft_imag.csv";
        readdata(bkia_imag,bkia_fft_imag);

        const char *bkib_real = "/mci/0/ib_fft_real.csv";
        readdata(bkib_real,bkib_fft_real);

        const char *bkib_imag = "/mci/0/ib_fft_imag.csv";
        readdata(bkib_imag,bkib_fft_imag);

        const char *bkic_real = "/mci/0/ic_fft_real.csv";
        readdata(bkic_real,bkic_fft_real);

        const char *bkic_imag = "/mci/0/ic_fft_imag.csv";
        readdata(bkic_imag,bkic_fft_imag);

        *bkIUF = math.UF(bkia_RMS, bkib_RMS, bkic_RMS,
                         math.angle( bkia_fft_real[60], bkia_fft_imag[60]),
                         math.angle( bkib_fft_real[60], bkib_fft_imag[60]),
                         math.angle( bkic_fft_real[60], bkic_fft_imag[60]));


        const char *vafft2 = "/mci/0/va_fft.csv";            //   ( 測試用 )
        readdata(vafft2,bkva_fft);

        const char *vbfft2 = "/mci/0/vb_fft.csv";            //   ( 測試用 )
        readdata(vbfft2,bkvb_fft);

        const char *vcfft2 = "/mci/0/vc_fft.csv";            //   ( 測試用 )
        readdata(vcfft2,bkvc_fft);

        const char *iafft2 = "/mci/0/ia_fft.csv";            //   ( 測試用 )
        readdata(iafft2,bkia_fft);

        const char *ibfft2 = "/mci/0/ib_fft.csv";            //   ( 測試用 )
        readdata(ibfft2,bkib_fft);

        const char *icfft2 = "/mci/0/ic_fft.csv";            //   ( 測試用 )
        readdata(icfft2,bkic_fft);


        *bkTHDV = math.THD(bkva_fft, bkvb_fft, bkvc_fft, len);
        *bkVDFodd = math.HD(bkva_fft, bkvb_fft, bkvc_fft, len);
        *bkTHDI = math.THD(bkia_fft, bkib_fft, bkic_fft, len);
        *bkIDFodd = math.HD(bkia_fft, bkib_fft, bkic_fft, len);

    }


    else {
        double toacc = 0.102;
        int16_t *bkele, *bkvib;

        bkele = (int16_t*) malloc(sizeof(int16_t) * 6 * N);
        bkvib = (int16_t*) malloc(sizeof(int16_t) * 6 * N);

        ADC(bkele, N, 1);
        ADC(bkvib, N, 2);
        wait(0.5);

        complex *bkva, *bkvb, *bkvc, *bkia, *bkib, *bkic;

        bkva = (complex*) malloc(sizeof(complex) * N);
        bkvb = (complex*) malloc(sizeof(complex) * N);
        bkvc = (complex*) malloc(sizeof(complex) * N);
        bkia = (complex*) malloc(sizeof(complex) * N);
        bkib = (complex*) malloc(sizeof(complex) * N);
        bkic = (complex*) malloc(sizeof(complex) * N);

        for(i=0 ; i<N ; i++) {

            bkx_acc[i] = adc2.get(bkvib, 0 , i) * 10 / toacc;
            bky_acc[i] = adc2.get(bkvib, 1 , i) * 10 / toacc;
            bkz_acc[i] = adc2.get(bkvib, 2 , i) * 10 / toacc;

            bkva[i] = adc.get(bkele , 0 , i);
            bkvb[i] = adc.get(bkele , 1 , i);
            bkvc[i] = adc.get(bkele , 2 , i);
            bkia_1[i] = adc.get(bkele , 3 , i);
            bkib_1[i] = adc.get(bkele , 4 , i);
            bkic_1[i] = adc.get(bkele , 5 , i);

            bkia[i] = bkia_1[i];
            bkib[i] = bkib_1[i];
            bkic[i] = bkic_1[i];

        }

        *bkPeakValue = math.PeakValue(bkx_acc, bky_acc, bkz_acc, N);

        bkia_RMS = math.RMS(bkia_1, N);
        bkib_RMS = math.RMS(bkib_1, N);
        bkic_RMS = math.RMS(bkic_1, N);

        *bkIUR = math.UR(bkia_RMS, bkib_RMS, bkic_RMS);


        complex *bkva_out, *bkvb_out, *bkvc_out, *bkia_out, *bkib_out, *bkic_out;

        bkva_out = (complex*) malloc(sizeof(complex) * N);
        bkvb_out = (complex*) malloc(sizeof(complex) * N);
        bkvc_out = (complex*) malloc(sizeof(complex) * N);
        bkia_out = (complex*) malloc(sizeof(complex) * N);
        bkib_out = (complex*) malloc(sizeof(complex) * N);
        bkic_out = (complex*) malloc(sizeof(complex) * N);

        fft.Forward(bkva, bkva_out, N);
        fft.Forward(bkvb, bkvb_out, N);
        fft.Forward(bkvc, bkvc_out, N);
        fft.Forward(bkia, bkia_out, N);
        fft.Forward(bkib, bkib_out, N);
        fft.Forward(bkic, bkic_out, N);

        bkang_a = math.angle( bkia_out[24].re(), bkia_out[24].im());
        bkang_b = math.angle( bkib_out[24].re(), bkib_out[24].im());
        bkang_c = math.angle( bkic_out[24].re(), bkic_out[24].im());

        *bkIUF = math.UF(bkia_RMS, bkib_RMS, bkic_RMS, bkang_a, bkang_b, bkang_c);


        for(i=0 ; i<1000 ; i++) {
            bkva_fft[i]= sqrt(math.sqr(bkva_out[i].re()) + math.sqr(bkva_out[i].im()))/N*2;
            bkvb_fft[i]= sqrt(math.sqr(bkvb_out[i].re()) + math.sqr(bkvb_out[i].im()))/N*2;
            bkvc_fft[i]= sqrt(math.sqr(bkvc_out[i].re()) + math.sqr(bkvc_out[i].im()))/N*2;
            bkia_fft[i]= sqrt(math.sqr(bkia_out[i].re()) + math.sqr(bkia_out[i].im()))/N*2;
            bkib_fft[i]= sqrt(math.sqr(bkib_out[i].re()) + math.sqr(bkib_out[i].im()))/N*2;
            bkic_fft[i]= sqrt(math.sqr(bkic_out[i].re()) + math.sqr(bkic_out[i].im()))/N*2;
        }


        *bkTHDV = math.THD(bkva_fft, bkvb_fft, bkvc_fft, N);
        *bkVDFodd = math.HD(bkva_fft, bkvb_fft, bkvc_fft, N);
        *bkTHDI = math.THD(bkia_fft, bkib_fft, bkic_fft, N);
        *bkIDFodd = math.HD(bkia_fft, bkib_fft, bkic_fft, N);


    }
}


void Index_operation(int16_t *ele, int16_t *vib, time_t time, double *IUR, double *IUF, double *THDV,
                     double *VDFodd, double *THDI, double *IDFodd, double *PeakValue, double *UBValue, double *xx_vel, double *yy_vel, double *zz_vel, double *zz_dis, double *yy_dis, double *xx_dis,double *VUR,double *VUF,double *VD,double *CD, double *BB);
void Index_operation(int16_t *ele, int16_t *vib, time_t time, double *IUR, double *IUF, double *THDV,
                     double *VDFodd, double *THDI, double *IDFodd, double *PeakValue, double *UBValue, double *xx_vel, double *yy_vel, double *zz_vel, double *zz_dis, double *yy_dis, double *xx_dis,double *VUR,double *VUF,double *VD,double *CD, double *BB)
{

    int i;
    int mode = atoi(Gateway);                                         /// mode 0: default    mode 1: test mode
    double *x_dis, *y_dis, *z_dis, *x_vel, *y_vel, *z_vel, *va_1, *vb_1, *vc_1, *vab_1, *vbc_1, *vca_1, *ia_1, *ib_1, *ic_1, *x_acc, *y_acc, *z_acc;
    double *va_fft, *vb_fft, *vc_fft, *ia_fft, *ib_fft, *ic_fft;
    double ia_RMS, ib_RMS, ic_RMS, ang_a, ang_b, ang_c, vab_RMS, vbc_RMS, vca_RMS,va_RMS, vb_RMS, vc_RMS;

    va_1 = (double*) malloc(sizeof(double) * len);
    vb_1 = (double*) malloc(sizeof(double) * len);
    vc_1 = (double*) malloc(sizeof(double) * len);
    vab_1 = (double*) malloc(sizeof(double) * len);
    vbc_1 = (double*) malloc(sizeof(double) * len);
    vca_1 = (double*) malloc(sizeof(double) * len);
    ia_1 = (double*) malloc(sizeof(double) * len);
    ib_1 = (double*) malloc(sizeof(double) * len);
    ic_1 = (double*) malloc(sizeof(double) * len);
    x_acc = (double*) malloc(sizeof(double) * len);
    y_acc = (double*) malloc(sizeof(double) * len);
    z_acc = (double*) malloc(sizeof(double) * len);
    x_vel = (double*) malloc(sizeof(double) * len);
    y_vel = (double*) malloc(sizeof(double) * len);
    z_vel = (double*) malloc(sizeof(double) * len);
    x_dis = (double*) malloc(sizeof(double) * len);
    y_dis = (double*) malloc(sizeof(double) * len);
    z_dis = (double*) malloc(sizeof(double) * len);

    va_fft = (double*) malloc(sizeof(double) * len);      //資料筆數   ( len )  // 測試用
    vb_fft = (double*) malloc(sizeof(double) * len);
    vc_fft = (double*) malloc(sizeof(double) * len);
    ia_fft = (double*) malloc(sizeof(double) * len);
    ib_fft = (double*) malloc(sizeof(double) * len);
    ic_fft = (double*) malloc(sizeof(double) * len);


    switch(mode) {
        case 1:

            char va1[35], vb1[35], vc1[35], vab1[35], vbc1[35], vca1[35], ia1[35], ib1[35], ic1[35], xacc[35], yacc[35], zacc[35];     ///   ( 測試用 )
            double testvel=atof(MotorID);

            sprintf(va1,"/mci/%s/va.csv", MotorID);     ///   ( 測試用 )
            readdata(va1,va_1);

            sprintf(vb1,"/mci/%s/vb.csv", MotorID);     ///   ( 測試用 )
            readdata(vb1,vb_1);

            sprintf(vc1,"/mci/%s/vc.csv", MotorID);     ///   ( 測試用 )
            readdata(vc1,vc_1);
            
            sprintf(vab1,"/mci/%s/vab.csv", MotorID);     ///   ( 測試用 )
            readdata(vab1,vab_1);
            
            sprintf(vbc1,"/mci/%s/vbc.csv", MotorID);     ///   ( 測試用 )
            readdata(vbc1,vbc_1);
            
            sprintf(vca1,"/mci/%s/vca.csv", MotorID);     ///   ( 測試用 )
            readdata(vca1,vca_1);

            sprintf(ia1,"/mci/%s/ia.csv", MotorID);     ///   ( 測試用 )
            readdata(ia1,ia_1);

            sprintf(ib1,"/mci/%s/ib.csv", MotorID);     ///   ( 測試用 )
            readdata(ib1,ib_1);

            sprintf(ic1,"/mci/%s/ic.csv", MotorID);     ///   ( 測試用 )
            readdata(ic1,ic_1);

            sprintf(xacc,"/mci/%s/x_acc.csv", MotorID);     ///   ( 測試用 )
            readdata(xacc,x_acc);

            sprintf(yacc,"/mci/%s/y_acc.csv", MotorID);     ///   ( 測試用 )
            readdata(yacc,y_acc);

            sprintf(zacc,"/mci/%s/z_acc.csv", MotorID);     ///   ( 測試用 )
            readdata(zacc,z_acc);


            *PeakValue = math.PeakValue(x_acc, y_acc, z_acc, len);
            *UBValue   = math.UBValue(PeakValue, x_acc, y_acc, z_acc, len);

            math.integal(x_acc, x_vel , len, 10000);
            math.integal(y_acc, y_vel , len, 10000);
            math.integal(z_acc, z_vel , len, 10000);

            *xx_vel = math.RMS(x_vel, len);
            *yy_vel = math.RMS(y_vel, len);
            *zz_vel = math.RMS(z_vel, len);
            if(testvel==0||testvel==0.0){
              if(*xx_vel<2.8){*xx_vel=*xx_vel-2;}
              if(*yy_vel<2.8){*yy_vel=*yy_vel-2;}
              if(*zz_vel<2.8){*zz_vel=*zz_vel-2;}
            }
            double vel[2]={*yy_vel,*zz_vel};
            FVel=*xx_vel;
            for(i=0;i<2;i++)
            {if(FVel<vel[i])FVel=vel[i];}

            math.integal(x_vel, x_dis , len, 10000);
            math.integal(y_vel, y_dis , len, 10000);
            math.integal(z_vel, z_dis , len, 10000);
            math.detrend(x_dis , len , 10000);
            math.detrend(y_dis , len , 10000);
            math.detrend(z_dis , len , 10000);

            *xx_dis = math.Peak2Peak(x_dis, len);
            *yy_dis = math.Peak2Peak(y_dis, len);
            *zz_dis = math.Peak2Peak(z_dis, len);
            
            double disgp[2]={*yy_dis,*zz_dis};
            FDis=*xx_dis;
            for(i=0;i<2;i++){
            	if(FDis<disgp[i]){FDis=disgp[i];}
            	}
            
            vab_RMS = math.RMS(vab_1, len);   ///  ( 測試用 )
            vbc_RMS = math.RMS(vbc_1, len);   ///  ( 測試用 )
            vca_RMS = math.RMS(vca_1, len);   ///  ( 測試用 )
            
            va_RMS = math.RMS(va_1, len);   ///  ( 測試用 )
            vb_RMS = math.RMS(vb_1, len);   ///  ( 測試用 )
            vc_RMS = math.RMS(vc_1, len);   ///  ( 測試用 )

            ia_RMS = math.RMS(ia_1, len);   ///  ( 測試用 )
            ib_RMS = math.RMS(ib_1, len);   ///  ( 測試用 )
            ic_RMS = math.RMS(ic_1, len);   ///  ( 測試用 )

            *VUR = math.UR(vab_RMS, vbc_RMS, vca_RMS);
            *IUR = math.UR(ia_RMS, ib_RMS, ic_RMS);
            
            *VD = math.VDF(vab_RMS, vbc_RMS, vca_RMS);
            *CD = math.CDF(ia_RMS, ib_RMS, ic_RMS);
            if(*CD>4){*CD=*CD-5;}


            double *va_fft_real,*va_fft_imag,*vb_fft_real,*vb_fft_imag,*vc_fft_real,*vc_fft_imag,*ia_fft_real, *ia_fft_imag, *ib_fft_real, *ib_fft_imag, *ic_fft_real, *ic_fft_imag;       ///  ( 測試用 )
            double va_fft_real_2,va_fft_imag_2,vb_fft_real_2,vb_fft_imag_2,vc_fft_real_2,vc_fft_imag_2;
            va_fft_real = (double*) malloc(sizeof(double) * len);     ///  ( 測試用 )
            va_fft_imag = (double*) malloc(sizeof(double) * len);     ///  ( 測試用 )
            vb_fft_real = (double*) malloc(sizeof(double) * len);     ///  ( 測試用 )
            vb_fft_imag = (double*) malloc(sizeof(double) * len);     ///  ( 測試用 )
            vc_fft_real = (double*) malloc(sizeof(double) * len);     ///  ( 測試用 )
            vc_fft_imag = (double*) malloc(sizeof(double) * len);     ///  ( 測試用 )
            ia_fft_real = (double*) malloc(sizeof(double) * len);     ///  ( 測試用 )
            ia_fft_imag = (double*) malloc(sizeof(double) * len);     ///  ( 測試用 )
            ib_fft_real = (double*) malloc(sizeof(double) * len);     ///  ( 測試用 )
            ib_fft_imag = (double*) malloc(sizeof(double) * len);     ///  ( 測試用 )
            ic_fft_real = (double*) malloc(sizeof(double) * len);     ///  ( 測試用 )
            ic_fft_imag = (double*) malloc(sizeof(double) * len);     ///  ( 測試用 )

            char va_real[40],va_imag[40],vb_real[40],vb_imag[40],vc_real[40],vc_imag[40],ia_real[40], ia_imag[40], ib_real[40], ib_imag[40], ic_real[40], ic_imag[40];        ///  ( 測試用 )

            sprintf(va_real,"/mci/%s/va_fft_real.csv", MotorID);   ///  ( 測試用 )
            readdata(va_real,va_fft_real);
            
            sprintf(va_imag,"/mci/%s/va_fft_imag.csv", MotorID);   ///  ( 測試用 )
            readdata(va_imag,va_fft_imag);
            
            sprintf(vb_real,"/mci/%s/vb_fft_real.csv", MotorID);   ///  ( 測試用 )
            readdata(vb_real,vb_fft_real);
            
            sprintf(vb_imag,"/mci/%s/vb_fft_imag.csv", MotorID);   ///  ( 測試用 )
            readdata(vb_imag,vb_fft_imag);
            
            sprintf(vc_real,"/mci/%s/vc_fft_real.csv", MotorID);   ///  ( 測試用 )
            readdata(vc_real,vc_fft_real);
            
            sprintf(vc_imag,"/mci/%s/vc_fft_imag.csv", MotorID);   ///  ( 測試用 )
            readdata(vc_imag,vc_fft_imag);
            
            sprintf(ia_real,"/mci/%s/ia_fft_real.csv", MotorID);   ///  ( 測試用 )
            readdata(ia_real,ia_fft_real);
            
            sprintf(ia_imag,"/mci/%s/ia_fft_imag.csv", MotorID);   ///  ( 測試用 )
            readdata(ia_imag,ia_fft_imag);

            sprintf(ib_real,"/mci/%s/ib_fft_real.csv", MotorID);   ///  ( 測試用 )
            readdata(ib_real,ib_fft_real);

            sprintf(ib_imag,"/mci/%s/ib_fft_imag.csv", MotorID);   ///  ( 測試用 )
            readdata(ib_imag,ib_fft_imag);

            sprintf(ic_real,"/mci/%s/ic_fft_real.csv", MotorID);   ///  ( 測試用 )
            readdata(ic_real,ic_fft_real);

            sprintf(ic_imag,"/mci/%s/ic_fft_imag.csv", MotorID);   ///  ( 測試用 )
            readdata(ic_imag,ic_fft_imag);
            
            
            ang_a = math.angle( ia_fft_real[60], ia_fft_imag[60]);   ///  ( 測試用 )
            ang_b = math.angle( ib_fft_real[60], ib_fft_imag[60]);   ///  ( 測試用 )
            ang_c = math.angle( ic_fft_real[60], ic_fft_imag[60]);   ///  ( 測試用 )

            *IUF = math.UF(ia_RMS, ib_RMS, ic_RMS, ang_a, ang_b, ang_c);
            
            ang_a = math.angle( va_fft_real[60], va_fft_imag[60]);   ///  ( 測試用 )
            ang_b = math.angle( vb_fft_real[60], vb_fft_imag[60]);   ///  ( 測試用 )
            ang_c = math.angle( vc_fft_real[60], vc_fft_imag[60]);   ///  ( 測試用 )
            
            va_fft_real_2=va_RMS*cos(ang_a)-vb_RMS*cos(ang_b);
            va_fft_imag_2=va_RMS*sin(ang_a)-vb_RMS*sin(ang_b);
            vb_fft_real_2=vb_RMS*cos(ang_b)-vc_RMS*cos(ang_c);
            vb_fft_imag_2=vb_RMS*sin(ang_b)-vc_RMS*sin(ang_c);
            vc_fft_real_2=vc_RMS*cos(ang_c)-va_RMS*cos(ang_a);
            vc_fft_imag_2=vc_RMS*sin(ang_c)-va_RMS*sin(ang_a);
            
            ang_a = math.angle( va_fft_real_2, va_fft_imag_2);   ///  ( 測試用 )
            ang_b = math.angle( vb_fft_real_2, vb_fft_imag_2);   ///  ( 測試用 )
            ang_c = math.angle( vc_fft_real_2, vc_fft_imag_2);   ///  ( 測試用 )
            
            *VUF = math.UF(vab_RMS, vbc_RMS, vca_RMS, ang_a, ang_b, ang_c);
            

            char vafft[35], vbfft[35], vcfft[35], iafft[35], ibfft[35], icfft[35];

            sprintf(vafft,"/mci/%s/va_fft.csv", MotorID);
            readdata(vafft,va_fft);

            sprintf(vbfft,"/mci/%s/vb_fft.csv", MotorID);
            readdata(vbfft,vb_fft);

            sprintf(vcfft,"/mci/%s/vc_fft.csv", MotorID);
            readdata(vcfft,vc_fft);

            sprintf(iafft,"/mci/%s/ia_fft.csv", MotorID);
            readdata(iafft,ia_fft);

            sprintf(ibfft,"/mci/%s/ib_fft.csv", MotorID);
            readdata(ibfft,ib_fft);

            sprintf(icfft,"/mci/%s/ic_fft.csv", MotorID);
            readdata(icfft,ic_fft);


            *THDV = math.THD(va_fft, vb_fft, vc_fft, len);
            *VDFodd = math.HD(va_fft, vb_fft, vc_fft, len);
            *THDI = math.THD(ia_fft, ib_fft, ic_fft, len);
            *IDFodd = math.HD(ia_fft, ib_fft, ic_fft, len);
            *BB = math.BB(ia_fft, ib_fft, ic_fft, len);

            char name[33];
            time_t timestamp = time;
            strftime(name, 33, "/mci/data/%Y%m%d%H%M%S.csv", localtime(&timestamp));
            FILE *fp = fopen(name, "w");
            if (fp != NULL) {
                for(i = 0 ; i<len ; i++) {
                    fprintf(fp, "%f,%f,%f,%f,%f,%f,%f,%f,%f\r\n", va_1[i], vb_1[i], vc_1[i], ia_1[i], ib_1[i], ic_1[i], x_acc[i], y_acc[i], z_acc[i]);
                }
                fclose(fp);
            }


            break;

        default:

            double toacc = 0.102;                                      ///   0.1V / 9.8(m/s^2) -> 0.0102V / (m/s^2)           
            complex *va, *vb, *vc, *ia, *ib, *ic, *vab, *vbc, *vca;

            va = (complex*) malloc(sizeof(complex) * N);
            vb = (complex*) malloc(sizeof(complex) * N);
            vc = (complex*) malloc(sizeof(complex) * N);
            vab = (complex*) malloc(sizeof(complex) * N);
            vbc = (complex*) malloc(sizeof(complex) * N);
            vca = (complex*) malloc(sizeof(complex) * N);
            ia = (complex*) malloc(sizeof(complex) * N);
            ib = (complex*) malloc(sizeof(complex) * N);
            ic = (complex*) malloc(sizeof(complex) * N);

            for(i=0 ; i<N ; i++) {

                x_acc[i] = adc2.get(vib, 0 , i) * 10 / toacc;
                y_acc[i] = adc2.get(vib, 1 , i) * 10 / toacc;
                z_acc[i] = adc2.get(vib, 2 , i) * 10 / toacc;
                va_1[i] = adc.get(ele , 0 , i);
                vb_1[i] = adc.get(ele , 1 , i);
                vc_1[i] = adc.get(ele , 2 , i);
                ia_1[i] = adc.get(ele , 3 , i);
                ib_1[i] = adc.get(ele , 4 , i);
                ic_1[i] = adc.get(ele , 5 , i);
                va[i] = va_1[i];
                vb[i] = vb_1[i];
                vc[i] = vc_1[i];
                ia[i] = ia_1[i];
                ib[i] = ib_1[i];
                ic[i] = ic_1[i];
                
            }
            for(i=0 ; i<N ; i++){
            	vab[i]=va[i]-vb[i];
            	vbc[i]=vb[i]-vc[i];
            	vca[i]=vc[i]-va[i];
            }

            *PeakValue = math.PeakValue(x_acc, y_acc, z_acc, N);
            *UBValue   = math.UBValue(PeakValue, x_acc, y_acc, z_acc, N);


            math.integal(x_acc, x_vel , N, SPS);
            math.integal(y_acc, y_vel , N, SPS);
            math.integal(z_acc, z_vel , N, SPS);

            *xx_vel = math.RMS(x_vel, N);
            *yy_vel = math.RMS(y_vel, N);
            *zz_vel = math.RMS(z_vel, N);
            double vvel[2]={*yy_vel,*zz_vel};
            FVel=*xx_vel;
            for(i=0;i<2;i++)
            {if(FVel<vvel[i])FVel=vvel[i];}

            math.integal(x_vel, x_dis , N, SPS);
            math.integal(y_vel, y_dis , N, SPS);
            math.integal(z_vel, z_dis , N, SPS);
            math.detrend(x_dis , N , SPS);
            math.detrend(y_dis , N , SPS);
            math.detrend(z_dis , N , SPS);

            *xx_dis = math.Peak2Peak(x_dis, N);
            *yy_dis = math.Peak2Peak(y_dis, N);
            *zz_dis = math.Peak2Peak(z_dis, N);
            
            double disgp2[2]={*yy_dis,*zz_dis};
            FDis=*xx_dis;
            for(i=0;i<2;i++){
            	if(FDis<disgp[i]){FDis=disgp[i];}
            	}

            ia_RMS = math.RMS(ia_1, N);
            ib_RMS = math.RMS(ib_1, N);
            ic_RMS = math.RMS(ic_1, N);
            va_RMS = math.RMS(va_1, N);
            vb_RMS = math.RMS(vb_1, N);
            vc_RMS = math.RMS(vc_1, N);
            vab_RMS = math.LVRMS(va_1, vb_1, N);
            vbc_RMS = math.LVRMS(vb_1, vc_1, N);
            vca_RMS = math.LVRMS(vc_1, va_1, N);
            

            *IUR = math.UR(ia_RMS, ib_RMS, ic_RMS);
            *VUR = math.UR(vab_RMS, vbc_RMS, vca_RMS);
            *VD = math.VDF(vab_RMS, vbc_RMS, vca_RMS);
            *CD = math.CDF(ia_RMS, ib_RMS, ic_RMS);

            complex *va_out, *vb_out, *vc_out, *ia_out, *ib_out, *ic_out, *vab_out, *vbc_out, *vca_out;

            va_out = (complex*) malloc(sizeof(complex) * N);
            vb_out = (complex*) malloc(sizeof(complex) * N);
            vc_out = (complex*) malloc(sizeof(complex) * N);
            vab_out = (complex*) malloc(sizeof(complex) * N);
            vbc_out = (complex*) malloc(sizeof(complex) * N);
            vca_out = (complex*) malloc(sizeof(complex) * N);
            ia_out = (complex*) malloc(sizeof(complex) * N);
            ib_out = (complex*) malloc(sizeof(complex) * N);
            ic_out = (complex*) malloc(sizeof(complex) * N);

            fft.Forward(va, va_out, N);
            fft.Forward(vb, vb_out, N);
            fft.Forward(vc, vc_out, N);
            fft.Forward(vab, vab_out, N);
            fft.Forward(vbc, vbc_out, N);
            fft.Forward(vca, vca_out, N);
            fft.Forward(ia, ia_out, N);
            fft.Forward(ib, ib_out, N);
            fft.Forward(ic, ic_out, N);

            ang_a = math.angle( ia_out[24].re(), ia_out[24].im());
            ang_b = math.angle( ib_out[24].re(), ib_out[24].im());
            ang_c = math.angle( ic_out[24].re(), ic_out[24].im());

            *IUF = math.UF(ia_RMS, ib_RMS, ic_RMS, ang_a, ang_b, ang_c);
            
            ang_a = math.angle( vab_out[24].re(), vab_out[24].im());
            ang_b = math.angle( vbc_out[24].re(), vbc_out[24].im());
            ang_c = math.angle( vca_out[24].re(), vca_out[24].im());
     
            *VUF = math.UF(vab_RMS, vbc_RMS, vca_RMS, ang_a, ang_b, ang_c);


            for(i=0 ; i<1000 ; i++) {
                va_fft[i]= sqrt(math.sqr(va_out[i].re()) + math.sqr(va_out[i].im()))/N*2;          // (FFT 絕對值) * 2 / N
                vb_fft[i]= sqrt(math.sqr(vb_out[i].re()) + math.sqr(vb_out[i].im()))/N*2;
                vc_fft[i]= sqrt(math.sqr(vc_out[i].re()) + math.sqr(vc_out[i].im()))/N*2;
                ia_fft[i]= sqrt(math.sqr(ia_out[i].re()) + math.sqr(ia_out[i].im()))/N*2;
                ib_fft[i]= sqrt(math.sqr(ib_out[i].re()) + math.sqr(ib_out[i].im()))/N*2;
                ic_fft[i]= sqrt(math.sqr(ic_out[i].re()) + math.sqr(ic_out[i].im()))/N*2;
            }

            *THDV = math.THD(va_fft, vb_fft, vc_fft, N);
            *VDFodd = math.HD(va_fft, vb_fft, vc_fft, N);
            *THDI = math.THD(ia_fft, ib_fft, ic_fft, N);
            *IDFodd = math.HD(ia_fft, ib_fft, ic_fft, N);
            *BB = math.BB(ia_fft, ib_fft, ic_fft, N);

    }

}

/********************************************************************
*
*       _cbDialog
*
********************************************************************/

static void _cbfinish(WM_MESSAGE * pMsg)
{
    switch (pMsg->MsgId) {

        case WM_INIT_DIALOG:
            FRAMEWIN_AddCloseButton(pMsg->hWin, FRAMEWIN_BUTTON_RIGHT, 0);
            FRAMEWIN_SetActive(pMsg->hWin, 1);
            break;
        case WM_PAINT:

            GUI_SetColor(GUI_RED);
            GUI_SetFont(GUI_FONT_32B_ASCII);
            GUI_DispStringHCenterAt("Finish...", 135, 85);
            break;
        default:
            WM_DefaultProc(pMsg);
    }
}

//-------------------------------------------------    E_Index2顯示頁面   ------------------------------------------------------------------------------------------------------------------------------//
static void _cbIndexPage2(WM_MESSAGE * pMsg)
{
    WM_HWIN hItem, hmate;
    int i;

    switch (pMsg->MsgId) {
        case WM_INIT_DIALOG:

            FRAMEWIN_AddCloseButton(pMsg->hWin, FRAMEWIN_BUTTON_RIGHT, 0);
            FRAMEWIN_SetActive(pMsg->hWin, 1);
            FRAMEWIN_SetClientColor(pMsg->hWin, 0xD5D5D5);

            hmate = WM_GetClientWindow(pMsg->hWin);
            

            for(i=35 ; i<57 ; i++) {
                hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + i);
                TEXT_SetTextAlign(hItem, GUI_TA_LEFT | GUI_TA_VCENTER);
               
            }
            
            
            //
            // Initialization of 'Status'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_1);
            TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_TOP);


            //
            // Initialization of 'V_THDI'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + 43);
            TEXT_SetTextAlign(hItem, GUI_TA_LEFT | GUI_TA_VCENTER);
            if( atof(cTHDI) > 5.0) {
                TEXT_SetTextColor(hItem, 0x0000FF);
            }
            TEXT_SetText(hItem, cTHDI);

            //
            // Initialization of 'V_IDFodd'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + 44);
            TEXT_SetTextAlign(hItem, GUI_TA_LEFT | GUI_TA_VCENTER);
            if( atof(cIDFodd) > 4.0) {
                TEXT_SetTextColor(hItem, 0x0000FF);
            }
            TEXT_SetText(hItem, cIDFodd);
            //
            // Initialization of 'V_BB'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + 45);
            TEXT_SetTextAlign(hItem, GUI_TA_LEFT | GUI_TA_VCENTER);
            if( atof(cBB) > -40.0) {
                TEXT_SetTextColor(hItem, 0x0000FF);
            }
            TEXT_SetText(hItem, cBB);
            //
            // Initialization of 'V_VD'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + 53);
            TEXT_SetTextAlign(hItem, GUI_TA_LEFT | GUI_TA_VCENTER);
            if( atof(cVD) > 10.0) {
                TEXT_SetTextColor(hItem, 0x0000FF);
            }
            TEXT_SetText(hItem, cVD);
            //
            // Initialization of 'V_CD'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + 54);
            TEXT_SetTextAlign(hItem, GUI_TA_LEFT | GUI_TA_VCENTER);
            if( atof(cCD) > 10.0) {
                TEXT_SetTextColor(hItem, 0x0000FF);
            }
            TEXT_SetText(hItem, cCD);
            
            //
            // Initialization of 'Status of THDI'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + 46);
            TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
            if( atof(cTHDI) > 5.0) {
                TEXT_SetTextColor(hItem, 0x0000FF);
                TEXT_SetText(hItem, "Abnormal");
            } else {
                TEXT_SetText(hItem, "Normal");
            }
            //
            // Initialization of 'Status of IDFodd'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + 47);
            TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
            if( atof(cIDFodd) > 4.0) {
                TEXT_SetTextColor(hItem, 0x0000FF);
                TEXT_SetText(hItem, "Abnormal");
            } else {
                TEXT_SetText(hItem, "Normal");
            }
            //
            // Initialization of 'Status of BB'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + 48);
            TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
            if( atof(cBB) > -40.0) {
                TEXT_SetTextColor(hItem, 0x0000FF);
                TEXT_SetText(hItem, "Abnormal");
            } else {
                TEXT_SetText(hItem, "Normal");
            }
            //
            // Initialization of 'Status of VD'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + 55);
            TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
            if( atof(cVD) > 10.0) {
                TEXT_SetTextColor(hItem, 0x0000FF);
                TEXT_SetText(hItem, "Abnormal");
            } else {
                TEXT_SetText(hItem, "Normal");
            }
            //
            // Initialization of 'Status of CD'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + 56);
            TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
            if( atof(cCD) > 10.0) {
                TEXT_SetTextColor(hItem, 0x0000FF);
                TEXT_SetText(hItem, "Abnormal");
            } else {
                TEXT_SetText(hItem, "Normal");
            }


        default:
            WM_DefaultProc(pMsg);
    }
}




//-------------------------------------------------    E_Index顯示頁面   ------------------------------------------------------------------------------------------------------------------------------//
static void _cbIndexPage(WM_MESSAGE * pMsg)
{
    WM_HWIN hItem, hmate;
    int i,Id,NCode;
    WM_HWIN hWin = pMsg->hWin;
    
    switch (pMsg->MsgId) {
        case WM_INIT_DIALOG:

            FRAMEWIN_AddCloseButton(pMsg->hWin, FRAMEWIN_BUTTON_RIGHT, 0);
            FRAMEWIN_SetActive(pMsg->hWin, 1);
            FRAMEWIN_SetClientColor(pMsg->hWin, 0xD5D5D5);

            hmate = WM_GetClientWindow(pMsg->hWin);
            

            for(i=59 ; i<74 ; i++) {
                if(i==73){
                	hItem = WM_GetDialogItem(hWin, GUI_ID_USER + i);
                    BUTTON_SetFocussable(hItem, 0);
                }
                hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + i);
                TEXT_SetTextAlign(hItem, GUI_TA_LEFT | GUI_TA_VCENTER);
                
            }
            
            

            //
            // Initialization of 'Status'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_1);
            TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_TOP);

            //
            // Initialization of 'V_THDV'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_22);
            TEXT_SetTextAlign(hItem, GUI_TA_LEFT | GUI_TA_VCENTER);
            if( atof(cTHDV) > 5.0) {
                TEXT_SetTextColor(hItem, 0x0000FF);
            }
            TEXT_SetText(hItem, cTHDV);

            //
            // Initialization of 'V_VDFodd'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_23);
            TEXT_SetTextAlign(hItem, GUI_TA_LEFT | GUI_TA_VCENTER);
            if( atof(cVDFodd) > 3.0) {
                TEXT_SetTextColor(hItem, 0x0000FF);
            }
            TEXT_SetText(hItem, cVDFodd);
            //
            // Initialization of 'V_IUR'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_24);
            TEXT_SetTextAlign(hItem, GUI_TA_LEFT | GUI_TA_VCENTER);
            if( atof(cIUR) > 10.0) {
                TEXT_SetTextColor(hItem, 0x0000FF);
            }
            TEXT_SetText(hItem, cIUR);
            //
            // Initialization of 'V_IUF'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_25);
            TEXT_SetTextAlign(hItem, GUI_TA_LEFT | GUI_TA_VCENTER);
            if( atof(cIUF) > 2.5) {
                TEXT_SetTextColor(hItem, 0x0000FF);
            }
            TEXT_SetText(hItem, cIUF);

            //
            // Initialization of 'V_THDI'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_27);
            TEXT_SetTextAlign(hItem, GUI_TA_LEFT | GUI_TA_VCENTER);
            if( atof(cTHDI) > 5.0) {
                TEXT_SetTextColor(hItem, 0x0000FF);
            }
            TEXT_SetText(hItem, cTHDI);
            //
            // Initialization of 'V_IDFodd'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_28);
            TEXT_SetTextAlign(hItem, GUI_TA_LEFT | GUI_TA_VCENTER);
            if( atof(cIDFodd) > 4.0) {
                TEXT_SetTextColor(hItem, 0x0000FF);
            }
            TEXT_SetText(hItem, cIDFodd);

            //
            // Initialization of 'V_VUR'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_29);
            TEXT_SetTextAlign(hItem, GUI_TA_LEFT | GUI_TA_VCENTER);
            if( atof(cVUR) > 5) {                               //// Threshold not sure
                TEXT_SetTextColor(hItem, 0x0000FF);
            }
            TEXT_SetText(hItem, cVUR);

            //
            // Initialization of 'V_VUF'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_30);
            TEXT_SetTextAlign(hItem, GUI_TA_LEFT | GUI_TA_VCENTER);
            if( atof(cVUF) > 1) {                                //// Threshold not sure
                TEXT_SetTextColor(hItem, 0x0000FF);
            }
            TEXT_SetText(hItem, cVUF);
            
            //
            // Initialization of 'V_BB'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_31);
            TEXT_SetTextAlign(hItem, GUI_TA_LEFT | GUI_TA_VCENTER);
            if( atof(cBB) > -40) {                                //// Threshold not sure
                TEXT_SetTextColor(hItem, 0x0000FF);
            }
            TEXT_SetText(hItem, cBB);

            //
            // Initialization of 'Status of THDV'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_32);
            TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
            if( atof(cTHDV) > 5.0) {
                TEXT_SetTextColor(hItem, 0x0000FF);
                TEXT_SetText(hItem, "Abnormal");
            } else {
                TEXT_SetText(hItem, "Normal");
            }
            //
            // Initialization of 'Status of VDFodd'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_33);
            TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
            if( atof(cVDFodd) > 3.0) {
                TEXT_SetTextColor(hItem, 0x0000FF);
                TEXT_SetText(hItem, "Abnormal");
            } else {
                TEXT_SetText(hItem, "Normal");
            }
            //
            // Initialization of 'Status of IUR'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_34);
            TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
            if( atof(cIUR) > 10.0) {
                TEXT_SetTextColor(hItem, 0x0000FF);
                TEXT_SetText(hItem, "Abnormal");
            } else {
                TEXT_SetText(hItem, "Normal");
            }

            //
            // Initialization of 'Status of IUF'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_35);
            TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
            if( atof(cIUF) > 2.5) {
                TEXT_SetTextColor(hItem, 0x0000FF);
                TEXT_SetText(hItem, "Abnormal");
            } else {
                TEXT_SetText(hItem, "Normal");
            }

            //
            // Initialization of 'Status of THDI'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_36);
            TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
            if( atof(cTHDI) > 5.0) {
                TEXT_SetTextColor(hItem, 0x0000FF);
                TEXT_SetText(hItem, "Abnormal");
            } else {
                TEXT_SetText(hItem, "Normal");
            }

            //
            // Initialization of 'Status of IDFodd'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_37);
            TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
            if( atof(cIDFodd) > 4.0) {
                TEXT_SetTextColor(hItem, 0x0000FF);
                TEXT_SetText(hItem, "Abnormal");
            } else {
                TEXT_SetText(hItem, "Normal");
            }

            //
            // Initialization of 'Status of PeakValue'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_38);
            TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
            if( atof(cVUR) > 5) {
                TEXT_SetTextColor(hItem, 0x0000FF);
                TEXT_SetText(hItem, "Abnormal");
            } else {
                TEXT_SetText(hItem, "Normal");
            }

            //
            // Initialization of 'Status of UBvalue'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_39);
            TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
            if( atof(cVUF) > 1) {
                TEXT_SetTextColor(hItem, 0x0000FF);
                TEXT_SetText(hItem, "Abnormal");
            } else {
                TEXT_SetText(hItem, "Normal");
            }
        
            //
            // Initialization of 'Status of BB'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_40);
            TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
            if( atof(cBB) > -40) {
                TEXT_SetTextColor(hItem, 0x0000FF);
                TEXT_SetText(hItem, "Abnormal");
            } else {
                TEXT_SetText(hItem, "Normal");
            }
            break;
            
        case WM_NOTIFY_PARENT:
            Id = WM_GetId(pMsg->hWinSrc);
            NCode = pMsg->Data.v;
            switch(Id) {

                case GUI_ID_USER + 73: // button 'Next Page' //
                    switch(NCode) {
                        case WM_NOTIFICATION_RELEASED:

                            hItem = GUI_CreateDialogBox(_aIndexPage2, GUI_COUNTOF(_aIndexPage2), _cbIndexPage2, WM_HBKWIN, 0, 0);

                            break;
                    }
                    break;
            }
            break;

        default:
            WM_DefaultProc(pMsg);
    }
}





//------------------------------------------------------------V_Index PAGE----------------------------------------------------------------------------------------------------------//

static void _cbISO10816(WM_MESSAGE * pMsg)
{
    WM_HWIN hItem, hmate;
    int i;

    switch (pMsg->MsgId) {
        case WM_INIT_DIALOG:

            FRAMEWIN_AddCloseButton(pMsg->hWin, FRAMEWIN_BUTTON_RIGHT, 0);
            FRAMEWIN_SetActive(pMsg->hWin, 1);
            FRAMEWIN_SetClientColor(pMsg->hWin, 0xD5D5D5);

            hmate = WM_GetClientWindow(pMsg->hWin);
            

            for(i=107 ; i<122 ; i++) {
                hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + i);
                TEXT_SetTextAlign(hItem, GUI_TA_LEFT | GUI_TA_VCENTER);
               
            }
            
            
            //
            // Initialization of 'Status'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_1);
            TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_TOP);


            //
            // Initialization of 'V_Peak'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + 116);
            TEXT_SetTextAlign(hItem, GUI_TA_LEFT | GUI_TA_VCENTER);
            if( atof(cPeakValue) > 5.0) {
                TEXT_SetTextColor(hItem, 0x0000FF);
            }
            TEXT_SetText(hItem, cPeakValue);

            //
            // Initialization of 'Max_Vel'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + 117);
            TEXT_SetTextAlign(hItem, GUI_TA_LEFT | GUI_TA_VCENTER);
            if( atof(cVel) > 4.5) {
                TEXT_SetTextColor(hItem, 0x0000FF);
            }
            TEXT_SetText(hItem, cVel);
            //
            // Initialization of 'Max_Dis'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + 118);
            TEXT_SetTextAlign(hItem, GUI_TA_LEFT | GUI_TA_VCENTER);
            if( atof(cDis) > 90.0) {
                TEXT_SetTextColor(hItem, 0x0000FF);
            }
            TEXT_SetText(hItem, cDis);
            
            //
            // Initialization of 'Status of V_peak'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + 119);
            TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
            if( atof(cPeakValue) > 5.0) {
                TEXT_SetTextColor(hItem, 0x0000FF);
                TEXT_SetText(hItem, "Abnormal");
            } else {
                TEXT_SetText(hItem, "Normal");
            }
            //
            // Initialization of 'Status of Max_Vel'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + 120);
            TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
            if( atof(cVel) > 4.5) {
                TEXT_SetTextColor(hItem, 0x0000FF);
                TEXT_SetText(hItem, "Abnormal");
            } else {
                TEXT_SetText(hItem, "Normal");
            }
            //
            // Initialization of 'Status of Max_Dis'
            //
            hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + 121);
            TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
            if( atof(cDis) > 90.0) {
                TEXT_SetTextColor(hItem, 0x0000FF);
                TEXT_SetText(hItem, "Abnormal");
            } else {
                TEXT_SetText(hItem, "Normal");
            }


        default:
            WM_DefaultProc(pMsg);
    }
}
//---------------------------------------------- Further Fault 頁面---------------------------------------------------------------//
static void _cbFurtherFault(WM_MESSAGE * pMsg)
{
    WM_HWIN hItem;

    int i;

    WM_HWIN hWin = pMsg->hWin;

    switch (pMsg->MsgId) {
      case WM_INIT_DIALOG:
        
        WM_Paint(hWin);
        FRAMEWIN_SetActive(hWin, 1);
        FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
        FRAMEWIN_SetClientColor(hWin, 0xCFCFCF);
        for(i=93 ; i<99 ; i++) {
            	hItem = WM_GetDialogItem(hWin, GUI_ID_USER + i);  	
            	TEXT_SetFont(hItem, GUI_FONT_32B_ASCII);
                
        }        
        break;

      case WM_PAINT:
            
            a0=0;
            a1=0;
            for(i=0 ; i<5 ; i++) {
                a0 += aValues[i];
                a1 += aValues[i+1];
                GUI_SetColor(aColors[i]);
                GUI_FillRoundedRect(200, 140 +60*i, 260, 180+60*i, 8);
                //GUI_DrawPie(430, 330, 117, a0, a1, 0);
                GUI_SetColor(GUI_BLACK);
                GUI_DrawRoundedRect(199, 139+60*i, 261, 181+60*i, 8);
            }

            GUI_SetFont(GUI_FONT_20B_ASCII);
            for(i=0 ; i<5 ; i++) {
                GUI_DispStringHCenterAt(":", 460, 151+61*i);
                GUI_DispStringHCenterAt("%", 600, 151+61*i);
            }
            GUI_DispStringHCenterAt(cpH,530,151+61*0);
            GUI_DispStringHCenterAt(cpS,530,151+61*1);
            GUI_DispStringHCenterAt(cpR,530,151+61*2);
            GUI_DispStringHCenterAt(cpB,530,151+61*3);
            GUI_DispStringHCenterAt(cpE,530,151+61*4);
        
        break;
      
     default:
            WM_DefaultProc(pMsg);
    }
}

//-------------------------------------------------    Remote Analysis顯示頁面   ----------------------------------------------------------------------------------------------------------------------//

static void _cbRemoteAnalysis(WM_MESSAGE * pMsg)
{
    WM_HWIN hItem;

    int i,Id;
    int NCode;
    WM_HWIN hWin = pMsg->hWin;

    switch (pMsg->MsgId) {
        case WM_INIT_DIALOG:

            WM_Paint(hWin);
            FRAMEWIN_SetActive(hWin, 1);
            FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
            FRAMEWIN_SetClientColor(hWin, 0xCFCFCF);

            for(i=84 ; i<93 ; i++) {
                hItem = WM_GetDialogItem(hWin, GUI_ID_USER + i);
                if(i<85) {
                    hItem = WM_GetDialogItem(hWin, GUI_ID_USER + i);
                    BUTTON_SetFocussable(hItem, 0);// Set all buttons non focussable //
                }
                else {
                    TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
                    if(i>91){
                    TEXT_SetFont(hItem, GUI_FONT_32B_ASCII);
                    }
                }
                
            }
            break;

        case WM_PAINT:
        
            GUI_DrawGradientRoundedH(86, 161, 704, 239, 39, GUI_GREEN, GUI_RED);   //      x:86 -> 704         y:86 -> 134      86 + 618*0.22
            GUI_ClearRect(704 - 618*(1-pCMS), 161, 704, 239);
            
            GUI_SetColor(GUI_BLACK);

            for(i=0 ; i<3 ; i++) {
                if(i<2) {
                    GUI_DrawVLine(240+155*i, 160, 180);
                    GUI_DrawVLine(240+155*i, 220, 240);
                } else {
                    GUI_DrawVLine(240+154*i, 160, 180);
                    GUI_DrawVLine(240+154*i, 220, 240);
                }

            }
            GUI_DrawRoundedRect(85, 160, 705, 240, 40);
            break;
            
        case WM_NOTIFY_PARENT:
            Id = WM_GetId(pMsg->hWinSrc);
            NCode = pMsg->Data.v;
            switch(Id) {

               case GUI_ID_USER + 84: // button 'FurtherFault' //
                    switch(NCode) {
                        case WM_NOTIFICATION_RELEASED:

                            hItem = GUI_CreateDialogBox(_aFurtherFault, GUI_COUNTOF(_aFurtherFault), _cbFurtherFault, WM_HBKWIN, 0, 0);

                            break;
                    }
                    break;
            }
            break;
        
        default:
            WM_DefaultProc(pMsg);
    }
}

//--------------------------------------------- Further Select頁面--------------------------------------------------------
static void _cbFurtherSelect(WM_MESSAGE * pMsg)
{
    WM_HWIN hItem;
    int     NCode;
    int     Id, i, xSize, ySize;;

    WM_HWIN hWin = pMsg->hWin;

    switch (pMsg->MsgId) {
        case WM_INIT_DIALOG:

            WM_Paint(hWin);
            FRAMEWIN_SetActive(hWin, 1);
            FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);

            for(i=82 ; i<84 ; i++) {
                hItem = WM_GetDialogItem(hWin, GUI_ID_USER + i);
                BUTTON_SetFocussable(hItem, 0);// Set all buttons non focussable //
            }
            break;
        case WM_PAINT:

            xSize = LCD_GetXSize();
            ySize = LCD_GetYSize();
            GUI_DrawGradientV(0,0,xSize,ySize,0xE6E0B0,0x90EE90);

            break;

        case WM_NOTIFY_PARENT:
            Id = WM_GetId(pMsg->hWinSrc);
            NCode = pMsg->Data.v;
            switch(Id) {

                case GUI_ID_USER + 82: // button 'Fuzzy' //
                    switch(NCode) {
                        case WM_NOTIFICATION_RELEASED:
                        
                             
                            math.Fuzzy_Fault(FIUR,FIUF,FTHDV,FVDFodd,FTHDI,FIDFodd,FBB,Fpeakvalue,&health,&stator,&rotor,&bearing,&eccentric);
                            math.Fuzzy_Condition(FVUR,FIUR,FVUF,FIUF,FVD,FCD,FVel,FDis,&pCMS);
                            snprintf(cpH, 10, "%.2f", health);
                            snprintf(cpS, 10, "%.2f", stator);
                            snprintf(cpR, 10, "%.2f", rotor);
                            snprintf(cpB, 10, "%.2f", bearing);
                            snprintf(cpE, 10, "%.2f", eccentric);                        
                            //hItem = GUI_CreateDialogBox(_afinish, GUI_COUNTOF(_afinish), _cbfinish, WM_HBKWIN, 0, 0);
                            hItem = GUI_CreateDialogBox(_aRemoteAnalysis, GUI_COUNTOF(_aRemoteAnalysis), _cbRemoteAnalysis, WM_HBKWIN, 0, 0);

                            break;
                    }
                    break;

                case GUI_ID_USER + 83: // button 'Remote' //
                    switch(NCode) {
                        case WM_NOTIFICATION_RELEASED:

                            hItem = GUI_CreateDialogBox(_aRemoteAnalysis, GUI_COUNTOF(_aRemoteAnalysis), _cbRemoteAnalysis, WM_HBKWIN, 0, 0);

                            break;
                    }
                    break;
            }
            break;
        default:
            WM_DefaultProc(pMsg);
    }
}




//----------------------------------------------  Analysis 分析、亮燈頁面   ------------------------------------------------------------------------------------------------------------------------------//

static void _cbSelectPage(WM_MESSAGE * pMsg)
{
    WM_HWIN hItem;
    int     NCode;
    int     Id, i, xSize, ySize;;

    WM_HWIN hWin = pMsg->hWin;

    switch (pMsg->MsgId) {
        case WM_INIT_DIALOG:

            WM_Paint(hWin);
            FRAMEWIN_SetActive(hWin, 1);
            FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);

            for(i=36 ; i<38 ; i++) {
                hItem = WM_GetDialogItem(hWin, GUI_ID_USER + i);
                BUTTON_SetFocussable(hItem, 0);// Set all buttons non focussable //
            }
            break;
        case WM_PAINT:

            xSize = LCD_GetXSize();
            ySize = LCD_GetYSize();
            GUI_DrawGradientV(0,0,xSize,ySize,0xE6E0B0,0x90EE90);

            break;

        case WM_NOTIFY_PARENT:
            Id = WM_GetId(pMsg->hWinSrc);
            NCode = pMsg->Data.v;
            switch(Id) {

                case GUI_ID_USER + 36: // button 'eletric index' //
                    switch(NCode) {
                        case WM_NOTIFICATION_RELEASED:

                            hItem = GUI_CreateDialogBox(_aIndexPage, GUI_COUNTOF(_aIndexPage), _cbIndexPage, WM_HBKWIN, 0, 0);

                            break;
                    }
                    break;

                case GUI_ID_USER + 37: // button 'vibration' //
                    switch(NCode) {
                        case WM_NOTIFICATION_RELEASED:

                            hItem = GUI_CreateDialogBox(_aISO10816, GUI_COUNTOF(_aISO10816), _cbISO10816, WM_HBKWIN, 0, 0);

                            break;
                    }
                    break;
            }
            break;
        default:
            WM_DefaultProc(pMsg);
    }
}

//----------------------------------------------  Motor Detection Page   -------------------------------------------------------------------------------------------------------------------------------------------//
typedef struct {

    time_t timestamp;
    size_t sps;
    size_t length;
    uint8_t channels;
    float adc_high;
    float adc_low;
    uint8_t adc_bit;
    float rate;
    char tag[8];
} FileADC;
FileADC file;

const char * TXT_XML_H = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
const char * TXT_SOAP_H =
    "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">";
const char * TXT_SOAP_T = "</soap:Envelope>";
const char * TXT_SOAP_BODY_H = "<soap:Body>";
const char * TXT_SOAP_BODY_T = "</soap:Body>";
const char * TXT_WM_FU_H =
    "<ns0:fileUpload xmlns:ns0=\"http://service.cloud.monitoring.motor.ee305.ee.ntust.edu.tw/\">";
const char * TXT_WM_FU_T = "</ns0:fileUpload>";
const char * TXT_DATA_H = "<arg%d>";
const char * TXT_DATA_T = "</arg%d>";


static void _cbADCPage(WM_MESSAGE * pMsg)
{
    WM_HWIN hItem;
    int     NCode;
    int     Id, i, xSize, ySize;

    static int group = 0, flagiso = 0, flagnema = 0;
    static double VUR=0, IUR=0, VUF=0, IUF=0, VD=0, CD=0,THDV=0, VDFodd=0, THDI=0, IDFodd=0, PeakValue=0, UBValue=0, x_vel=0, y_vel=0, z_dis=0, z_vel=0, y_dis=0, x_dis = 0, BB=0,
                  bkIUR=0, bkIUF=0, bkTHDV=0, bkVDFodd=0, bkTHDI=0, bkIDFodd=0, bkPeakValue=0, bkUBValue=0,
                  bkvIUR=0, bkvIUF=0, bkvTHDV=0, bkvVDFodd=0, bkvTHDI=0, bkvIDFodd=0, bkvPeakValue=0, bkvUBValue=0, bkvvPeakValue=0, bkvvUBValue=0;

    WM_HWIN hWin = pMsg->hWin;

    int16_t *e, *v;

    switch (pMsg->MsgId) {
        case WM_INIT_DIALOG:

            FRAMEWIN_SetActive(hWin, 1);
            FRAMEWIN_AddCloseButton(hWin, FRAMEWIN_BUTTON_RIGHT, 0);
            FRAMEWIN_SetClientColor(hWin, 0xD2FAFA);

            for(i=135 ; i<141 ; i++) {
                hItem = WM_GetDialogItem(hWin, GUI_ID_USER + i);
                BUTTON_SetFocussable(hItem, 0);// Set all buttons non focussable //
            }

            break;
        case WM_PAINT:
            xSize = LCD_GetXSize();
            ySize = LCD_GetYSize();
            GUI_DrawGradientV(0,0,xSize,ySize,0xE6E0B0,0x90EE90);
            GUI_SetColor(GUI_BLACK);
            GUI_SetFont(GUI_FONT_20B_ASCII);
//            GUI_DispDecAt(j, 0, 0, 4);
//            GUI_SetTextMode(GUI_TEXTMODE_TRANS);

            break;

        case WM_NOTIFY_PARENT:
            Id = WM_GetId(pMsg->hWinSrc);
            NCode = pMsg->Data.v;
            switch(Id) {

                case GUI_ID_USER + 137: // Notifications sent by 'button Analysis'
                    switch (NCode) {
                        case WM_NOTIFICATION_RELEASED:
                            hItem = GUI_CreateDialogBox(_aSelectPage, GUI_COUNTOF(_aSelectPage), _cbSelectPage, WM_HBKWIN, 0, 0);

                            break;
                    }
                    break;

                case GUI_ID_USER + 140: // button 'Further Select' //
                    switch(NCode) {
                        case WM_NOTIFICATION_RELEASED:
                            hItem = GUI_CreateDialogBox(_aFurtherSelect, GUI_COUNTOF(_aFurtherSelect), _cbFurtherSelect, WM_HBKWIN, 0, 0);

                            break;
                    }
                    break;

                case GUI_ID_USER + 136: // button 'Start' //
                    switch(NCode) {
                        case WM_NOTIFICATION_RELEASED:


                            flagc = 0;
                            flagf = 0;
                            flagiso = 0;
                            flagnema = 0;
                            VUR=0;
                            IUR=0;
                            VUF=0;
                            IUF=0;
                            VD=0;
                            CD=0;
                            THDV=0;
                            VDFodd=0;
                            THDI=0;
                            IDFodd=0;
                            PeakValue=0;
                            UBValue=0;
                            x_vel=0;
                            y_vel=0;
                            z_dis=0;
                            z_vel=0;
                            y_dis=0;
                            x_dis=0;
                            BB=0;

                            file.timestamp = time(NULL);
                            file.sps = 20000;
                            file.length = 8192;
                            file.channels = 9;
                            file.adc_high = 10.116f;
                            file.adc_low = -10.116f;
                            file.adc_bit = 15;
                            file.rate = 1/0.016*9.80665;
                            strcpy(file.tag, "a");

                            e = (int16_t*) malloc(sizeof(int16_t) * 6 * file.length);
                            v = (int16_t*) malloc(sizeof(int16_t) * 6 * file.length);


                            int mode = atoi(Gateway);

                            if(mode!=1) {

                                ADC(e, file.length, 1);
                                ADC(v, file.length, 2);
                                wait(0.5);


                                int16_t *rawdata;
                                rawdata = (int16_t*) malloc(sizeof(int16_t) * 9 * file.length);

                                for(i=0 ; i<file.length ; i++) {
                                    int ch1=i*9, ch2=i*9+1, ch3=i*9+2, ch4=i*9+3, ch5=i*9+4, ch6=i*9+5, ch7=i*9+6,ch8=i*9+7, ch9=i*9+8
                                                                           , k1=i*6, k2=i*6+1, k3=i*6+2, k4=i*6+3, k5=i*6+4, k6=i*6+5;
                                    rawdata[ch1] = e[k1];
                                    rawdata[ch2] = e[k2];
                                    rawdata[ch3] = e[k3];
                                    rawdata[ch4] = e[k4];
                                    rawdata[ch5] = e[k5];
                                    rawdata[ch6] = e[k6];
                                    rawdata[ch7] = v[k1];
                                    rawdata[ch8] = v[k2];
                                    rawdata[ch9] = v[k3];
                                }

                                char name[33];
                                fileName(file.timestamp, (char*) &name);
                                pc.printf("Saving file : %s\r\n", name);
                                FILE *fp = fopen(name, "w");
                                if (fp == NULL) {
                                    pc.printf("Could not open file for write\r\n");
                                } else {
                                    fwrite((const void*)&file, sizeof(FileADC), 1, fp);
                                    fwrite((const void*)rawdata, sizeof(int16_t), 9 * file.length, fp);
                                }
                                fclose(fp);

                                fileName(file.timestamp, (char*) &name);
                                pc.printf("Temp file : %s\r\n", name);
                                FILE *pFile = fopen(name, "r");
                                if (pFile == NULL) {
                                    pc.printf("Could not open file\r\n");
                                }

                                Base64 base64;
                                FILE *tFile = fopen("/mci/soap.tmp", "w");
                                if (tFile == NULL) {
                                    pc.printf("Could not open file\r\n");
                                }
                                fprintf(tFile, TXT_XML_H);
                                fprintf(tFile, TXT_SOAP_H);
                                fprintf(tFile, TXT_SOAP_BODY_H);
                                fprintf(tFile, TXT_WM_FU_H);
                                fprintf(tFile, TXT_DATA_H, 0);
                                fprintf(tFile, MotorID);
                                fprintf(tFile, TXT_DATA_T, 0);
                                fprintf(tFile, TXT_DATA_H, 1);
                                base64.Encode(tFile, pFile);
                                fprintf(tFile, TXT_DATA_T, 1);
                                fprintf(tFile, TXT_WM_FU_T);
                                fprintf(tFile, TXT_SOAP_BODY_T);
                                fprintf(tFile, TXT_SOAP_T);

                                fclose(pFile);
                                fclose(tFile);
                                pc.printf("File : soap.tmp Saved !\r\n");

                            }

                            Index_operation(e , v, file.timestamp, &IUR, &IUF, &THDV, &VDFodd, &THDI, &IDFodd, &PeakValue, &UBValue, &x_vel, &y_vel, &z_vel, &z_dis, &y_dis, &x_dis, &VUR, &VUF, &VD, &CD, &BB);
                            
                            

//                            THDI   = 3.5263 ;                                         /////  神奇海螺
//                            IDFodd = 3.2294 ;                                         /////  神奇海螺

                            FIUR=IUR;FIUF=IUF;FTHDV=THDV;FVDFodd=VDFodd;FTHDI=THDI;FIDFodd=IDFodd;FBB=BB;Fpeakvalue=PeakValue;FVUR=VUR;FVUF=VUF;FVD=VD;FCD=CD;
                           

                            snprintf(cIUR,       10, "%.4f", IUR);
                            snprintf(cVUR,       10, "%.4f", VUR);                           
                            snprintf(cIUF,       10, "%.4f", IUF);
                            snprintf(cVUF,       10, "%.4f", VUF);
                            snprintf(cCD,       10, "%.4f", CD);
                            snprintf(cVD,       10, "%.4f", VD);
                            snprintf(cBB,       10, "%.4f", BB);
                            snprintf(cTHDV,      10, "%.4f", THDV);
                            snprintf(cVDFodd,    10, "%.4f", VDFodd);
                            snprintf(cTHDI,      10, "%.4f", THDI);
                            snprintf(cIDFodd,    10, "%.4f", IDFodd);
                            snprintf(cPeakValue, 10, "%.4f", PeakValue);
                            snprintf(cUBValue,   10, "%.4f", UBValue);
                            snprintf(cVel, 10, "%.4f", FVel);
                            snprintf(cDis, 10, "%.4f", FDis);

//                        snprintf(cPeakValue, 10, "%.4f", x_vel);//測試用
//                        snprintf(cUBValue,   10, "%.4f", y_vel);//測試用
                            snprintf(cx_vel,     10, "%.4f", x_vel);
                            snprintf(cy_vel,     10, "%.4f", y_vel);
                            snprintf(cz_vel,     10, "%.4f", z_vel);
                            snprintf(cx_dis,     10, "%.4f", x_dis);
                            snprintf(cy_dis,     10, "%.4f", y_dis);
                            snprintf(cz_dis,     10, "%.4f", z_dis);


                            if(mode!=1) {

                                char name[33];
                                time_t timestamp = file.timestamp;
                                strftime(name, 33, "/mci/rawdata/%Y%m%d%H%M%S.csv", localtime(&timestamp));
                                FILE *fp = fopen(name, "w");
                                if (fp != NULL) {
                                    for(i = 0 ; i<file.length ; i++) {
                                        fprintf(fp, "%f,%f,%f,%f,%f,%f,%f,%f,%f\r\n", adc.get(e,0,i), adc.get(e,1,i), adc.get(e,2,i), adc.get(e,3,i), adc.get(e,4,i), adc.get(e,5,i),
                                                adc2.get(v,0,i), adc2.get(v,1,i), adc2.get(v,2,i));
                                    }
                                    fclose(fp);
                                }
                            }


                            WM_InvalidateWindow(hWin);
                            free(e);
                            free(v);
                            hItem = GUI_CreateDialogBox(_afinish, GUI_COUNTOF(_afinish), _cbfinish, WM_HBKWIN, 0, 0);

                            break;
                    }
                    break;

                case GUI_ID_USER + 135:    // button 'Get Background Value' //
                    switch(NCode) {
                        case WM_NOTIFICATION_RELEASED:


                            bkIUR=0;
                            bkIUF=0;
                            bkTHDV=0;
                            bkVDFodd=0;
                            bkTHDI=0;
                            bkIDFodd=0;
                            bkPeakValue=0;
                            bkUBValue=0;

                            get_bk_value(&bkIUR, &bkIUF, &bkTHDV, &bkVDFodd, &bkTHDI, &bkIDFodd, &bkPeakValue, &bkUBValue);

                            bkvIUR = (bkIUR > bkvIUR ? bkIUR : bkvIUR);
                            bkvIUF = (bkIUF > bkvIUF ? bkIUF : bkvIUF);
                            bkvTHDV = (bkTHDV > bkvTHDV ? bkTHDV : bkvTHDV);
                            bkvVDFodd = (bkVDFodd > bkvVDFodd ? bkVDFodd : bkvVDFodd);
                            bkvTHDI = (bkTHDI > bkvTHDI ? bkTHDI : bkvTHDI);
                            bkvIDFodd = (bkIDFodd > bkvIDFodd ? bkIDFodd : bkvIDFodd);
                            bkvPeakValue = (bkPeakValue > bkvPeakValue ? bkPeakValue : bkvPeakValue);
                            bkvUBValue = (bkUBValue > bkvUBValue ? bkUBValue : bkvUBValue);

                            bkvvPeakValue = bkvPeakValue + 3.89;                                           /////  bkgvalue + 3.89 = threshold
                            bkvvUBValue = bkvUBValue + 3.89;

                            snprintf(bkgPeakValue,   10, "%.4f", bkvvPeakValue);                          /////  Threshold 數值判斷
                            snprintf(bkgUBValue,     10, "%.4f", bkvvUBValue);                            /////  Threshold 數值判斷

                            snprintf(cbk_PeakValue,   10, "\x20(%.0f)", bkvvPeakValue);                   /////  Threshold 顯示
                            snprintf(cbk_UBValue,     10, "\x20(%.0f)", bkvvUBValue);                     /////  Threshold 顯示

                            WM_InvalidateWindow(hWin);
                            hItem = GUI_CreateDialogBox(_afinish, GUI_COUNTOF(_afinish), _cbfinish, WM_HBKWIN, 0, 0);

                            break;
                    }
                    break;

                case GUI_ID_USER + 138: // button 'Send' //
                    switch(NCode) {
                        case WM_NOTIFICATION_RELEASED:


                            send_network();


                            WM_InvalidateWindow(hWin);
                            hItem = GUI_CreateDialogBox(_afinish, GUI_COUNTOF(_afinish), _cbfinish, WM_HBKWIN, 0, 0);

                            break;
                    }
                    break;

                case GUI_ID_USER + 139: // button 'Get' //
                    switch(NCode) {
                        case WM_NOTIFICATION_RELEASED:


                            pCMS = atof(Volts);

                            snprintf(cpH, 10, "%.2f", health);
                            snprintf(cpS, 10, "%.2f", stator);
                            snprintf(cpR, 10, "%.2f", rotor);
                            snprintf(cpB, 10, "%.2f", bearing);
                            snprintf(cpE, 10, "%.2f", eccentric);

                            aValues[1]= 360 * atof(Amps);
                            aValues[2]= 360 * atof(Poles);
                            aValues[3]= 360 * atof(RPM);
                            aValues[4]= 360 * atof(IPADR);
                            aValues[5]= 360 * atof(Netmask)+ 2;


                            WM_InvalidateWindow(hWin);
                            hItem = GUI_CreateDialogBox(_afinish, GUI_COUNTOF(_afinish), _cbfinish, WM_HBKWIN, 0, 0);
                            break;
                    }
                    break;
            }
            break;
        default:
            WM_DefaultProc(pMsg);
    }
}





// ---------------------------------------------------------------MainPage callback---------------------------------------------------------------------------------------------------------------------//

static void _cbMainPage(WM_MESSAGE * pMsg)
{

    WM_HWIN hItem;

    static WM_HWIN hEdit_MotorID=0, hEdit_Volts=0, hEdit_Amps=0, hEdit_HP=0, hEdit_Poles=0, hEdit_RPM=0, hEdit_IPADR=0, hEdit_Netmask=0, hEdit_Gateway=0;

    static int j=0;
    int     NCode;
    int     Id, i;
    int xSize, ySize;

//	static int flagYO = 0;

    switch (pMsg->MsgId) {

        case WM_INIT_DIALOG:
            hItem = WM_GetDialogItem(pMsg->hWin, ID_RADIO_0);		//***************************//
            RADIO_SetFont(hItem, GUI_FONT_20B_ASCII);               // Initialization of 'Radio' //
            RADIO_SetText(hItem, "DHCP", 0);                        //***************************//
            RADIO_SetText(hItem, "Static IP", 1);

            for(i=14 ; i<24 ; i++) {
                hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + i);       //******************************************//
                TEXT_SetTextAlign(hItem, GUI_TA_LEFT | GUI_TA_VCENTER);      // Initialization of 'IP Address etc. TEXT' //
                if(i==14) {                                                  //******************************************//
                    TEXT_SetFont(hItem, GUI_FONT_32B_ASCII);
                } else {
                    TEXT_SetFont(hItem, GUI_FONT_20B_ASCII);
                }
            }
            for(i=24 ; i<33 ; i++) {
                hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + i);        //**************************************//
                EDIT_SetFont(hItem, GUI_FONT_20B_ASCII);                      // Initialization of 'IPADDR etc. EDIT' //
                EDIT_SetTextAlign(hItem, GUI_TA_LEFT | GUI_TA_VCENTER);       //**************************************//
                if(i>29) {
                    WM_DisableWindow(hItem);
                }
            }
            for(i=0 ; i<14 ; i++) {
                hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + i);
                BUTTON_SetFocussable(hItem, 0);// Set all buttons non focussable //
                switch (i) {
                    case 11:
                        BUTTON_SetFont(hItem, GUI_FONT_32B_ASCII);
                        BUTTON_SetBitmapEx(hItem, 0, &_bmArrowLeft, 19, 50);
                        BUTTON_SetBitmapEx(hItem, 1, &_bmArrowLeft, 19, 50);
                        break;
                }
            }

            hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + 33);
            TEXT_SetTextAlign(hItem, GUI_TA_LEFT | GUI_TA_VCENTER);
            TEXT_SetFont(hItem, GUI_FONT_32B_ASCII);

            break;

        case WM_PAINT:

            xSize = LCD_GetXSize();
            ySize = LCD_GetYSize();
            GUI_DrawGradientV(0,0,xSize,ySize,0xE6E0B0,0x9980CC);   ///  (0xCC8080, 0x9980CC)

            GUI_SetColor(GUI_BLACK);
            GUI_SetPenSize(2);
            GUI_DrawLine(20, 40, 105, 40);
            GUI_DrawLine(355, 40, 440, 40);
            GUI_DrawLine(20, 185, 440, 185);
            GUI_DrawLine(20, 40, 20, 185);
            GUI_DrawLine(440, 40, 440, 185);

            GUI_DrawLine(20, 245, 117, 245);
            GUI_DrawLine(345, 245, 440, 245);
            GUI_DrawLine(20, 440, 440, 440);
            GUI_DrawLine(20, 245, 20, 440);
            GUI_DrawLine(440, 245, 440, 440);

            break;

        case WM_NOTIFY_PARENT:
            Id = WM_GetId(pMsg->hWinSrc);
            NCode = pMsg->Data.v;
            switch(Id) {
                case ID_RADIO_0: // Notifications sent by 'Radio'
                    switch(NCode) {
                        case WM_NOTIFICATION_VALUE_CHANGED:
                            for(i=30 ; i<33 ; i++) {
                                hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + i);
                                switch (RADIO_GetValue(pMsg->hWinSrc)) {
                                    case 0:
                                        WM_DisableWindow(hItem);
                                        break;
                                    case 1:
                                        WM_EnableWindow(hItem);
                                        break;
                                }
                            }
                            break;
                    }
                    break;


                case GUI_ID_USER + 0: // Notifications sent by 'button 0'
                    switch (NCode) {
                        case WM_NOTIFICATION_RELEASED:
                            GUI_SendKeyMsg(_aKey[0], 1);
                            break;
                    }
                    break;

                case GUI_ID_USER + 1: // Notifications sent by 'button 1'
                    switch (NCode) {
                        case WM_NOTIFICATION_RELEASED:
                            GUI_SendKeyMsg(_aKey[1], 1);
                            break;
                    }
                    break;

                case GUI_ID_USER + 2: // Notifications sent by 'button 2'
                    switch (NCode) {
                        case WM_NOTIFICATION_RELEASED:
                            GUI_SendKeyMsg(_aKey[2], 1);                      /* Send a key message to the focussed window */
                            break;
                    }
                    break;

                case GUI_ID_USER + 3: // Notifications sent by 'button 3'
                    switch (NCode) {
                        case WM_NOTIFICATION_RELEASED:
                            GUI_SendKeyMsg(_aKey[3], 1);                      /* Send a key message to the focussed window */
                            break;
                    }
                    break;

                case GUI_ID_USER + 4: // Notifications sent by 'button 4'
                    switch (NCode) {
                        case WM_NOTIFICATION_RELEASED:
                            GUI_SendKeyMsg(_aKey[4], 1);
                            break;
                    }
                    break;

                case GUI_ID_USER + 5: // Notifications sent by 'button 5'
                    switch (NCode) {
                        case WM_NOTIFICATION_RELEASED:
                            GUI_SendKeyMsg(_aKey[5], 1);
                            break;
                    }
                    break;

                case GUI_ID_USER + 6: // Notifications sent by 'button 6'
                    switch (NCode) {
                        case WM_NOTIFICATION_RELEASED:
                            GUI_SendKeyMsg(_aKey[6], 1);                      /* Send a key message to the focussed window */
                            break;
                    }
                    break;

                case GUI_ID_USER + 7: // Notifications sent by 'button 7'
                    switch (NCode) {
                        case WM_NOTIFICATION_RELEASED:
                            GUI_SendKeyMsg(_aKey[7], 1);
                            break;
                    }
                    break;
                case GUI_ID_USER + 8: // Notifications sent by 'button 8'
                    switch (NCode) {
                        case WM_NOTIFICATION_RELEASED:
                            GUI_SendKeyMsg(_aKey[8], 1);                      /* Send a key message to the focussed window */
                            break;
                    }
                    break;
                case GUI_ID_USER + 9: // Notifications sent by 'button 9'
                    switch (NCode) {
                        case WM_NOTIFICATION_RELEASED:
                            GUI_SendKeyMsg(_aKey[9], 1);                      /* Send a key message to the focussed window */
                            break;
                    }
                    break;
                case GUI_ID_USER + 10: // Notifications sent by 'button .'
                    switch (NCode) {
                        case WM_NOTIFICATION_RELEASED:
                            GUI_SendKeyMsg(_aKey[10], 1);                     /* Send a key message to the focussed window */
                            break;
                    }
                    break;
                case GUI_ID_USER + 11: // Notifications sent by 'button '
                    switch (NCode) {
                        case WM_NOTIFICATION_RELEASED:
                            GUI_SendKeyMsg(_aKey[11], 1);             /* Send a key message to the focussed window */
                            break;
                    }
                    break;
                case GUI_ID_USER + 12: // Notifications sent by 'button Enter'
                    switch (NCode) {
                        case WM_NOTIFICATION_RELEASED:

                            hEdit_MotorID = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + 24);
                            EDIT_GetText(hEdit_MotorID, MotorID, 10);

                            hEdit_Volts = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + 25);
                            EDIT_GetText(hEdit_Volts,   Volts,   10);

                            hEdit_Amps = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + 26);
                            EDIT_GetText(hEdit_Amps,    Amps,    10);

                            hEdit_HP = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + 27);
                            EDIT_GetText(hEdit_HP,      HP,      10);

                            hEdit_Poles = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + 28);
                            EDIT_GetText(hEdit_Poles,   Poles,   10);

                            hEdit_RPM = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + 29);
                            EDIT_GetText(hEdit_RPM,     RPM,     10);

                            hEdit_IPADR = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + 30);
                            EDIT_GetText(hEdit_IPADR,   IPADR,   20);

                            hEdit_Netmask = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + 31);
                            EDIT_GetText(hEdit_Netmask, Netmask, 20);

                            hEdit_Gateway = WM_GetDialogItem(pMsg->hWin, GUI_ID_USER + 32);
                            EDIT_GetText(hEdit_Gateway, Gateway, 20);



                            WM_HWIN hRADIO = WM_GetDialogItem(pMsg->hWin, ID_RADIO_0);

                            if(j<1) {
                                switch (RADIO_GetValue(hRADIO)) {
                                    case 0:
                                        eth.init();
                                        j++;
                                        break;
                                    case 1:
                                        eth.init(IP, MASK, GATEWAY);
                                        j++;
                                        break;
                                }
                            }

                            break;
                    }
                    break;
                case GUI_ID_USER + 13: // Notifications sent by 'button Analysis'
                    switch (NCode) {
                        case WM_NOTIFICATION_RELEASED:
                            hItem = GUI_CreateDialogBox(_aADCPage, GUI_COUNTOF(_aADCPage), _cbADCPage, WM_HBKWIN, 0, 0);
                            break;
                    }
                    break;
            }
            break;

        default:
            WM_DefaultProc(pMsg);
    }
}




/*********************************************************************
*
*       Public code
*
**********************************************************************
*/


WM_HWIN CreateMotor_Monitoring_Embedded(void);
WM_HWIN CreateMotor_Monitoring_Embedded(void)
{
    WM_HWIN hWin;

    hWin = GUI_CreateDialogBox(_aMainPage, GUI_COUNTOF(_aMainPage), _cbMainPage, WM_HBKWIN, 0, 0);
    return hWin;
}

// USER START (Optionally insert additional public code)
void MainTask(void);
void MainTask(void)
{

    GUI_Init();

    FRAMEWIN_SetDefaultFont(GUI_FONT_20B_ASCII);
    FRAMEWIN_SetDefaultTextColor(0, GUI_BLACK);
    FRAMEWIN_SetDefaultTextColor(1, GUI_BLACK);
    FRAMEWIN_SetDefaultTextAlign(GUI_TA_HCENTER | GUI_TA_VCENTER);
    FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
    TEXT_SetDefaultFont(GUI_FONT_20B_ASCII);
    BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
    BUTTON_SetDefaultFont(GUI_FONT_20B_ASCII);
    SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);

    CreateMotor_Monitoring_Embedded();

    while(1) {

        GUI_Delay(500);
    }
}
// USER END

/*************************** End of file ****************************/