ioPAC RTU Controllers
C/C++ Sample Code Programming Guide
Macros | Functions
do_cgi.c File Reference

DO CGI Sample More...

#include <libmoxa_rtu.h>

Macros

#define CMD_SET_MODE   0
 
#define CMD_SET_DO_VAULE   1
 
#define CMD_SET_PWM_START   2
 

Functions

int getAuth (void)
 
void startHtml (char *title)
 
void endHtml (void)
 
void startTable (int border, int width)
 
void endTable (void)
 
void startOneRow (void)
 
void endOneRow (void)
 
void insertData (int width, char *align, char *cssClass, char *data)
 
int execCmd (UINT8 slot, UINT8 chStart, UINT8 chCount, char *cmd)
 
void getCgiArg (UINT8 *pSlot, UINT8 *pChStart, UINT8 *pChCount, char *command)
 
int main (int argc, char *argv[], char *envp[])
 

Detailed Description

DO CGI Sample

Date
11-11-2014
Author
Wanhan Hsieh
Version
V1.0
do_cgi.jpg
DO CGI Sample
Introduction:
This is DO CGI sample code. You can monitor and control DO status and mode.
Example:
1. Using default: http://192.168.127.254/cgi-bin/do.cgi
2. Setting DO slot and channel: http://192.168.127.254/cgi-bin/do.cgi?slot=2&chStart=0&chCount=16
Default:
Slot of DO module = 1

Library:
DO APIs

Macro Definition Documentation

#define CMD_SET_MODE   0
#define CMD_SET_DO_VAULE   1
#define CMD_SET_PWM_START   2

Function Documentation

