MX Foundation 4
relaybox_demo.c
/*******************************************************************************
//
// File:
// relaybox_demo.c
//
// Copyright (c) MAX Technologies Inc. 1988-2022, All Rights Reserved.
// CONFIDENTIAL AND PROPRIETARY INFORMATION WHICH IS THE
// PROPERTY OF MAX TECHNOLOGIES INC.
//
// This example shows how to control interactively a RelayBox using Ethernet.
//
// Hardware Requirements:
// - MAXT RelayBox
//
*******************************************************************************/
#include "example.h"
#ifdef _WIN32
#include <conio.h>
#else
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#endif
char posName[8][16] =
{
"OFF",
"A-B",
"A-C",
"A-D",
"B-C",
"B-D",
"C-D",
"OFF"
};
void clearConsole(void);
uint64 getSoftMask(char* text, uint64 limitLow, uint64 limitHigh, uint64 defaultValue);
void getChoice(char* piChar);
#ifndef _WIN32
int mygetch(void);
#endif
/***************************************************************************************************************/
// Main
/***************************************************************************************************************/
int main(void)
{
uint32 rc;
HMXF_SERVER server=0;
HMXF_DEVICE device=0;
uint64 sw=0, db9=0, soft=0, relay=0;
double temperature=0;
char buffer[64];
// Connect to RelayBox
rc = mxfServerConnect("192.168.0.1", "admin", "admin", TRUE, &server);
if(rc)
{
printf("Failed to connect; rc=0x%08x", rc);
printf("\nPress a key to terminate\n");
getchar();
return 0;
}
if(!rc)
rc = mxfSystemDeviceGet(server, 0, &device);
if(!rc)
rc = mxfRelayBoxReset(device);
for(; !rc;)
{
clearConsole();
rc = mxfRelayBoxStatusGet(device, &sw, &db9, &soft, &relay);
if(rc) break;
rc = mxfRelayBoxTemperatureSensorRead(device, &temperature);
if(rc) break;
printf("\n");
printf("---------\n");
printf("Temperature : %-2.2f DegC\n", temperature);
printf("---------\n");
printf("Rotary Switch : %llu (%s)\n", sw, posName[min(7, sw)]);
printf("DB9 Input : 0x%02"PRIX64" (%s)\n", db9, posName[min(7, db9)]);
printf("Software Mask : 0x%016"PRIX64"\n", soft);
printf("\n");
printf("Relay Mask : 0x%016"PRIX64"\n", relay);
printf("---------\n");
printf(" 0 : OFF \n");
printf(" 1 : A-B \n");
printf(" 2 : A-C \n");
printf(" 3 : A-D \n");
printf(" 4 : B-C \n");
printf(" 5 : B-D \n");
printf(" 6 : C-D \n");
printf(" m : MASK \n");
printf(" q : EXIT \n");
printf("---------\n");
printf(" SELECTION ? \n");
buffer[0] = '\0';
memset(buffer, 0, sizeof(buffer));
getChoice(buffer);
if(buffer[0] != 0)
{
if(buffer[0]=='q')
break;
if(strlen(buffer)==1 && ((buffer[0]>='0' && buffer[0]<='6') || buffer[0]=='m'))
{
if(buffer[0]=='m')
{
static uint64 mask=0;
mask = getSoftMask("Mask ", 0, MXF_RELAYBOX_CONFIG_MASK, mask);
rc=mxfRelayBoxConfigSet(device, MXF_RELAYBOX_CONFIG_OPT_MASK, mask);
if(rc) break;
}
else
{
int temp;
temp = atoi(buffer);
if(temp >= 0 && temp <= 6)
{
uint64 pos;
pos = (uint64)temp;
rc=mxfRelayBoxConfigSet(device, MXF_RELAYBOX_CONFIG_OPT_POS, pos);
if(rc) break;
}
}
}
else
{
printf("INVALID SELECTION !!!\n");
mxfSleep(900);
}
}
mxfSleep(333);
}
// Catch any previous error
if (rc)
{
char buf[256];
rc = mxfSystemErrorStringGet(server, rc, sizeof(buf), buf);
printf("%s\n", buf);
}
printf("\nTerminating\n");
printf("\nPress enter to terminate\n");
getchar();
return rc;
}
void clearConsole(void)
{
#ifdef _WIN32
system("cls");
#else
system("clear");
#endif
}
void
getChoice(char* piChar)
{
piChar[0]=0;
#ifdef _WIN32
if(_kbhit())
piChar[0]=(char)_getch();
else
piChar[0]='\0';
#else
piChar[0]=(char)mygetch();
#endif
if(((uint8)piChar[0])==0xFF)
piChar[0]=0;
else if(piChar[0]=='\n')
piChar[0]=' ';
}
#ifndef _WIN32
int
mygetch(void)
{
struct termios oldt, newt;
int ch;
int val;
tcgetattr(STDIN_FILENO, &oldt);
newt = oldt;
newt.c_lflag &= (tcflag_t)~(ICANON);
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
val = fcntl(STDIN_FILENO, F_GETFL, 0);
val|=O_NONBLOCK;
fcntl(STDIN_FILENO, F_SETFL, val);
ch=getchar();
val&=~O_NONBLOCK;
fcntl(STDIN_FILENO, F_SETFL, val);
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
return ch;
}
#endif
uint64
getSoftMask(char* text, uint64 limitLow, uint64 limitHigh, uint64 defaultValue)
{
char buffer[100];
uint64 valid = FALSE;
uint64 value=0;
while (!valid)
{
sprintf(buffer, " (%"PRIX64"..%"PRIX64", [Enter]=%"PRIX64") in HEX ? ", limitLow, limitHigh, defaultValue);
printf("\n");
printf("%s", text);
printf("%s", buffer);
fgets(buffer, sizeof(buffer), stdin);
if (strlen(buffer) > 1)
sscanf(buffer, "%"PRIX64"", &value);
else
value = defaultValue; /* nothing typed in, use defaultValue */
valid = ((value >= limitLow) && (value <= limitHigh));
}
return value;
}
Updated 10/23/2023