Bug 63 - Allow update of image annotation via trigger mechanism.

git-svn-id: http://svn.zoneminder.com/svn/zm/trunk@1423 e3e1d417-86f3-4887-817a-d78f3d33393f
This commit is contained in:
stan 2005-05-19 16:22:22 +00:00
parent 5616032f09
commit c20d73e95b
3 changed files with 74 additions and 9 deletions

View File

@ -156,7 +156,8 @@ foreach my $source ( @sources )
{ {
local *sfh; local *sfh;
#sysopen( *sfh, $source->{path}, O_NONBLOCK|O_RDONLY ) or die( "Can't sysopen: $!" ); #sysopen( *sfh, $source->{path}, O_NONBLOCK|O_RDONLY ) or die( "Can't sysopen: $!" );
open( *sfh, "<".$source->{path} ) or die( "Can't open: $!" ); #open( *sfh, "<".$source->{path} ) or die( "Can't open: $!" );
open( *sfh, "+<".$source->{path} ) or die( "Can't open: $!" );
$source->{handle} = *sfh; $source->{handle} = *sfh;
vec( $base_rin, fileno($source->{handle}),1) = 1; vec( $base_rin, fileno($source->{handle}),1) = 1;
} }
@ -278,7 +279,10 @@ sub handleMessage
{ {
next if ( !$message ); next if ( !$message );
print( "Processing message '$message'\n" ) if ( VERBOSE ); print( "Processing message '$message'\n" ) if ( VERBOSE );
my ( $id, $action, $score, $cause, $text ) = split( /\|/, $message ); my ( $id, $action, $score, $cause, $text, $showtext ) = split( /\|/, $message );
$score = 0 if ( !defined($score) );
$cause = 0 if ( !defined($cause) );
$text = 0 if ( !defined($text) );
my $res = $sth->execute( $id, $id ) or die( "Can't execute '$sql': ".$sth->errstr() ); my $res = $sth->execute( $id, $id ) or die( "Can't execute '$sql': ".$sth->errstr() );
my $monitor = $sth->fetchrow_hashref(); my $monitor = $sth->fetchrow_hashref();
@ -289,7 +293,7 @@ sub handleMessage
next; next;
} }
print( "Found monitor for id '$id'\n" ) if ( VERBOSE ); print( "Found monitor for id '$id'\n" ) if ( VERBOSE );
my $size = 512; # We only need the first 512 bytes really for the alarm state and forced alarm my $size = 512; # We only need the first 512 bytes really for the shared data and trigger section
$monitor->{ShmKey} = hex(ZM_SHM_KEY)|$monitor->{Id}; $monitor->{ShmKey} = hex(ZM_SHM_KEY)|$monitor->{Id};
$monitor->{ShmId} = shmget( $monitor->{ShmKey}, $size, 0 ); $monitor->{ShmId} = shmget( $monitor->{ShmKey}, $size, 0 );
if ( !defined($monitor->{ShmId}) ) if ( !defined($monitor->{ShmId}) )
@ -298,13 +302,30 @@ sub handleMessage
next; next;
} }
my $shm_data_size;
if ( !shmread( $monitor->{ShmId}, $shm_data_size, 0, 4 ) )
{
print( "Can't read from shared memory: $!\n" );
exit( -1 );
}
$shm_data_size = unpack( "l", $shm_data_size );
my $trigger_data_offset = $shm_data_size+4; # Allow for 'size' member of trigger data
print( "Handling action '$action'\n" ) if ( VERBOSE ); print( "Handling action '$action'\n" ) if ( VERBOSE );
if ( $action =~ /^(on|off)(?:\+(\d+))?$/ ) if ( $action =~ /^(on|off)(?:\+(\d+))?$/ )
{ {
my $trigger = $1; my $trigger = $1;
my $delay = $2; my $delay = $2;
my $force_data = pack( "llZ32Z256", $trigger eq "on"?1:2, $trigger eq "on"?$score:0, $cause, $text ); my $trigger_data;
if ( !shmwrite( $monitor->{ShmId}, $force_data, 60, 4+4+32+256 ) ) if ( defined($showtext) )
{
$trigger_data = pack( "llZ32Z256Z32", $trigger eq "on"?1:2, $trigger eq "on"?$score:0, $cause, $text, $showtext );
}
else
{
$trigger_data = pack( "llZ32Z256", $trigger eq "on"?1:2, $trigger eq "on"?$score:0, $cause, $text );
}
if ( !shmwrite( $monitor->{ShmId}, $trigger_data, $trigger_data_offset, length($trigger_data) ) )
{ {
print( "Can't write to shared memory: $!\n" ); print( "Can't write to shared memory: $!\n" );
} }
@ -312,7 +333,7 @@ sub handleMessage
if ( $delay ) if ( $delay )
{ {
my $action_time = time()+$delay; my $action_time = time()+$delay;
my $action_text = $id."|cancel|".$cause."|".$text; my $action_text = $id."|cancel|0|".$cause."|".$text;
my $action_array = $actions{$action_time}; my $action_array = $actions{$action_time};
if ( !$action_array ) if ( !$action_array )
{ {
@ -324,13 +345,30 @@ sub handleMessage
} }
elsif( $action eq "cancel" ) elsif( $action eq "cancel" )
{ {
my $force_data = pack( "llZ32Z256", 0, 0, "", "" ); my $trigger_data;
if ( !shmwrite( $monitor->{ShmId}, $force_data, 60, 4+4+32+256 ) ) if ( defined($showtext) )
{
$trigger_data = pack( "llZ32Z256Z32", 0, 0, "", "", $showtext );
}
else
{
$trigger_data = pack( "llZ32Z256", 0, 0, "", "" );
}
if ( !shmwrite( $monitor->{ShmId}, $trigger_data, $trigger_data_offset, length($trigger_data) ) )
{ {
print( "Can't write to shared memory: $!\n" ); print( "Can't write to shared memory: $!\n" );
} }
print( "Cancelled event '$cause'\n" ); print( "Cancelled event '$cause'\n" );
} }
elsif( $action eq "show" )
{
my $trigger_data = pack( "Z32", $showtext );
if ( !shmwrite( $monitor->{ShmId}, $trigger_data, $trigger_data_offset, length($trigger_data) ) )
{
print( "Can't write to shared memory: $!\n" );
}
print( "Updated show text to '$showtext'\n" );
}
else else
{ {
print( "Unrecognised action '$action' in message '$message'\n" ); print( "Unrecognised action '$action' in message '$message'\n" );

View File

@ -263,6 +263,7 @@ void Monitor::Setup()
trigger_data->trigger_score = 0; trigger_data->trigger_score = 0;
trigger_data->trigger_cause[0] = 0; trigger_data->trigger_cause[0] = 0;
trigger_data->trigger_text[0] = 0; trigger_data->trigger_text[0] = 0;
trigger_data->trigger_showtext[0] = 0;
} }
if ( !shared_data->valid ) if ( !shared_data->valid )
{ {

View File

@ -149,6 +149,7 @@ protected:
int trigger_score; int trigger_score;
char trigger_cause[32]; char trigger_cause[32];
char trigger_text[256]; char trigger_text[256];
char trigger_showtext[32];
} TriggerData; } TriggerData;
SharedData *shared_data; SharedData *shared_data;
@ -200,11 +201,36 @@ public:
{ {
if ( label_format[0] ) if ( label_format[0] )
{ {
static int token_count = -1;
static char label_time_text[256]; static char label_time_text[256];
static char label_text[256]; static char label_text[256];
if ( token_count < 0 )
{
const char *token_ptr = label_format;
const char *token_string = "%%s";
token_count = 0;
while( token_ptr = strstr( token_ptr, token_string ) )
{
token_count++;
token_ptr += strlen(token_string);
}
Info(( "Found %d tokens, in %s", token_count, label_format ));
}
strftime( label_time_text, sizeof(label_time_text), label_format, localtime( &ts_time ) ); strftime( label_time_text, sizeof(label_time_text), label_format, localtime( &ts_time ) );
snprintf( label_text, sizeof(label_text), label_time_text, name ); switch ( token_count )
{
case 1:
{
snprintf( label_text, sizeof(label_text), label_time_text, name );
break;
}
case 2:
{
snprintf( label_text, sizeof(label_text), label_time_text, name, trigger_data->trigger_showtext );
break;
}
}
ts_image->Annotate( label_text, label_coord ); ts_image->Annotate( label_text, label_coord );
} }