Thats a nice exercise for a thuresday evening:
#pragma once
#include <stdio.h>
#include <tchar.h>
enum{ LCD_LINES=4, };
typedef enum
{
APP_QUIT,
MAIN,
Controls,
MANAGEMENT_IP,
Input,
AUDIO,
Service,
Output,
Controls_TS_IP,
Controls_IP_ADDR,
Controls_GATEWAY,
Controls_SUBNET_MASK,
MANAGEMENT_IP_IP_ADDR,
MANAGEMENT_IP_GATEWAY,
MANAGEMENT_IP_SUBNET_MASK,
Input_VIDEO,
Input_SOURCE,
Input_SDI,
Input_HDMI,
Input_COMPONENT,
Input_WIDTH,
Input_HEIGHT,
Input_VIDEO_FORMAT,
Input_FRAMERATE,
AUDIO_SOURCE,
AUDIO_ANALOG,
AUDIO_EMBEDDED,
AUDIO_AES_EBU_HDMI,
AUDIO_SAMPLERATE,
Service_SERVICE_NAME,
Service_SERVICE_PROVIDER,
Service_SERVICE_ID,
Service_PMT_PID,
Output_VIDEO,
Output_COMPRESSION,
Output_ENCODING_TYPE,
Output_BITRATE,
Output_PROFILE,
Output_LEVEL,
Output_AUDIO,
Output_TYPE,
Output_ASI,
Output_MULTICAST,
Output_UDP_RTP,
Output_TARGET_IP,
Output_PORT,
Output_UNICAST,
} MENUITEMS;
#define ITEM$(S) __T( #S ),
const TCHAR* __menuitems[] =
{
ITEM$(APP_QUIT)
ITEM$(MAIN)
ITEM$(Controls)
ITEM$(MANAGEMENT_IP)
ITEM$(Input)
ITEM$(AUDIO)
ITEM$(Service)
ITEM$(Output)
ITEM$(Controls_TS_IP)
ITEM$(Controls_IP_ADDR)
ITEM$(Controls_GATEWAY)
ITEM$(Controls_SUBNET_MASK)
ITEM$(MANAGEMENT_IP_IP_ADDR)
ITEM$(MANAGEMENT_IP_GATEWAY)
ITEM$(MANAGEMENT_IP_SUBNET_MASK)
ITEM$(Input_VIDEO)
ITEM$(Input_SOURCE)
ITEM$(Input_SDI)
ITEM$(Input_HDMI)
ITEM$(Input_COMPONENT)
ITEM$(Input_WIDTH)
ITEM$(Input_HEIGHT)
ITEM$(Input_VIDEO_FORMAT)
ITEM$(Input_FRAMERATE)
ITEM$(AUDIO_SOURCE)
ITEM$(AUDIO_ANALOG)
ITEM$(AUDIO_EMBEDDED)
ITEM$(AUDIO_AES_EBU_HDMI)
ITEM$(AUDIO_SAMPLERATE)
ITEM$(Service_SERVICE_NAME)
ITEM$(Service_SERVICE_PROVIDER)
ITEM$(Service_SERVICE_ID)
ITEM$(Service_PMT_PID)
ITEM$(Output_VIDEO)
ITEM$(Output_COMPRESSION)
ITEM$(Output_ENCODING_TYPE)
ITEM$(Output_BITRATE)
ITEM$(Output_PROFILE)
ITEM$(Output_LEVEL)
ITEM$(Output_AUDIO)
ITEM$(Output_TYPE)
ITEM$(Output_ASI)
ITEM$(Output_MULTICAST)
ITEM$(Output_UDP_RTP)
ITEM$(Output_TARGET_IP)
ITEM$(Output_PORT)
ITEM$(Output_UNICAST)
};
MENUITEMS show_menu_items(MENUITEMS fallback,MENUITEMS lo,MENUITEMS hi)
{
unsigned int i,first;
MENUITEMS select;
TCHAR c;
first = 0;
do
{
_tprintf(__T("\r\n"));
for(i=0;(i<(LCD_LINES-1)) && (MENUITEMS)(lo+first+i)<hi;i++)
{
_tprintf(__T("%i "),1+i+first);
_tprintf(__T("%s\r\n"),__menuitems[lo+i+first]);
}
if(LCD_LINES<(hi-lo))
_tprintf(__T("Esc - back / Ret - next / # - select\r\n"));
else
_tprintf(__T("Esc - back / # - select\r\n"));
c = _gettch();
switch(c)
{
case 'Q': return APP_QUIT;
case 'q': return APP_QUIT;
case 13 : if((MENUITEMS)(first+(LCD_LINES))<hi) first+=LCD_LINES-1; else first=0; select=(MENUITEMS)-1; continue;
case 27 : return fallback;
default : select = (MENUITEMS)(lo+(c-'1')); break;
}
} while((lo>select) || (hi<select));
return select;
}
MENUITEMS show_menu(MENUITEMS menu)
{
switch(menu)
{
case MAIN : return show_menu_items(APP_QUIT,Controls,Output);
case Controls : return show_menu_items(MAIN,Controls_TS_IP,Controls_SUBNET_MASK);
case MANAGEMENT_IP: return show_menu_items(MAIN,MANAGEMENT_IP_IP_ADDR,MANAGEMENT_IP_SUBNET_MASK);
case Input : return show_menu_items(MAIN,Input_VIDEO,Input_FRAMERATE);
case AUDIO : return show_menu_items(MAIN,AUDIO_SOURCE,AUDIO_SAMPLERATE);
case Service : return show_menu_items(MAIN,Service_SERVICE_NAME,Service_PMT_PID);
case Output : return show_menu_items(MAIN,Output_VIDEO,Output_UNICAST);
default: break;
}
return APP_QUIT;
}
int _tmain(int argc, _TCHAR* argv[])
{
MENUITEMS menu = MAIN;
MENUITEMS next;
#define CALLCASE(I) case I: /* call_##I(); */ _tprintf(__T("\r\n function call: %s\r\n"),__T(#I)); break;
#define ISMENU(I) case I: continue;
while(APP_QUIT!=(menu=show_menu(next=menu)))
{
switch(menu)
{
ISMENU(MAIN)
ISMENU(Controls)
CALLCASE(Controls_TS_IP)
CALLCASE(Controls_IP_ADDR)
CALLCASE(Controls_GATEWAY)
CALLCASE(Controls_SUBNET_MASK)
ISMENU(MANAGEMENT_IP)
CALLCASE(MANAGEMENT_IP_IP_ADDR)
CALLCASE(MANAGEMENT_IP_GATEWAY)
CALLCASE(MANAGEMENT_IP_SUBNET_MASK)
ISMENU(Input)
CALLCASE(Input_VIDEO)
CALLCASE(Input_SOURCE)
CALLCASE(Input_SDI)
CALLCASE(Input_HDMI)
CALLCASE(Input_COMPONENT)
CALLCASE(Input_WIDTH)
CALLCASE(Input_HEIGHT)
CALLCASE(Input_VIDEO_FORMAT)
CALLCASE(Input_FRAMERATE)
ISMENU(AUDIO)
CALLCASE(AUDIO_SOURCE)
CALLCASE(AUDIO_ANALOG)
CALLCASE(AUDIO_EMBEDDED)
CALLCASE(AUDIO_AES_EBU_HDMI)
CALLCASE(AUDIO_SAMPLERATE)
ISMENU(Service)
CALLCASE(Service_SERVICE_NAME)
CALLCASE(Service_SERVICE_PROVIDER)
CALLCASE(Service_SERVICE_ID)
CALLCASE(Service_PMT_PID)
ISMENU(Output)
CALLCASE(Output_VIDEO)
CALLCASE(Output_COMPRESSION)
CALLCASE(Output_ENCODING_TYPE)
CALLCASE(Output_BITRATE)
CALLCASE(Output_PROFILE)
CALLCASE(Output_LEVEL)
CALLCASE(Output_AUDIO)
CALLCASE(Output_TYPE)
CALLCASE(Output_ASI)
CALLCASE(Output_MULTICAST)
CALLCASE(Output_UDP_RTP)
CALLCASE(Output_TARGET_IP)
CALLCASE(Output_PORT)
CALLCASE(Output_UNICAST)
}
menu = next;
}
return 0;
}
Good luck.