int getAuth ( void  )
void startHtml ( char *  title)
void endHtml ( void  )
void startTable ( int  border,
int  width 
)
void endTable ( void  )
void startOneRow ( void  )
void endOneRow ( void  )
void insertData ( int  width,
char *  align,
char *  cssClass,
char *  data 
)
int execCmd ( UINT8  slot,
UINT8  chStart,
UINT8  chCount,
char *  cmd 
)
void getCgiArg ( UINT8 pSlot,
UINT8 pChStart,
UINT8 pChCount,
char *  command 
)
int main ( int  argc,
char *  argv[],
char *  envp[] 
)
/*******************************************************************************
* Copyright Moxa Inc.
*
* DO CGI Sample
*
* Date Author Comment
* 11-11-2014 Wanhan Hsieh Created.
******************************************************************************/
#include <libmoxa_rtu.h>
#define CMD_SET_MODE 0
#define CMD_SET_DO_VAULE 1
#define CMD_SET_PWM_START 2
int getAuth(void)
{
return setuid(0);
}
void startHtml(char *title)
{
printf("Content-type: text/html; charset=utf-8\n\n");
printf("<html>");
printf("<head>");
printf("<link href=\"../iopac.css\" rel=stylesheet type=text/css>");
printf("<title>%s</title>", title);
printf("<script Language=\"JavaScript\">");
printf("function refreshPage(){window.location.reload();}");
//printf("setTimeout('refreshPage()',3000);"); // refresh page periodically
printf("</script>");
printf("</head>");
printf("<body>\n");
printf("<input type=\"button\" value=\"Refresh page\" onClick=\"refreshPage()\">");
}
void endHtml(void)
{
printf("</body>");
printf("</html>\n");
}
void startTable(int border, int width)
{
printf("<table border=\"%d\" width=\"%d%%\">", border, width);
}
void endTable(void)
{
printf("</table>");
}
void startOneRow(void)
{
printf("<tr>");
}
void endOneRow(void)
{
printf("</tr>");
}
void insertData(int width, char *align, char *cssClass, char *data)
{
printf("<td width=\"%d%%\" align=\"%s\" class=\"%s\">%s</td>", width, align, cssClass, data);
}
int execCmd(UINT8 slot, UINT8 chStart, UINT8 chCount, char *cmd)
{
int cmdIdx = -1;
int channel = 0;
int setValue = 0;
int ret;
if(cmd == NULL || strcmp(cmd, "") == 0)
{
//printf("Null command.\n");
return -1;
}
sscanf(cmd, "cmd=%d&ch=%d&set=%d", &cmdIdx, &channel, &setValue);
//printf("cmd=%d, ch=%d, set=%d<br>\n", cmdIdx, channel, setValue);
switch(cmdIdx)
{
{
int i = 0;
UINT8 mode = (UINT8) setValue;
ret = MX_RTU_Module_DO_PWM_Stop_Set(slot, 0x1 << channel);
if(ret != MODULE_RW_ERR_OK)
printf("MX_RTU_Module_DO_PWM_Stop_Set = %d<br>\n", ret);
ret = MX_RTU_Module_DO_Mode_Set(slot, channel, 1, &mode);
if(ret != MODULE_RW_ERR_OK)
printf("MX_RTU_Module_DO_Mode_Set = %d<br>\n", ret);
if(mode == DO_MODE_PWM)
{
UINT32 pwmCount = 0;
float pwmFreq = 10.0f;
float pwmDuty = 50.0f;
ret = MX_RTU_Module_DO_PWM_Count_Set(slot, channel, 1, &pwmCount);
if(ret != MODULE_RW_ERR_OK)
printf("MX_RTU_Module_DO_PWM_Count_Set = %d<br>\n", ret);
ret = MX_RTU_Module_DO_PWM_Config_Set(slot, channel, 1, &pwmFreq, &pwmDuty);
if(ret != MODULE_RW_ERR_OK)
printf("MX_RTU_Module_DO_PWM_Config_Set = %d<br>\n", ret);
}
break;
}
{
UINT32 doValues = 0;
ret = MX_RTU_Module_DO_Value_Get(slot, &doValues);
if(ret != MODULE_RW_ERR_OK)
printf("MX_RTU_Module_DO_Value_Get = %d<br>\n", ret);
doValues &= ~(0x1 << channel);
doValues |= (setValue << channel);
ret = MX_RTU_Module_DO_Value_Set(slot, doValues);
if(ret != MODULE_RW_ERR_OK)
printf("MX_RTU_Module_DO_Value_Set = %d<br>\n", ret);
break;
}
{
UINT32 pwmStart = (0x1 << channel);
if(setValue)
{
ret = MX_RTU_Module_DO_PWM_Start_Set(slot, pwmStart);
if(ret != MODULE_RW_ERR_OK)
printf("MX_RTU_Module_DO_PWM_Start_Set = %d<br>\n", ret);
}
else
{
ret = MX_RTU_Module_DO_PWM_Stop_Set(slot, pwmStart);
if(ret != MODULE_RW_ERR_OK)
printf("MX_RTU_Module_DO_PWM_Stop_Set = %d<br>\n", ret);
}
break;
}
default:
printf("Error command.\n");
break;
}
return 0;
}
void getCgiArg(UINT8 *pSlot, UINT8 *pChStart, UINT8 *pChCount, char *command)
{
char *p;
int slot, chStart, chCount;
char buf[100] = {0};
if((p = getenv("QUERY_STRING")))
{
if(0 == strcmp(p, ""))
{
//printf("Empty QUERY_STRING.\n");
return;
}
}
else
{
//printf("Null QUERY_STRING.\n");
return;
}
sscanf(p, "slot=%d&chStart=%d&chCount=%d&%s", &slot, &chStart, &chCount, buf);
if(buf)
memcpy(command, buf, strlen(buf));
*pSlot = slot;
*pChStart = chStart;
*pChCount = chCount;
}
int main(int argc, char* argv[], char *envp[])
{
int i;
int ret = 0;
int chAmount = 16;
UINT8 doSlot = 1, chStart = 0, chCount = 16;
char command[100] = {0};
UINT8 doMode[chAmount];
UINT32 doValue = 0;
UINT32 pwmStart = 0;
UINT32 doPwmCount[chAmount];
float doPwmFreq[chAmount];
float doPwmDuty[chAmount];
char *cgiName;
cgiName = getenv("SCRIPT_NAME");
startHtml("DO CGI Sample");
getCgiArg(&doSlot, &chStart, &chCount, command);
if(0 == execCmd(doSlot, chStart, chCount, command)) // execute successfully, then reload page
{
printf("<script Language=\"JavaScript\">");
printf("window.location.assign(\"%s?slot=%d&chStart=%d&chCount=%d\");",
cgiName, doSlot, chStart, chCount);
printf("</script>");
}
else
{
startTable(0, 100);
insertData(15, "left", "block_title", "DO Channel");
insertData(15, "center", "block_title", "Mode");
insertData(15, "center", "block_title", "Status");
insertData(15, "center", "block_title", "PWM Count");
insertData(15, "center", "block_title", "PWM Frequency (Hz)");
insertData(15, "center", "block_title", "PWM Duty Cycle (%)");
ret = MX_RTU_Module_DO_Mode_Get(doSlot, chStart, chCount, doMode);
if(ret != MODULE_RW_ERR_OK)
printf("MX_RTU_Module_DO_Mode_Get = %d<br>\n", ret);
ret = MX_RTU_Module_DO_Value_Get(doSlot, &doValue);
if(ret != MODULE_RW_ERR_OK)
printf("MX_RTU_Module_DO_Value_Get = %d<br>\n", ret);
ret = MX_RTU_Module_DO_PWM_Start_Get(doSlot, &pwmStart);
if(ret != MODULE_RW_ERR_OK)
printf("MX_RTU_Module_DO_PWM_Start_Get = %d<br>\n", ret);
ret = MX_RTU_Module_DO_PWM_Count_Get(doSlot, chStart, chCount, doPwmCount);
if(ret != MODULE_RW_ERR_OK)
printf("MX_RTU_Module_DO_PWM_Count_Get = %d<br>\n", ret);
ret = MX_RTU_Module_DO_PWM_Config_Get(doSlot, chStart, chCount, doPwmFreq, doPwmDuty);
if(ret != MODULE_RW_ERR_OK)
printf("MX_RTU_Module_DO_PWM_Config_Get = %d<br>\n", ret);
for(i = 0; i < chCount; i++)
{
int chValue = ((doValue >> (chStart+i)) & 0x1) ? 1 : 0;
int chPwmStart = ((pwmStart >> (chStart+i)) & 0x1) ? 1 : 0;
char chMsg[20], modeMsg[100], statusMsg[100], countMsg[20], freqMsg[20], dutyMsg[20];
char cssClass[20];
if(i % 2)
sprintf(cssClass, "column_title_bg");
else
sprintf(cssClass, "column_title");
sprintf(chMsg, "DO-%02d", chStart+i);
if(doMode[i] == DO_MODE_DO)
{
sprintf(modeMsg, "<a href=\"%s?slot=%d&chStart=%d&chCount=%d&cmd=%d&ch=%d&set=%d\">%s</a>",
cgiName, doSlot, chStart, chCount, CMD_SET_MODE, chStart+i, DO_MODE_PWM, "DO");
sprintf(statusMsg, "<a href=\"%s?slot=%d&chStart=%d&chCount=%d&cmd=%d&ch=%d&set=%d\">%s</a>",
cgiName, doSlot, chStart, chCount, CMD_SET_DO_VAULE, chStart+i, (chValue) ? 0 : 1, (chValue) ? "ON" : "OFF");
sprintf(countMsg, "--");
sprintf(freqMsg, "--");
sprintf(dutyMsg, "--");
}
else
{
sprintf(modeMsg, "<a href=\"%s?slot=%d&chStart=%d&chCount=%d&cmd=%d&ch=%d&set=%d\">%s</a>",
cgiName, doSlot, chStart, chCount, CMD_SET_MODE, chStart+i, DO_MODE_DO, "PWM");
sprintf(statusMsg, "<a href=\"%s?slot=%d&chStart=%d&chCount=%d&cmd=%d&ch=%d&set=%d\">%s</a>",
cgiName, doSlot, chStart, chCount, CMD_SET_PWM_START, chStart+i, (chPwmStart) ? 0 : 1, (chPwmStart) ? "Start" : "Stop");
sprintf(countMsg, "%d", doPwmCount[i]);
sprintf(freqMsg, "%.2f", doPwmFreq[i]);
sprintf(dutyMsg, "%.2f", doPwmDuty[i]);
}
insertData(15, "left", cssClass, chMsg); // channel
insertData(15, "center", cssClass, modeMsg); // mode
insertData(15, "center", cssClass, statusMsg); // status
insertData(15, "center", cssClass, countMsg); // pwm count
insertData(15, "center", cssClass, freqMsg); // pwm frequency
insertData(15, "center", cssClass, dutyMsg); // pwm duty cycle
}
}
return ret;
}