2002-09-24 06:08:50 +08:00
|
|
|
//
|
2002-12-10 21:21:41 +08:00
|
|
|
// ZoneMinder Control Utility, $Date$, $Revision$
|
2003-01-12 02:22:27 +08:00
|
|
|
// Copyright (C) 2003 Philip Coombes
|
2002-09-24 06:08:50 +08:00
|
|
|
//
|
|
|
|
// This program is free software; you can redistribute it and/or
|
|
|
|
// modify it under the terms of the GNU General Public License
|
|
|
|
// as published by the Free Software Foundation; either version 2
|
|
|
|
// of the License, or (at your option) any later version.
|
|
|
|
//
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with this program; if not, write to the Free Software
|
|
|
|
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
//
|
|
|
|
|
2002-09-16 17:19:24 +08:00
|
|
|
#include <getopt.h>
|
2003-03-26 20:00:16 +08:00
|
|
|
|
2002-09-16 17:19:24 +08:00
|
|
|
#include "zm.h"
|
2003-03-26 20:00:16 +08:00
|
|
|
#include "zm_db.h"
|
|
|
|
#include "zm_monitor.h"
|
|
|
|
#include "zm_local_camera.h"
|
2002-09-16 17:19:24 +08:00
|
|
|
|
2003-01-16 22:53:26 +08:00
|
|
|
void Usage( int status=-1 )
|
2002-11-01 06:12:53 +08:00
|
|
|
{
|
2003-07-04 22:48:51 +08:00
|
|
|
fprintf( stderr, "zmu <-d device_no> [-v] [function] [-U<username> -P<password>]\n" );
|
|
|
|
fprintf( stderr, "zmu <-m monitor_id> [-v] [function] [-U<username> -P<password>]\n" );
|
2003-06-25 17:47:09 +08:00
|
|
|
fprintf( stderr, "General options:\n" );
|
|
|
|
fprintf( stderr, " -h, --help : This screen\n" );
|
|
|
|
fprintf( stderr, " -v, --verbose : Produce more verbose output\n" );
|
|
|
|
fprintf( stderr, "Options for use with devices:\n" );
|
2003-01-16 22:53:26 +08:00
|
|
|
fprintf( stderr, " -d, --device <device_no> : Get the current video device settings for /dev/video<device_no>\n" );
|
2003-06-25 17:47:09 +08:00
|
|
|
fprintf( stderr, " -q, --query : Query the current settings for the device\n" );
|
|
|
|
fprintf( stderr, "Options for use with monitors:\n" );
|
2002-12-11 07:29:22 +08:00
|
|
|
fprintf( stderr, " -m, --monitor <monitor_id> : Specify which monitor to address, default 1 if absent\n" );
|
2003-06-25 17:47:09 +08:00
|
|
|
fprintf( stderr, " -q, --query : Query the current settings for the monitor\n" );
|
2002-11-01 06:12:53 +08:00
|
|
|
fprintf( stderr, " -s, --state : Output the current monitor state, 0 = idle, 1 = alarm, 2 = alert\n" );
|
2003-06-25 17:47:09 +08:00
|
|
|
fprintf( stderr, " -B, --brightness [value] : Output the current brightness, set to value if given \n" );
|
|
|
|
fprintf( stderr, " -C, --contrast [value] : Output the current contrast, set to value if given \n" );
|
|
|
|
fprintf( stderr, " -H, --hue [value] : Output the current hue, set to value if given \n" );
|
|
|
|
fprintf( stderr, " -O, --colour [value] : Output the current colour, set to value if given \n" );
|
2002-11-01 06:17:23 +08:00
|
|
|
fprintf( stderr, " -i, --image [image_index] : Write captured image to disk as <monitor_name>.jpg, last image captured\n" );
|
2002-11-01 06:12:53 +08:00
|
|
|
fprintf( stderr, " or specified ring buffer index if given.\n" );
|
2004-02-18 23:35:51 +08:00
|
|
|
fprintf( stderr, " -S, --scale <scale_%%ge> : With --image specify any scaling (in %%) to be applied to the image\n" );
|
2002-11-01 06:12:53 +08:00
|
|
|
fprintf( stderr, " -t, --timestamp [image_index] : Output captured image timestamp, last image captured or specified\n" );
|
|
|
|
fprintf( stderr, " ring buffer index if given\n" );
|
|
|
|
fprintf( stderr, " -r, --read_index : Output ring buffer read index\n" );
|
|
|
|
fprintf( stderr, " -w, --write_index : Output ring buffer write index\n" );
|
2002-11-28 00:23:04 +08:00
|
|
|
fprintf( stderr, " -e, --event : Output last event index\n" );
|
2002-11-01 06:12:53 +08:00
|
|
|
fprintf( stderr, " -f, --fps : Output last Frames Per Second captured reading\n" );
|
|
|
|
fprintf( stderr, " -z, --zones : Write last captured image overlaid with zones to <monitor_name>-Zones.jpg\n" );
|
2002-12-11 07:29:22 +08:00
|
|
|
fprintf( stderr, " -a, --alarm : Force alarm in monitor, this will trigger recording until cancelled with -c\n" );
|
2003-03-26 21:18:26 +08:00
|
|
|
fprintf( stderr, " -n, --noalarm : Force no alarms in monitor, this will prevent alarms until cancelled with -c\n" );
|
|
|
|
fprintf( stderr, " -c, --cancel : Cancel a forced alarm/noalarm in monitor, required after being enabled with -a or -n\n" );
|
2003-07-04 22:48:51 +08:00
|
|
|
fprintf( stderr, " -U, --username <username> : When running in authenticated mode the username and\n" );
|
|
|
|
fprintf( stderr, " -P, --password <password> : and password combination of the given user\n" );
|
2002-11-01 06:12:53 +08:00
|
|
|
|
2003-01-16 22:53:26 +08:00
|
|
|
exit( status );
|
2002-11-01 06:12:53 +08:00
|
|
|
}
|
|
|
|
|
2003-07-04 22:48:51 +08:00
|
|
|
typedef enum {
|
|
|
|
BOGUS=0x0000,
|
|
|
|
STATE=0x0001,
|
|
|
|
IMAGE=0x0002,
|
|
|
|
TIME=0x0004,
|
|
|
|
READ_IDX=0x0008,
|
|
|
|
WRITE_IDX=0x0010,
|
|
|
|
EVENT=0x0020,
|
|
|
|
FPS=0x0040,
|
|
|
|
ZONES=0x0080,
|
|
|
|
ALARM=0x0100,
|
|
|
|
NOALARM=0x0200,
|
|
|
|
CANCEL=0x0400,
|
|
|
|
QUERY=0x0800,
|
|
|
|
BRIGHTNESS=0x1000,
|
|
|
|
CONTRAST=0x2000,
|
|
|
|
HUE=0x4000,
|
|
|
|
COLOUR=0x8000
|
|
|
|
} Function;
|
|
|
|
|
|
|
|
bool ValidateAccess( const char *username, const char *password, int mon_id, Function function )
|
|
|
|
{
|
2004-03-22 17:11:42 +08:00
|
|
|
if ( mon_id > 0 && (bool)config.Item( ZM_OPT_USE_AUTH ) )
|
2003-07-04 22:48:51 +08:00
|
|
|
{
|
|
|
|
if ( !username || !password )
|
|
|
|
{
|
|
|
|
fprintf( stderr, "Error, username and password must be supplied\n" );
|
|
|
|
exit( -1 );
|
|
|
|
}
|
|
|
|
|
|
|
|
char sql[BUFSIZ] = "";
|
2004-04-20 00:02:17 +08:00
|
|
|
snprintf( sql, sizeof(sql), "select Username, Stream+0, Events+0, Monitors+0, System+0, MonitorIds from Users where Username = '%s' and Password = password('%s') and Enabled = 1", username, password );
|
2003-07-04 22:48:51 +08:00
|
|
|
|
|
|
|
if ( mysql_query( &dbconn, sql ) )
|
|
|
|
{
|
|
|
|
Error(( "Can't run query: %s", mysql_error( &dbconn ) ));
|
|
|
|
exit( mysql_errno( &dbconn ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
MYSQL_RES *result = mysql_store_result( &dbconn );
|
|
|
|
if ( !result )
|
|
|
|
{
|
|
|
|
Error(( "Can't use query result: %s", mysql_error( &dbconn ) ));
|
|
|
|
exit( mysql_errno( &dbconn ) );
|
|
|
|
}
|
|
|
|
int n_users = mysql_num_rows( result );
|
|
|
|
|
|
|
|
if ( n_users < 1 )
|
|
|
|
{
|
|
|
|
fprintf( stderr, "Error, invalid username and/or password\n" );
|
|
|
|
exit( -1 );
|
|
|
|
}
|
|
|
|
|
|
|
|
MYSQL_ROW dbrow = mysql_fetch_row( result );
|
|
|
|
|
|
|
|
bool allowed = true;
|
|
|
|
int stream = atoi(dbrow[1]);
|
|
|
|
int events = atoi(dbrow[2]);
|
|
|
|
int monitors = atoi(dbrow[3]);
|
2004-01-15 05:26:47 +08:00
|
|
|
//int system = atoi(dbrow[4]);
|
2003-07-04 22:48:51 +08:00
|
|
|
const char *monitor_ids = dbrow[5];
|
|
|
|
if ( function & (STATE|IMAGE|TIME|READ_IDX|WRITE_IDX|FPS) )
|
|
|
|
{
|
|
|
|
if ( stream < 1 )
|
|
|
|
allowed = false;
|
|
|
|
}
|
|
|
|
if ( function & EVENT )
|
|
|
|
{
|
|
|
|
if ( events < 1 )
|
|
|
|
allowed = false;
|
|
|
|
}
|
|
|
|
if ( function & (ZONES|QUERY) )
|
|
|
|
{
|
|
|
|
if ( monitors < 1 )
|
|
|
|
allowed = false;
|
|
|
|
}
|
|
|
|
if ( function & (ALARM|NOALARM|CANCEL|BRIGHTNESS|CONTRAST|HUE|COLOUR) )
|
|
|
|
{
|
|
|
|
if ( monitors < 2 )
|
|
|
|
allowed = false;
|
|
|
|
}
|
|
|
|
if ( monitor_ids && monitor_ids[0] )
|
|
|
|
{
|
|
|
|
char mon_id_str[256] = "";
|
2004-04-20 00:02:17 +08:00
|
|
|
strncpy( mon_id_str, monitor_ids, sizeof(mon_id_str) );
|
2003-07-04 22:48:51 +08:00
|
|
|
char *mon_id_str_ptr = mon_id_str;
|
|
|
|
char *mon_id_ptr = 0;
|
|
|
|
bool found_mon_id = false;
|
2004-01-15 05:26:47 +08:00
|
|
|
while( (mon_id_ptr = strtok( mon_id_str_ptr, "," )) )
|
2003-07-04 22:48:51 +08:00
|
|
|
{
|
|
|
|
mon_id_str_ptr = 0;
|
|
|
|
if ( mon_id == atoi( mon_id_ptr ) )
|
|
|
|
{
|
|
|
|
found_mon_id = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( !found_mon_id )
|
|
|
|
allowed = false;
|
|
|
|
}
|
|
|
|
if ( !allowed )
|
|
|
|
{
|
|
|
|
fprintf( stderr, "Error, insufficient privileges for requested action\n" );
|
|
|
|
exit( -1 );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return( true );
|
|
|
|
}
|
|
|
|
|
2002-10-28 22:33:57 +08:00
|
|
|
int main( int argc, char *argv[] )
|
2002-09-16 17:19:24 +08:00
|
|
|
{
|
|
|
|
static struct option long_options[] = {
|
2003-01-16 22:53:26 +08:00
|
|
|
{"device", 1, 0, 'd'},
|
2002-09-16 17:19:24 +08:00
|
|
|
{"monitor", 1, 0, 'm'},
|
2003-01-16 22:53:26 +08:00
|
|
|
{"verbose", 0, 0, 'v'},
|
2002-09-16 17:19:24 +08:00
|
|
|
{"image", 2, 0, 'i'},
|
2004-02-18 23:35:51 +08:00
|
|
|
{"scale", 1, 0, 'S'},
|
2002-09-16 17:19:24 +08:00
|
|
|
{"timestamp", 2, 0, 't'},
|
|
|
|
{"state", 0, 0, 's'},
|
2003-06-25 17:47:09 +08:00
|
|
|
{"brightness", 2, 0, 'B'},
|
|
|
|
{"contrast", 2, 0, 'C'},
|
|
|
|
{"hue", 2, 0, 'H'},
|
|
|
|
{"contrast", 2, 0, 'O'},
|
2002-09-16 17:19:24 +08:00
|
|
|
{"read_index", 0, 0, 'r'},
|
|
|
|
{"write_index", 0, 0, 'w'},
|
2002-11-28 00:23:04 +08:00
|
|
|
{"event", 0, 0, 'e'},
|
2002-09-16 17:19:24 +08:00
|
|
|
{"fps", 0, 0, 'f'},
|
|
|
|
{"zones", 0, 0, 'z'},
|
2002-12-11 07:29:22 +08:00
|
|
|
{"alarm", 0, 0, 'a'},
|
2003-03-26 21:18:26 +08:00
|
|
|
{"noalarm", 0, 0, 'n'},
|
2002-12-11 07:29:22 +08:00
|
|
|
{"cancel", 0, 0, 'c'},
|
2003-03-06 01:14:17 +08:00
|
|
|
{"query", 0, 0, 'q'},
|
2003-07-04 22:48:51 +08:00
|
|
|
{"username", 1, 0, 'U'},
|
|
|
|
{"password", 1, 0, 'P'},
|
2002-11-01 06:12:53 +08:00
|
|
|
{"help", 0, 0, 'h'},
|
2002-09-16 17:19:24 +08:00
|
|
|
{0, 0, 0, 0}
|
|
|
|
};
|
|
|
|
|
2003-01-16 22:53:26 +08:00
|
|
|
int dev_id = -1;
|
2004-03-22 17:11:42 +08:00
|
|
|
int mon_id = 0;
|
2003-01-16 22:53:26 +08:00
|
|
|
bool verbose = false;
|
2003-01-13 18:51:52 +08:00
|
|
|
Function function = BOGUS;
|
|
|
|
|
2002-09-16 17:19:24 +08:00
|
|
|
int image_idx = -1;
|
2004-02-18 23:35:51 +08:00
|
|
|
int scale = -1;
|
2003-06-25 17:47:09 +08:00
|
|
|
int brightness = -1;
|
|
|
|
int contrast = -1;
|
|
|
|
int hue = -1;
|
|
|
|
int colour = -1;
|
2003-07-04 22:48:51 +08:00
|
|
|
char *username = 0;
|
|
|
|
char *password = 0;
|
2002-09-16 17:19:24 +08:00
|
|
|
while (1)
|
|
|
|
{
|
|
|
|
int option_index = 0;
|
|
|
|
|
2004-02-18 23:35:51 +08:00
|
|
|
int c = getopt_long (argc, argv, "d:m:vsrwei::S:t::fzancqphB::C::H::O::U:P:", long_options, &option_index);
|
2002-09-16 17:19:24 +08:00
|
|
|
if (c == -1)
|
2002-11-01 06:12:53 +08:00
|
|
|
{
|
2002-09-16 17:19:24 +08:00
|
|
|
break;
|
2002-11-01 06:12:53 +08:00
|
|
|
}
|
2002-09-16 17:19:24 +08:00
|
|
|
|
|
|
|
switch (c)
|
|
|
|
{
|
2003-01-16 22:53:26 +08:00
|
|
|
case 'd':
|
|
|
|
dev_id = atoi(optarg);
|
|
|
|
break;
|
2002-09-16 17:19:24 +08:00
|
|
|
case 'm':
|
2003-01-16 22:53:26 +08:00
|
|
|
mon_id = atoi(optarg);
|
|
|
|
break;
|
|
|
|
case 'v':
|
|
|
|
verbose = true;
|
2002-09-16 17:19:24 +08:00
|
|
|
break;
|
|
|
|
case 's':
|
2003-01-13 18:51:52 +08:00
|
|
|
function = Function(function | STATE);
|
2002-09-16 17:19:24 +08:00
|
|
|
break;
|
|
|
|
case 'i':
|
2003-01-13 18:51:52 +08:00
|
|
|
function = Function(function | IMAGE);
|
2002-09-16 17:19:24 +08:00
|
|
|
if ( optarg )
|
|
|
|
{
|
|
|
|
image_idx = atoi( optarg );
|
|
|
|
}
|
|
|
|
break;
|
2004-02-18 23:35:51 +08:00
|
|
|
case 'S':
|
|
|
|
scale = atoi(optarg);
|
|
|
|
break;
|
2002-09-16 17:19:24 +08:00
|
|
|
case 't':
|
2003-01-13 18:51:52 +08:00
|
|
|
function = Function(function | TIME);
|
2002-09-16 17:19:24 +08:00
|
|
|
if ( optarg )
|
|
|
|
{
|
|
|
|
image_idx = atoi( optarg );
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'r':
|
2003-01-13 18:51:52 +08:00
|
|
|
function = Function(function | READ_IDX);
|
2002-09-16 17:19:24 +08:00
|
|
|
break;
|
|
|
|
case 'w':
|
2003-01-13 18:51:52 +08:00
|
|
|
function = Function(function | WRITE_IDX);
|
2002-09-16 17:19:24 +08:00
|
|
|
break;
|
2002-11-28 00:23:04 +08:00
|
|
|
case 'e':
|
2003-01-13 18:51:52 +08:00
|
|
|
function = Function(function | EVENT);
|
2002-11-28 00:23:04 +08:00
|
|
|
break;
|
2002-09-16 17:19:24 +08:00
|
|
|
case 'f':
|
2003-01-13 18:51:52 +08:00
|
|
|
function = Function(function | FPS);
|
2002-09-16 17:19:24 +08:00
|
|
|
break;
|
|
|
|
case 'z':
|
2003-01-13 18:51:52 +08:00
|
|
|
function = Function(function | ZONES);
|
2002-09-16 17:19:24 +08:00
|
|
|
break;
|
2002-12-11 07:29:22 +08:00
|
|
|
case 'a':
|
2003-01-13 18:51:52 +08:00
|
|
|
function = Function(function | ALARM);
|
2002-12-11 07:29:22 +08:00
|
|
|
break;
|
2003-03-26 21:18:26 +08:00
|
|
|
case 'n':
|
|
|
|
function = Function(function | NOALARM);
|
|
|
|
break;
|
2002-12-11 07:29:22 +08:00
|
|
|
case 'c':
|
2003-01-13 18:51:52 +08:00
|
|
|
function = Function(function | CANCEL);
|
2002-12-11 07:29:22 +08:00
|
|
|
break;
|
2003-03-06 01:14:17 +08:00
|
|
|
case 'q':
|
|
|
|
function = Function(function | QUERY);
|
|
|
|
break;
|
2003-06-25 17:47:09 +08:00
|
|
|
case 'B':
|
|
|
|
function = Function(function | BRIGHTNESS);
|
|
|
|
if ( optarg )
|
|
|
|
{
|
|
|
|
brightness = atoi( optarg );
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'C':
|
|
|
|
function = Function(function | CONTRAST);
|
|
|
|
if ( optarg )
|
|
|
|
{
|
|
|
|
contrast = atoi( optarg );
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'H':
|
|
|
|
function = Function(function | HUE);
|
|
|
|
if ( optarg )
|
|
|
|
{
|
|
|
|
hue = atoi( optarg );
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'O':
|
|
|
|
function = Function(function | COLOUR);
|
|
|
|
if ( optarg )
|
|
|
|
{
|
|
|
|
colour = atoi( optarg );
|
|
|
|
}
|
|
|
|
break;
|
2003-07-04 22:48:51 +08:00
|
|
|
case 'U':
|
|
|
|
username = optarg;
|
|
|
|
break;
|
|
|
|
case 'P':
|
|
|
|
password = optarg;
|
|
|
|
break;
|
2002-11-01 06:12:53 +08:00
|
|
|
case 'h':
|
2003-01-16 22:53:26 +08:00
|
|
|
Usage( 0 );
|
2002-11-01 06:12:53 +08:00
|
|
|
break;
|
2002-09-16 17:19:24 +08:00
|
|
|
case '?':
|
2002-11-01 06:12:53 +08:00
|
|
|
Usage();
|
2002-09-16 17:19:24 +08:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
//fprintf( stderr, "?? getopt returned character code 0%o ??\n", c );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (optind < argc)
|
|
|
|
{
|
2002-11-01 06:12:53 +08:00
|
|
|
fprintf( stderr, "Extraneous options, " );
|
2002-09-16 17:19:24 +08:00
|
|
|
while (optind < argc)
|
2003-01-16 22:53:26 +08:00
|
|
|
fprintf( stderr, "%s ", argv[optind++]);
|
|
|
|
fprintf( stderr, "\n");
|
2002-11-01 06:12:53 +08:00
|
|
|
Usage();
|
2002-09-16 17:19:24 +08:00
|
|
|
}
|
|
|
|
|
2004-02-18 23:35:51 +08:00
|
|
|
if ( dev_id >= 0 && !(function&QUERY) )
|
2003-01-16 22:53:26 +08:00
|
|
|
{
|
2003-06-25 17:47:09 +08:00
|
|
|
fprintf( stderr, "Error, -d option cannot be used with this option\n" );
|
2003-01-16 22:53:26 +08:00
|
|
|
Usage();
|
|
|
|
}
|
2004-02-18 23:35:51 +08:00
|
|
|
if ( scale != -1 && !(function&IMAGE) )
|
|
|
|
{
|
|
|
|
fprintf( stderr, "Error, -S option cannot be used with this option\n" );
|
|
|
|
Usage();
|
|
|
|
}
|
2003-01-16 22:53:26 +08:00
|
|
|
//printf( "Monitor %d, Function %d\n", mon_id, function );
|
2002-09-16 17:19:24 +08:00
|
|
|
|
2003-03-26 20:00:16 +08:00
|
|
|
zm_dbg_name = "zmu";
|
|
|
|
zm_dbg_level = -1;
|
2002-09-16 17:19:24 +08:00
|
|
|
|
2003-03-26 20:00:16 +08:00
|
|
|
zmDbgInit();
|
2002-09-16 17:19:24 +08:00
|
|
|
|
2004-12-29 00:46:48 +08:00
|
|
|
zmLoadConfig();
|
2004-12-29 01:01:25 +08:00
|
|
|
zmDbConnect();
|
2002-09-16 17:19:24 +08:00
|
|
|
|
2003-07-04 22:48:51 +08:00
|
|
|
ValidateAccess( username, password, mon_id, function );
|
|
|
|
|
2003-01-16 22:53:26 +08:00
|
|
|
if ( dev_id >= 0 )
|
2002-09-16 17:19:24 +08:00
|
|
|
{
|
2003-06-25 17:47:09 +08:00
|
|
|
if ( function & QUERY )
|
|
|
|
{
|
2003-11-05 22:49:55 +08:00
|
|
|
char vid_string[BUFSIZ] = "";
|
2003-06-25 17:47:09 +08:00
|
|
|
bool ok = LocalCamera::GetCurrentSettings( dev_id, vid_string, verbose );
|
|
|
|
printf( "%s", vid_string );
|
|
|
|
exit( ok?0:-1 );
|
|
|
|
}
|
2003-01-16 22:53:26 +08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2003-03-26 20:00:16 +08:00
|
|
|
Monitor *monitor = Monitor::Load( mon_id, function&(QUERY|ZONES) );
|
2003-01-16 22:53:26 +08:00
|
|
|
|
|
|
|
if ( monitor )
|
2003-01-13 18:51:52 +08:00
|
|
|
{
|
2003-01-16 22:53:26 +08:00
|
|
|
if ( verbose )
|
|
|
|
{
|
|
|
|
printf( "Monitor %d(%s)\n", monitor->Id(), monitor->Name() );
|
|
|
|
}
|
|
|
|
char separator = ' ';
|
|
|
|
bool have_output = false;
|
|
|
|
if ( function & STATE )
|
|
|
|
{
|
|
|
|
Monitor::State state = monitor->GetState();
|
|
|
|
if ( verbose )
|
|
|
|
printf( "Current state: %s\n", state==Monitor::ALARM?"Alarm":(state==Monitor::ALERT?"Alert":"Idle") );
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( have_output ) printf( "%c", separator );
|
|
|
|
printf( "%d", state );
|
|
|
|
have_output = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( function & TIME )
|
|
|
|
{
|
2003-03-11 23:17:30 +08:00
|
|
|
struct timeval timestamp = monitor->GetTimestamp( image_idx );
|
2003-01-16 22:53:26 +08:00
|
|
|
if ( verbose )
|
|
|
|
{
|
|
|
|
char timestamp_str[64] = "None";
|
2003-03-11 23:17:30 +08:00
|
|
|
if ( timestamp.tv_sec )
|
|
|
|
strftime( timestamp_str, sizeof(timestamp_str), "%Y-%m-%d %H:%M:%S", localtime( ×tamp.tv_sec ) );
|
2003-01-16 22:53:26 +08:00
|
|
|
if ( image_idx == -1 )
|
2003-04-07 19:16:34 +08:00
|
|
|
printf( "Time of last image capture: %s.%02ld\n", timestamp_str, timestamp.tv_usec/10000 );
|
2003-01-16 22:53:26 +08:00
|
|
|
else
|
2003-04-07 19:16:34 +08:00
|
|
|
printf( "Time of image %d capture: %s.%02ld\n", image_idx, timestamp_str, timestamp.tv_usec/10000 );
|
2003-01-16 22:53:26 +08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( have_output ) printf( "%c", separator );
|
2003-04-07 19:16:34 +08:00
|
|
|
printf( "%ld.%02ld", timestamp.tv_sec, timestamp.tv_usec/10000 );
|
2003-01-16 22:53:26 +08:00
|
|
|
have_output = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( function & READ_IDX )
|
|
|
|
{
|
|
|
|
if ( verbose )
|
|
|
|
printf( "Last read index: %d\n", monitor->GetLastReadIndex() );
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( have_output ) printf( "%c", separator );
|
|
|
|
printf( "%d", monitor->GetLastReadIndex() );
|
|
|
|
have_output = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( function & WRITE_IDX )
|
|
|
|
{
|
|
|
|
if ( verbose )
|
|
|
|
printf( "Last write index: %d\n", monitor->GetLastWriteIndex() );
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( have_output ) printf( "%c", separator );
|
|
|
|
printf( "%d", monitor->GetLastWriteIndex() );
|
|
|
|
have_output = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( function & EVENT )
|
|
|
|
{
|
|
|
|
if ( verbose )
|
|
|
|
printf( "Last event id: %d\n", monitor->GetLastEvent() );
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( have_output ) printf( "%c", separator );
|
|
|
|
printf( "%d", monitor->GetLastEvent() );
|
|
|
|
have_output = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( function & FPS )
|
|
|
|
{
|
|
|
|
if ( verbose )
|
2003-04-07 19:16:34 +08:00
|
|
|
printf( "Current capture rate: %.2f frames per second\n", monitor->GetFPS() );
|
2003-01-16 22:53:26 +08:00
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( have_output ) printf( "%c", separator );
|
|
|
|
printf( "%.2f", monitor->GetFPS() );
|
|
|
|
have_output = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( function & IMAGE )
|
|
|
|
{
|
|
|
|
if ( verbose )
|
|
|
|
{
|
|
|
|
if ( image_idx == -1 )
|
2004-02-18 23:35:51 +08:00
|
|
|
printf( "Dumping last image captured to %s.jpg", monitor->Name() );
|
2003-01-16 22:53:26 +08:00
|
|
|
else
|
2004-02-18 23:35:51 +08:00
|
|
|
printf( "Dumping buffer image %d to %s.jpg", image_idx, monitor->Name() );
|
|
|
|
if ( scale != -1 )
|
|
|
|
printf( ", scaling by %d%%", scale );
|
|
|
|
printf( "\n" );
|
2003-01-16 22:53:26 +08:00
|
|
|
}
|
2004-02-18 23:35:51 +08:00
|
|
|
monitor->GetImage( image_idx, scale>0?scale:100 );
|
2003-01-16 22:53:26 +08:00
|
|
|
}
|
|
|
|
if ( function & ZONES )
|
|
|
|
{
|
|
|
|
if ( verbose )
|
|
|
|
printf( "Dumping zone image to %s-Zones.jpg\n", monitor->Name() );
|
2003-03-26 20:00:16 +08:00
|
|
|
monitor->DumpZoneImage();
|
2003-01-16 22:53:26 +08:00
|
|
|
}
|
|
|
|
if ( function & ALARM )
|
|
|
|
{
|
|
|
|
if ( verbose )
|
2003-03-26 21:18:26 +08:00
|
|
|
printf( "Forcing alarm on\n" );
|
2004-12-29 01:41:55 +08:00
|
|
|
monitor->ForceAlarmOn( (int)config.Item( ZM_FORCED_ALARM_SCORE ), "Forced Web" );
|
2003-03-26 21:18:26 +08:00
|
|
|
}
|
|
|
|
if ( function & NOALARM )
|
|
|
|
{
|
|
|
|
if ( verbose )
|
|
|
|
printf( "Forcing alarm off\n" );
|
|
|
|
monitor->ForceAlarmOff();
|
2003-01-16 22:53:26 +08:00
|
|
|
}
|
|
|
|
if ( function & CANCEL )
|
|
|
|
{
|
|
|
|
if ( verbose )
|
2003-03-26 21:18:26 +08:00
|
|
|
printf( "Cancelling forced alarm on/off\n" );
|
|
|
|
monitor->CancelForced();
|
2003-01-16 22:53:26 +08:00
|
|
|
}
|
2003-03-06 01:14:17 +08:00
|
|
|
if ( function & QUERY )
|
|
|
|
{
|
|
|
|
char mon_string[1024] = "";
|
|
|
|
monitor->DumpSettings( mon_string, verbose );
|
|
|
|
printf( "%s\n", mon_string );
|
|
|
|
}
|
2003-06-25 17:47:09 +08:00
|
|
|
if ( function & BRIGHTNESS )
|
|
|
|
{
|
|
|
|
if ( verbose )
|
|
|
|
{
|
|
|
|
if ( brightness >= 0 )
|
|
|
|
printf( "New brightness: %d\n", monitor->Brightness( brightness ) );
|
|
|
|
else
|
|
|
|
printf( "Current brightness: %d\n", monitor->Brightness() );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( have_output ) printf( "%c", separator );
|
|
|
|
if ( brightness >= 0 )
|
|
|
|
printf( "%d", monitor->Brightness( brightness ) );
|
|
|
|
else
|
|
|
|
printf( "%d", monitor->Brightness() );
|
|
|
|
have_output = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( function & CONTRAST )
|
|
|
|
{
|
|
|
|
if ( verbose )
|
|
|
|
{
|
|
|
|
if ( contrast >= 0 )
|
|
|
|
printf( "New brightness: %d\n", monitor->Contrast( contrast ) );
|
|
|
|
else
|
|
|
|
printf( "Current contrast: %d\n", monitor->Contrast() );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( have_output ) printf( "%c", separator );
|
|
|
|
if ( contrast >= 0 )
|
|
|
|
printf( "%d", monitor->Contrast( contrast ) );
|
|
|
|
else
|
|
|
|
printf( "%d", monitor->Contrast() );
|
|
|
|
have_output = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( function & HUE )
|
|
|
|
{
|
|
|
|
if ( verbose )
|
|
|
|
{
|
|
|
|
if ( hue >= 0 )
|
|
|
|
printf( "New hue: %d\n", monitor->Hue( hue ) );
|
|
|
|
else
|
|
|
|
printf( "Current hue: %d\n", monitor->Hue() );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( have_output ) printf( "%c", separator );
|
|
|
|
if ( hue >= 0 )
|
|
|
|
printf( "%d", monitor->Hue( hue ) );
|
|
|
|
else
|
|
|
|
printf( "%d", monitor->Hue() );
|
|
|
|
have_output = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( function & COLOUR )
|
|
|
|
{
|
|
|
|
if ( verbose )
|
|
|
|
{
|
|
|
|
if ( colour >= 0 )
|
|
|
|
printf( "New colour: %d\n", monitor->Colour( colour ) );
|
|
|
|
else
|
|
|
|
printf( "Current colour: %d\n", monitor->Colour() );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( have_output ) printf( "%c", separator );
|
|
|
|
if ( colour >= 0 )
|
|
|
|
printf( "%d", monitor->Colour( colour ) );
|
|
|
|
else
|
|
|
|
printf( "%d", monitor->Colour() );
|
|
|
|
have_output = true;
|
|
|
|
}
|
|
|
|
}
|
2003-01-16 22:53:26 +08:00
|
|
|
if ( have_output )
|
|
|
|
{
|
|
|
|
printf( "\n" );
|
|
|
|
}
|
|
|
|
if ( !function )
|
|
|
|
{
|
|
|
|
Usage();
|
|
|
|
}
|
2003-01-13 18:51:52 +08:00
|
|
|
}
|
2003-01-16 22:53:26 +08:00
|
|
|
else
|
2002-11-01 06:12:53 +08:00
|
|
|
{
|
2003-07-04 22:48:51 +08:00
|
|
|
fprintf( stderr, "Error, invalid monitor id %d\n", mon_id );
|
2003-01-16 22:53:26 +08:00
|
|
|
exit( -1 );
|
2002-11-01 06:12:53 +08:00
|
|
|
}
|
2002-09-16 17:19:24 +08:00
|
|
|
}
|
2002-10-28 22:33:57 +08:00
|
|
|
return( 0 );
|
2002-09-16 17:19:24 +08:00
|
|
|
}
|