From f089f28bd4efa9091b2a0c53d6c132444a7ab2f9 Mon Sep 17 00:00:00 2001 From: stan Date: Mon, 16 May 2005 09:27:06 +0000 Subject: [PATCH] Added simplified direct config interface. git-svn-id: http://svn.zoneminder.com/svn/zm/trunk@1406 e3e1d417-86f3-4887-817a-d78f3d33393f --- src/zm_config.cpp | 6 ++++ src/zm_config.h.z | 4 +++ src/zm_event.cpp | 28 ++++++++---------- src/zm_event.h | 10 ++----- src/zm_image.cpp | 18 ++++-------- src/zm_image.h | 3 -- src/zm_local_camera.cpp | 11 ++++--- src/zm_monitor.cpp | 62 +++++++++++++++------------------------- src/zm_monitor.h | 30 +------------------ src/zm_remote_camera.cpp | 14 ++++----- src/zm_user.cpp | 2 +- src/zm_zone.cpp | 25 ++++++---------- src/zm_zone.h | 12 -------- src/zma.cpp | 2 +- src/zmc.cpp | 4 +-- src/zmf.cpp | 6 ++-- src/zmfix.cpp | 8 ++---- src/zms.cpp | 4 +-- src/zmu.cpp | 4 +-- zmconfig.pl.in | 58 +++++++++++++++++++++++++++++++++++-- 20 files changed, 145 insertions(+), 166 deletions(-) diff --git a/src/zm_config.cpp b/src/zm_config.cpp index c80bac231..8ba0c8500 100644 --- a/src/zm_config.cpp +++ b/src/zm_config.cpp @@ -99,6 +99,7 @@ void zmLoadConfig() fclose( cfg); zmDbConnect(); config.Load(); + config.Assign(); } ConfigItem::ConfigItem( const char *p_name, const char *p_value, const char *const p_type ) @@ -237,6 +238,11 @@ void Config::Load() } } +void Config::Assign() +{ +ZM_CFG_ASSIGN_LIST +} + const ConfigItem &Config::Item( int id ) { if ( !n_items ) diff --git a/src/zm_config.h.z b/src/zm_config.h.z index ce0265d7f..90f7f80d4 100644 --- a/src/zm_config.h.z +++ b/src/zm_config.h.z @@ -88,6 +88,9 @@ public: class Config { +public: + ZM_CFG_DECLARE_LIST + private: int n_items; ConfigItem **items; @@ -97,6 +100,7 @@ public: ~Config(); void Load(); + void Assign(); const ConfigItem &Item( int id ); }; diff --git a/src/zm_event.cpp b/src/zm_event.cpp index 51717ad5a..30753bd75 100644 --- a/src/zm_event.cpp +++ b/src/zm_event.cpp @@ -33,8 +33,6 @@ #include "zmf.h" bool Event::initialised = false; -bool Event::timestamp_on_capture; -int Event::bulk_frame_interval; char Event::capture_file_format[PATH_MAX]; char Event::analyse_file_format[PATH_MAX]; char Event::general_file_format[PATH_MAX]; @@ -63,7 +61,7 @@ Event::Event( Monitor *p_monitor, struct timeval p_start_time, const char *event alarm_frames = 0; tot_score = 0; max_score = 0; - snprintf( path, sizeof(path), "%s/%d/%d", (const char *)config.Item( ZM_DIR_EVENTS ), monitor->Id(), id ); + snprintf( path, sizeof(path), "%s/%d/%d", config.dir_events, monitor->Id(), id ); struct stat statbuf; errno = 0; @@ -128,7 +126,7 @@ bool Event::OpenFrameSocket( int monitor_id ) return( false ); } - int socket_buffer_size = (int)config.Item( ZM_FRAME_SOCKET_SIZE ); + int socket_buffer_size = config.frame_socket_size; if ( socket_buffer_size > 0 ) { if ( setsockopt( sd, SOL_SOCKET, SO_SNDBUF, &socket_buffer_size, sizeof(socket_buffer_size) ) < 0 ) @@ -158,7 +156,7 @@ bool Event::OpenFrameSocket( int monitor_id ) } char sock_path[PATH_MAX] = ""; - snprintf( sock_path, sizeof(sock_path), "%s/zmf-%d.sock", (const char *)config.Item( ZM_PATH_SOCKS ), monitor_id ); + snprintf( sock_path, sizeof(sock_path), "%s/zmf-%d.sock", config.path_socks, monitor_id ); struct sockaddr_un addr; @@ -243,9 +241,9 @@ bool Event::SendFrameImage( const Image *image, bool alarm_frame ) bool Event::WriteFrameImage( Image *image, struct timeval timestamp, const char *event_file, bool alarm_frame ) { - if ( timestamp_on_capture ) + if ( config.timestamp_on_capture ) { - if ( !(bool)config.Item( ZM_OPT_FRAME_SERVER ) || !SendFrameImage( image, alarm_frame) ) + if ( !config.opt_frame_server || !SendFrameImage( image, alarm_frame) ) { image->WriteJpeg( event_file ); } @@ -254,7 +252,7 @@ bool Event::WriteFrameImage( Image *image, struct timeval timestamp, const char { Image ts_image( *image ); monitor->TimestampImage( &ts_image, timestamp.tv_sec ); - if ( !(bool)config.Item( ZM_OPT_FRAME_SERVER ) || !SendFrameImage( &ts_image, alarm_frame) ) + if ( !config.opt_frame_server || !SendFrameImage( &ts_image, alarm_frame) ) { ts_image.WriteJpeg( event_file ); } @@ -307,7 +305,7 @@ void Event::AddFrame( Image *image, struct timeval timestamp, int score, Image * struct DeltaTimeval delta_time; DELTA_TIMEVAL( delta_time, timestamp, start_time, DT_PREC_2 ); - bool db_frame = (score>=0) || ((frames%bulk_frame_interval)==0) || !frames; + bool db_frame = (score>=0) || ((frames%config.bulk_frame_interval)==0) || !frames; if ( db_frame ) { @@ -343,11 +341,11 @@ void Event::AddFrame( Image *image, struct timeval timestamp, int score, Image * } } - if ( (bool)config.Item( ZM_RECORD_DIAG_IMAGES ) ) + if ( config.record_diag_images ) { char diag_glob[PATH_MAX] = ""; - snprintf( diag_glob, sizeof(diag_glob), "%s/%d/diag-*.jpg", (const char *)config.Item( ZM_DIR_EVENTS ), monitor->Id() ); + snprintf( diag_glob, sizeof(diag_glob), "%s/%d/diag-*.jpg", config.dir_events, monitor->Id() ); glob_t pglob; int glob_status = glob( diag_glob, 0, 0, &pglob ); if ( glob_status != 0 ) @@ -414,7 +412,7 @@ void Event::StreamEvent( int event_id, int scale, int rate, int maxfps ) exit( mysql_errno( &dbconn ) ); } - snprintf( eventpath, sizeof(eventpath), "%s/%s/%d/%d", ZM_PATH_WEB, (const char *)config.Item( ZM_DIR_EVENTS ), atoi( dbrow[0] ), event_id ); + snprintf( eventpath, sizeof(eventpath), "%s/%s/%d/%d", ZM_PATH_WEB, config.dir_events, atoi( dbrow[0] ), event_id ); int frames = atoi(dbrow[2]); double duration = atof(dbrow[3]); @@ -538,8 +536,6 @@ void Event::StreamMpeg( int event_id, const char *format, int scale, int rate, i if ( !initialised ) Initialise(); - bool timed_frames = (bool)config.Item( ZM_VIDEO_TIMED_FRAMES ); - snprintf( sql, sizeof(sql), "select M.Id, M.Name, E.Frames, max(F.Delta)-min(F.Delta) as Duration from Events as E inner join Monitors as M on E.MonitorId = M.Id inner join Frames as F on E.Id = F.EventId where E.Id = %d group by E.Id", event_id ); if ( mysql_query( &dbconn, sql ) ) { @@ -561,7 +557,7 @@ void Event::StreamMpeg( int event_id, const char *format, int scale, int rate, i exit( mysql_errno( &dbconn ) ); } - snprintf( eventpath, sizeof(eventpath), "%s/%s/%d/%d", ZM_PATH_WEB, (const char *)config.Item( ZM_DIR_EVENTS ), atoi( dbrow[0] ), event_id ); + snprintf( eventpath, sizeof(eventpath), "%s/%s/%d/%d", ZM_PATH_WEB, config.dir_events, atoi( dbrow[0] ), event_id ); int frames = atoi(dbrow[2]); double duration = atof(dbrow[3]); @@ -633,7 +629,7 @@ void Event::StreamMpeg( int event_id, const char *format, int scale, int rate, i delta_ms = (unsigned int)((last_delta+temp_delta)*1000); if ( rate != ZM_RATE_SCALE ) delta_ms = (delta_ms*ZM_RATE_SCALE)/rate; - double pts = vid_stream->EncodeFrame( image.Buffer(), image.Size(), timed_frames, delta_ms ); + double pts = vid_stream->EncodeFrame( image.Buffer(), image.Size(), config.video_timed_frames, delta_ms ); Debug( 2, ( "I:%d, DI:%d, LI:%d, DD:%lf, LD:%lf, TD:%lf, DM:%d, PTS:%lf", id, db_id, last_id, db_delta, last_delta, temp_delta, delta_ms, pts )); diff --git a/src/zm_event.h b/src/zm_event.h index 18e15d546..cef134d42 100644 --- a/src/zm_event.h +++ b/src/zm_event.h @@ -45,8 +45,6 @@ class Event { protected: static bool initialised; - static bool timestamp_on_capture; - static int bulk_frame_interval; static char capture_file_format[PATH_MAX]; static char analyse_file_format[PATH_MAX]; static char general_file_format[PATH_MAX]; @@ -85,11 +83,9 @@ protected: { initialised = true; - timestamp_on_capture = (bool)config.Item( ZM_TIMESTAMP_ON_CAPTURE ); - bulk_frame_interval = (int)config.Item( ZM_BULK_FRAME_INTERVAL ); - snprintf( capture_file_format, sizeof(capture_file_format), "%%s/%%0%dd-capture.jpg", (int)config.Item( ZM_EVENT_IMAGE_DIGITS ) ); - snprintf( analyse_file_format, sizeof(analyse_file_format), "%%s/%%0%dd-analyse.jpg", (int)config.Item( ZM_EVENT_IMAGE_DIGITS ) ); - snprintf( general_file_format, sizeof(general_file_format), "%%s/%%0%dd-%%s", (int)config.Item( ZM_EVENT_IMAGE_DIGITS ) ); + snprintf( capture_file_format, sizeof(capture_file_format), "%%s/%%0%dd-capture.jpg", config.event_image_digits ); + snprintf( analyse_file_format, sizeof(analyse_file_format), "%%s/%%0%dd-analyse.jpg", config.event_image_digits ); + snprintf( general_file_format, sizeof(general_file_format), "%%s/%%0%dd-%%s", config.event_image_digits ); } public: diff --git a/src/zm_image.cpp b/src/zm_image.cpp index 3de876eac..389ee2343 100644 --- a/src/zm_image.cpp +++ b/src/zm_image.cpp @@ -23,9 +23,6 @@ #define ABSDIFF(a,b) (((a)<(b))?((b)-(a)):((a)-(b))) bool Image::initialised = false; -bool Image::y_image_deltas; -bool Image::fast_image_blends; -bool Image::colour_jpeg_files; unsigned char *Image::abs_table; unsigned char *Image::y_r_table; unsigned char *Image::y_g_table; @@ -36,9 +33,6 @@ void Image::Initialise() { initialised = true; - y_image_deltas = (bool)config.Item( ZM_Y_IMAGE_DELTAS ); - fast_image_blends = (bool)config.Item( ZM_FAST_IMAGE_BLENDS ); - colour_jpeg_files = (bool)config.Item( ZM_COLOUR_JPEG_FILES ); abs_table = new unsigned char[(6*255)+1]; abs_table += (3*255); y_r_table = new unsigned char[511]; @@ -164,7 +158,7 @@ void Image::ReadJpeg( const char *filename ) void Image::WriteJpeg( const char *filename ) const { - if ( colour_jpeg_files && colours == 1 ) + if ( config.colour_jpeg_files && colours == 1 ) { Image temp_image( *this ); temp_image.Colourise(); @@ -199,7 +193,7 @@ void Image::WriteJpeg( const char *filename ) const } jpeg_set_defaults(&cinfo); cinfo.dct_method = JDCT_FASTEST; - jpeg_set_quality(&cinfo, (int)config.Item( ZM_JPEG_FILE_QUALITY ), false); + jpeg_set_quality(&cinfo, config.jpeg_file_quality, false); jpeg_start_compress(&cinfo, TRUE); JSAMPROW row_pointer; /* pointer to a single row */ @@ -254,7 +248,7 @@ void Image::DecodeJpeg( JOCTET *inbuffer, int inbuffer_size ) void Image::EncodeJpeg( JOCTET *outbuffer, int *outbuffer_size ) const { - if ( colour_jpeg_files && colours == 1 ) + if ( config.colour_jpeg_files && colours == 1 ) { Image temp_image( *this ); temp_image.Colourise(); @@ -282,7 +276,7 @@ void Image::EncodeJpeg( JOCTET *outbuffer, int *outbuffer_size ) const } jpeg_set_defaults(&cinfo); cinfo.dct_method = JDCT_FASTEST; - jpeg_set_quality(&cinfo, (int)config.Item( ZM_JPEG_IMAGE_QUALITY ), false); + jpeg_set_quality(&cinfo, config.jpeg_file_quality, false); jpeg_start_compress(&cinfo, TRUE); JSAMPROW row_pointer; /* pointer to a single row */ @@ -371,7 +365,7 @@ void Image::Blend( const Image &image, int transparency ) const { assert( width == image.width && height == image.height && colours == image.colours ); - if ( fast_image_blends ) + if ( config.fast_image_blends ) { BlendTablePtr blend_ptr = GetBlendTable( transparency ); @@ -540,7 +534,7 @@ Image *Image::Delta( const Image &image ) const register int red, green, blue; while( psrc < (buffer+size) ) { - if ( y_image_deltas ) + if ( config.y_image_deltas ) { //Info(( "RS:%d, RR: %d", *psrc, *pref )); red = y_r_table[*psrc++ - *pref++]; diff --git a/src/zm_image.h b/src/zm_image.h index 472f2bf63..6d1086b06 100644 --- a/src/zm_image.h +++ b/src/zm_image.h @@ -50,9 +50,6 @@ protected: protected: static bool initialised; - static bool y_image_deltas; - static bool fast_image_blends; - static bool colour_jpeg_files; static unsigned char *abs_table; static unsigned char *y_r_table; static unsigned char *y_g_table; diff --git a/src/zm_local_camera.cpp b/src/zm_local_camera.cpp index 389df9131..6968f8d68 100644 --- a/src/zm_local_camera.cpp +++ b/src/zm_local_camera.cpp @@ -114,7 +114,8 @@ void LocalCamera::Initialise() if ( ioctl( m_videohandle, VIDIOCSPICT, &vid_pic ) < 0 ) { Error(( "Failed to set picture attributes: %s", strerror(errno) )); - if ( (bool)config.Item( ZM_STRICT_VIDEO_CONFIG ) ) exit(-1); + if ( config.strict_video_config ) + exit(-1); } struct video_window vid_win; @@ -140,7 +141,8 @@ void LocalCamera::Initialise() if ( ioctl( m_videohandle, VIDIOCSWIN, &vid_win ) < 0 ) { Error(( "Failed to set window attributes: %s", strerror(errno) )); - if ( (bool)config.Item( ZM_STRICT_VIDEO_CONFIG ) ) exit(-1); + if ( config.strict_video_config ) + exit(-1); } if ( ioctl(m_videohandle, VIDIOCGMBUF, &m_vmb) < 0 ) @@ -186,7 +188,8 @@ void LocalCamera::Initialise() if ( ioctl( m_videohandle, VIDIOCSCHAN, &vid_src) < 0 ) { Error(( "Failed to set camera source %d: %s", channel, strerror(errno) )); - if ( (bool)config.Item( ZM_STRICT_VIDEO_CONFIG ) ) exit(-1); + if ( config.strict_video_config ) + exit(-1); } if ( ioctl( m_videohandle, VIDIOCGWIN, &vid_win) < 0 ) @@ -785,7 +788,7 @@ int LocalCamera::PostCapture( Image &image ) } case VIDEO_PALETTE_RGB24 : { - if ( (bool)config.Item( ZM_LOCAL_BGR_INVERT ) ) + if ( config.local_bgr_invert ) { int size = width*height*3; unsigned char *s_ptr = buffer; diff --git a/src/zm_monitor.cpp b/src/zm_monitor.cpp index 0cedbeda0..9d901a6b8 100644 --- a/src/zm_monitor.cpp +++ b/src/zm_monitor.cpp @@ -27,17 +27,6 @@ #include "zm_local_camera.h" #include "zm_remote_camera.h" -bool Monitor::initialised = false; -bool Monitor::record_event_stats; -bool Monitor::record_diag_images; -bool Monitor::opt_adaptive_skip; -bool Monitor::create_analysis_images; -bool Monitor::blend_alarmed_images; -bool Monitor::timestamp_on_capture; -int Monitor::bulk_frame_interval; -bool Monitor::opt_control; -const char *Monitor::dir_events; - Monitor::Monitor( int p_id, char *p_name, @@ -219,9 +208,6 @@ Monitor::~Monitor() void Monitor::Setup() { - if ( !initialised ) - Initialise(); - fps = 0.0; event_count = 0; image_count = 0; @@ -240,7 +226,7 @@ void Monitor::Setup() int shared_data_size = sizeof(SharedData)+sizeof(TriggerData)+(image_buffer_count*sizeof(time_t))+(image_buffer_count*camera->ImageSize()); Debug( 1, ( "shm.size=%d", shared_data_size )); - shmid = shmget( (int)config.Item( ZM_SHM_KEY )|id, shared_data_size, IPC_CREAT|0700 ); + shmid = shmget( config.shm_key|id, shared_data_size, IPC_CREAT|0700 ); if ( shmid < 0 ) { Error(( "Can't shmget, probably not enough shared memory space free: %s", strerror(errno))); @@ -310,7 +296,7 @@ void Monitor::Setup() { static char path[PATH_MAX]; - strncpy( path, dir_events, sizeof(path) ); + strncpy( path, config.dir_events, sizeof(path) ); struct stat statbuf; errno = 0; @@ -323,7 +309,7 @@ void Monitor::Setup() } } - snprintf( path, sizeof(path), "%s/%d", dir_events, id ); + snprintf( path, sizeof(path), "%s/%d", config.dir_events, id ); errno = 0; stat( path, &statbuf ); @@ -335,7 +321,7 @@ void Monitor::Setup() } char temp_path[PATH_MAX]; snprintf( temp_path, sizeof(temp_path), "%d", id ); - chdir( dir_events ); + chdir( config.dir_events ); symlink( temp_path, name ); chdir( ".." ); } @@ -376,7 +362,7 @@ int Monitor::GetImage( int index, int scale ) const static char filename[PATH_MAX]; snprintf( filename, sizeof(filename), "%s.jpg", name ); - if ( !timestamp_on_capture ) + if ( !config.timestamp_on_capture ) { TimestampImage( &snap_image, snap->timestamp->tv_sec ); } @@ -673,7 +659,7 @@ bool Monitor::Analyse() } int index; - if ( opt_adaptive_skip ) + if ( config.opt_adaptive_skip ) { int read_margin = shared_data->last_read_index - shared_data->last_write_index; if ( read_margin < 0 ) read_margin += image_buffer_count; @@ -787,7 +773,7 @@ bool Monitor::Analyse() Info(( "%s: %03d - Starting new event %d", name, image_count, event->Id() )); - //if ( (bool)config.Item( ZM_OVERLAP_TIMED_EVENTS ) ) + //if ( config.overlap_timed_events ) if ( true ) { int pre_index = ((index+image_buffer_count)-pre_event_count)%image_buffer_count; @@ -807,7 +793,7 @@ bool Monitor::Analyse() } if ( score ) { - if ( opt_control && track_motion && (activity_state != ACTIVE) ) + if ( config.opt_control && track_motion && (activity_state != ACTIVE) ) { // Do nothing } @@ -864,7 +850,7 @@ bool Monitor::Analyse() } else { - if ( opt_control && track_motion && (activity_state != ACTIVE) ) + if ( config.opt_control && track_motion && (activity_state != ACTIVE) ) { // Do nothing } @@ -909,7 +895,7 @@ bool Monitor::Analyse() { if ( state == PREALARM || state == ALARM ) { - if ( create_analysis_images ) + if ( config.create_analysis_images ) { bool got_anal_image = false; Image alarm_image( *snap_image ); @@ -922,7 +908,7 @@ bool Monitor::Analyse() alarm_image.Overlay( *(zones[i]->AlarmImage()) ); got_anal_image = true; } - if ( record_event_stats && state == ALARM ) + if ( config.record_event_stats && state == ALARM ) { zones[i]->RecordStats( event ); } @@ -959,7 +945,7 @@ bool Monitor::Analyse() { if ( !(image_count%(frame_skip+1)) ) { - if ( bulk_frame_interval > 1 ) + if ( config.bulk_frame_interval > 1 ) { event->AddFrame( snap_image, *timestamp, -1 ); } @@ -991,7 +977,7 @@ bool Monitor::Analyse() } } - if ( (function == MODECT || function == MOCORD) && (blend_alarmed_images || state != ALARM) ) + if ( (function == MODECT || function == MOCORD) && (config.blend_alarmed_images || state != ALARM) ) { ref_image.Blend( *snap_image, ref_blend_perc ); } @@ -1335,7 +1321,7 @@ void Monitor::StreamImages( int scale, int maxfps, time_t ttl ) snap_image = &scaled_image; } - if ( !timestamp_on_capture ) + if ( !config.timestamp_on_capture ) { TimestampImage( snap_image, snap->timestamp->tv_sec ); } @@ -1378,7 +1364,7 @@ void Monitor::SingleImage( int scale) scaled_image.Scale( scale ); snap_image = &scaled_image; } - if ( !timestamp_on_capture ) + if ( !config.timestamp_on_capture ) { TimestampImage( snap_image, snap->timestamp->tv_sec ); } @@ -1393,8 +1379,6 @@ void Monitor::SingleImage( int scale) void Monitor::StreamMpeg( const char *format, int scale, int maxfps, int bitrate ) { - bool timed_frames = (bool)config.Item( ZM_VIDEO_TIMED_FRAMES ); - int fps = int(GetFPS()); if ( !fps ) fps = 5; @@ -1450,7 +1434,7 @@ void Monitor::StreamMpeg( const char *format, int scale, int maxfps, int bitrate snap_image = &scaled_image; } - if ( !timestamp_on_capture ) + if ( !config.timestamp_on_capture ) { TimestampImage( snap_image, snap->timestamp->tv_sec ); } @@ -1460,7 +1444,7 @@ void Monitor::StreamMpeg( const char *format, int scale, int maxfps, int bitrate base_time = *(snap->timestamp); } DELTA_TIMEVAL( delta_time, *(snap->timestamp), base_time, DT_PREC_3 ); - double pts = vid_stream.EncodeFrame( snap_image->Buffer(), snap_image->Size(), timed_frames, delta_time.delta ); + double pts = vid_stream.EncodeFrame( snap_image->Buffer(), snap_image->Size(), config.video_timed_frames, delta_time.delta ); //Info(( "FC:%d, DTD:%d, PTS:%lf", frame_count, delta_time.delta, pts )); } frame_count++; @@ -1528,24 +1512,24 @@ unsigned int Monitor::Compare( const Image &comp_image ) if ( n_zones <= 0 ) return( alarm ); - if ( record_diag_images ) + if ( config.record_diag_images ) { static char diag_path[PATH_MAX] = ""; if ( !diag_path[0] ) { - snprintf( diag_path, sizeof(diag_path), "%s/%d/diag-r.jpg", dir_events, id ); + snprintf( diag_path, sizeof(diag_path), "%s/%d/diag-r.jpg", config.dir_events, id ); } ref_image.WriteJpeg( diag_path ); } Image *delta_image = ref_image.Delta( comp_image ); - if ( record_diag_images ) + if ( config.record_diag_images ) { static char diag_path[PATH_MAX] = ""; if ( !diag_path[0] ) { - snprintf( diag_path, sizeof(diag_path), "%s/%d/diag-d.jpg", dir_events, id ); + snprintf( diag_path, sizeof(diag_path), "%s/%d/diag-d.jpg", config.dir_events, id ); } delta_image->WriteJpeg( diag_path ); } @@ -1608,7 +1592,7 @@ unsigned int Monitor::Compare( const Image &comp_image ) score += zone->Score(); zone->SetAlarm(); Debug( 3, ( "Zone is alarmed, zone score = %d", zone->Score() )); - if ( opt_control && track_motion ) + if ( config.opt_control && track_motion ) { if ( (int)zone->Score() > top_score ) { @@ -1635,7 +1619,7 @@ unsigned int Monitor::Compare( const Image &comp_image ) score += zone->Score(); zone->SetAlarm(); Debug( 3, ( "Zone is alarmed, zone score = %d", zone->Score() )); - if ( opt_control && track_motion ) + if ( config.opt_control && track_motion ) { if ( zone->Score() > top_score ) { diff --git a/src/zm_monitor.h b/src/zm_monitor.h index b39404e11..ac41fe9ce 100644 --- a/src/zm_monitor.h +++ b/src/zm_monitor.h @@ -65,18 +65,6 @@ public: typedef enum { ACTIVE, SUSPENDED, RESUMING } ActivityState; -protected: - static bool initialised; - static bool record_event_stats; - static bool record_diag_images; - static bool opt_adaptive_skip; - static bool create_analysis_images; - static bool blend_alarmed_images; - static bool timestamp_on_capture; - static int bulk_frame_interval; - static bool opt_control; - static const char *dir_events; - protected: // These are read from the DB and thereafter remain unchanged int id; @@ -168,22 +156,6 @@ protected: Camera *camera; -protected: - static void Initialise() - { - initialised = true; - - record_event_stats = (bool)config.Item( ZM_RECORD_EVENT_STATS ); - record_diag_images = (bool)config.Item( ZM_RECORD_DIAG_IMAGES ); - opt_adaptive_skip = (bool)config.Item( ZM_OPT_ADAPTIVE_SKIP ); - create_analysis_images = (bool)config.Item( ZM_CREATE_ANALYSIS_IMAGES ); - blend_alarmed_images = (bool)config.Item( ZM_BLEND_ALARMED_IMAGES ); - timestamp_on_capture = (bool)config.Item( ZM_TIMESTAMP_ON_CAPTURE ); - bulk_frame_interval = (int)config.Item( ZM_BULK_FRAME_INTERVAL ); - opt_control = (bool)config.Item( ZM_OPT_CONTROL ); - dir_events = (const char *)config.Item( ZM_DIR_EVENTS ); - } - public: Monitor( int p_id, char *p_name, int p_function, int p_device, int p_channel, int p_format, int p_width, int p_height, int p_palette, int p_orientation, int p_brightness, int p_contrast, int p_hue, int p_colour, char *p_event_prefix, char *p_label_format, const Coord &p_label_coord, int p_image_buffer_count, int p_warmup_count, int p_pre_event_count, int p_post_event_count, int p_alarm_frame_count, int p_section_length, int p_frame_skip, int p_capture_delay, int p_fps_report_interval, int p_ref_blend_perc, bool p_track_motion, Purpose p_purpose=QUERY, int p_n_zones=0, Zone *p_zones[]=0 ); Monitor( int p_id, char *p_name, int p_function, const char *p_host, const char *p_port, const char *p_path, int p_width, int p_height, int p_palette, int p_orientation, int p_brightness, int p_contrast, int p_hue, int p_colour, char *p_event_prefix, char *p_label_format, const Coord &p_label_coord, int p_image_buffer_count, int p_warmup_count, int p_pre_event_count, int p_post_event_count, int p_alarm_frame_count, int p_section_length, int p_frame_skip, int p_capture_delay, int p_fps_report_interval, int p_ref_blend_perc, bool p_track_motion, Purpose p_purpose=QUERY, int p_n_zones=0, Zone *p_zones[]=0 ); @@ -283,7 +255,7 @@ public: } gettimeofday( image_buffer[index].timestamp, &dummy_tz ); - if ( timestamp_on_capture ) + if ( config.timestamp_on_capture ) { TimestampImage( &image, image_buffer[index].timestamp->tv_sec ); } diff --git a/src/zm_remote_camera.cpp b/src/zm_remote_camera.cpp index bde6f0c8f..7e6364934 100644 --- a/src/zm_remote_camera.cpp +++ b/src/zm_remote_camera.cpp @@ -38,8 +38,6 @@ #include "zm.h" #include "zm_remote_camera.h" -bool RemoteCamera::netcam_regexps = false; - RemoteCamera::RemoteCamera( const char *p_host, const char *p_port, const char *p_path, int p_width, int p_height, int p_palette, int p_brightness, int p_contrast, int p_hue, int p_colour, bool p_capture ) : Camera( REMOTE, p_width, p_height, p_palette, p_brightness, p_contrast, p_hue, p_colour, p_capture ), host( p_host ), port( p_port ), path( p_path ) { auth = 0; @@ -67,8 +65,6 @@ RemoteCamera::~RemoteCamera() void RemoteCamera::Initialise() { - netcam_regexps = (bool)config.Item( ZM_NETCAM_REGEXPS ); - if( !host ) { Error(( "No host specified for remote get" )); @@ -112,8 +108,8 @@ void RemoteCamera::Initialise() if ( !request[0] ) { - snprintf( request, sizeof(request), "GET %s HTTP/%s\n", path, (const char *)config.Item( ZM_HTTP_VERSION ) ); - snprintf( &(request[strlen(request)]), sizeof(request)-strlen(request), "User-Agent: %s/%s\n", (const char *)config.Item( ZM_HTTP_UA ), ZM_VERSION ); + snprintf( request, sizeof(request), "GET %s HTTP/%s\n", path, config.http_version ); + snprintf( &(request[strlen(request)]), sizeof(request)-strlen(request), "User-Agent: %s/%s\n", config.http_ua, ZM_VERSION ); snprintf( &(request[strlen(request)]), sizeof(request)-strlen(request), "Host: %s\n", host ); snprintf( &(request[strlen(request)]), sizeof(request)-strlen(request), "Connection: Keep-Alive\n" ); if ( auth ) @@ -125,8 +121,8 @@ void RemoteCamera::Initialise() } if ( !timeout.tv_sec ) { - timeout.tv_sec = (int)config.Item( ZM_HTTP_TIMEOUT )/1000; - timeout.tv_usec = (int)config.Item( ZM_HTTP_TIMEOUT )%1000; + timeout.tv_sec = config.http_timeout/1000; + timeout.tv_usec = config.http_timeout%1000; } int max_size = width*height*colours; @@ -258,7 +254,7 @@ int RemoteCamera::ReadData( Buffer &buffer, int bytes_expected ) int RemoteCamera::GetResponse() { #if HAVE_LIBPCRE - if ( netcam_regexps ) + if ( config.netcam_regexps ) { const char *header = 0; int header_len = 0; diff --git a/src/zm_user.cpp b/src/zm_user.cpp index 99cec81f0..24635a958 100644 --- a/src/zm_user.cpp +++ b/src/zm_user.cpp @@ -188,7 +188,7 @@ User *zmLoadAuthUser( const char *auth, bool use_remote_addr ) struct tm *now_tm = localtime( &now ); snprintf( auth_key, sizeof(auth_key), "%s%s%s%s%d%d%d%d", - (const char *)config.Item( ZM_AUTH_SECRET ), + config.auth_secret, user, pass, remote_addr, diff --git a/src/zm_zone.cpp b/src/zm_zone.cpp index 515f751ed..3b7f910e3 100644 --- a/src/zm_zone.cpp +++ b/src/zm_zone.cpp @@ -23,15 +23,8 @@ #include "zm_image.h" #include "zm_monitor.h" -bool Zone::initialised = false; -bool Zone::record_diag_images; -bool Zone::create_analysis_images; - void Zone::Setup( Monitor *p_monitor, int p_id, const char *p_label, ZoneType p_type, const Box &p_limits, const Rgb p_alarm_rgb, CheckMethod p_check_method, int p_min_pixel_threshold, int p_max_pixel_threshold, int p_min_alarm_pixels, int p_max_alarm_pixels, const Coord &p_filter_box, int p_min_filter_pixels, int p_max_filter_pixels, int p_min_blob_pixels, int p_max_blob_pixels, int p_min_blobs, int p_max_blobs ) { - if ( !initialised ) - Initialise(); - monitor = p_monitor; id = p_id; @@ -123,12 +116,12 @@ bool Zone::CheckAlarms( const Image *delta_image ) } } } - if ( record_diag_images ) + if ( config.record_diag_images ) { static char diag_path[PATH_MAX] = ""; if ( !diag_path[0] ) { - snprintf( diag_path, sizeof(diag_path), "%s/%s/diag-%d-%d.jpg", (const char *)config.Item( ZM_DIR_EVENTS ), monitor->Name(), id, 1 ); + snprintf( diag_path, sizeof(diag_path), "%s/%s/diag-%d-%d.jpg", config.dir_events, monitor->Name(), id, 1 ); } diff_image->WriteJpeg( diag_path ); } @@ -199,12 +192,12 @@ bool Zone::CheckAlarms( const Image *delta_image ) { alarm_filter_pixels = alarm_pixels; } - if ( record_diag_images ) + if ( config.record_diag_images ) { static char diag_path[PATH_MAX] = ""; if ( !diag_path[0] ) { - snprintf( diag_path, sizeof(diag_path), "%s/%d/diag-%d-%d.jpg", (const char *)config.Item( ZM_DIR_EVENTS ), monitor->Id(), id, 2 ); + snprintf( diag_path, sizeof(diag_path), "%s/%d/diag-%d-%d.jpg", config.dir_events, monitor->Id(), id, 2 ); } diff_image->WriteJpeg( diag_path ); } @@ -347,12 +340,12 @@ bool Zone::CheckAlarms( const Image *delta_image ) } } } - if ( record_diag_images ) + if ( config.record_diag_images ) { static char diag_path[PATH_MAX] = ""; if ( !diag_path[0] ) { - snprintf( diag_path, sizeof(diag_path), "%s/%d/diag-%d-%d.jpg", (const char *)config.Item( ZM_DIR_EVENTS ), monitor->Id(), id, 3 ); + snprintf( diag_path, sizeof(diag_path), "%s/%d/diag-%d-%d.jpg", config.dir_events, monitor->Id(), id, 3 ); } diff_image->WriteJpeg( diag_path ); } @@ -398,12 +391,12 @@ bool Zone::CheckAlarms( const Image *delta_image ) } } } - if ( record_diag_images ) + if ( config.record_diag_images ) { static char diag_path[PATH_MAX] = ""; if ( !diag_path[0] ) { - snprintf( diag_path, sizeof(diag_path), "%s/%d/diag-%d-%d.jpg", (const char *)config.Item( ZM_DIR_EVENTS ), monitor->Id(), id, 4 ); + snprintf( diag_path, sizeof(diag_path), "%s/%d/diag-%d-%d.jpg", config.dir_events, monitor->Id(), id, 4 ); } diff_image->WriteJpeg( diag_path ); } @@ -483,7 +476,7 @@ bool Zone::CheckAlarms( const Image *delta_image ) alarm_centre = alarm_box.Centre(); } - if ( (type < PRECLUSIVE) && check_method >= BLOBS && create_analysis_images ) + if ( (type < PRECLUSIVE) && check_method >= BLOBS && config.create_analysis_images ) { image = diff_image->HighlightEdges( alarm_rgb, &limits ); // Only need to delete this when 'image' becomes detached and points somewhere else diff --git a/src/zm_zone.h b/src/zm_zone.h index 5ab31ee5f..bd31272f7 100644 --- a/src/zm_zone.h +++ b/src/zm_zone.h @@ -38,11 +38,6 @@ public: typedef enum { ACTIVE=1, INCLUSIVE, EXCLUSIVE, PRECLUSIVE, INACTIVE } ZoneType; typedef enum { ALARMED_PIXELS=1, FILTERED_PIXELS, BLOBS } CheckMethod; -protected: - static bool initialised; - static bool record_diag_images; - static bool create_analysis_images; - protected: // Inputs Monitor *monitor; @@ -83,13 +78,6 @@ protected: Image *image; protected: - static void Initialise() - { - initialised = true; - record_diag_images = (bool)config.Item( ZM_RECORD_DIAG_IMAGES ); - create_analysis_images = (bool)config.Item( ZM_CREATE_ANALYSIS_IMAGES ); - } - void Setup( Monitor *p_monitor, int p_id, const char *p_label, ZoneType p_type, const Box &p_limits, const Rgb p_alarm_rgb, CheckMethod p_check_method, int p_min_pixel_threshold, int p_max_pixel_threshold, int p_min_alarm_pixels, int p_max_alarm_pixels, const Coord &p_filter_box, int p_min_filter_pixels, int p_max_filter_pixels, int p_min_blob_pixels, int p_max_blob_pixels, int p_min_blobs, int p_max_blobs ); public: diff --git a/src/zma.cpp b/src/zma.cpp index bced04dcb..0722490be 100644 --- a/src/zma.cpp +++ b/src/zma.cpp @@ -131,7 +131,7 @@ int main( int argc, char *argv[] ) { Info(( "Warming up" )); - if ( (bool)config.Item( ZM_OPT_FRAME_SERVER ) ) + if ( config.opt_frame_server ) { Event::OpenFrameSocket( monitor->Id() ); } diff --git a/src/zmc.cpp b/src/zmc.cpp index d05ca31db..8a3269d2a 100644 --- a/src/zmc.cpp +++ b/src/zmc.cpp @@ -198,8 +198,6 @@ int main( int argc, char *argv[] ) capture_delays[i] = monitors[i]->GetCaptureDelay(); } - bool no_max_fps = (bool)config.Item( ZM_NO_MAX_FPS_ON_ALARM ); - struct timeval now; struct DeltaTimeval delta_time; while( !zmc_terminate ) @@ -209,7 +207,7 @@ int main( int argc, char *argv[] ) for ( int i = 0; i < n_monitors; i++ ) { long min_delay = MAXINT; - if ( no_max_fps && (monitors[i]->GetState() == Monitor::ALARM) ) + if ( config.no_max_fps_on_alarm && (monitors[i]->GetState() == Monitor::ALARM) ) { next_delays[i] = 0; } diff --git a/src/zmf.cpp b/src/zmf.cpp index 452d9d73c..71e86e778 100644 --- a/src/zmf.cpp +++ b/src/zmf.cpp @@ -80,7 +80,7 @@ int OpenSocket( int monitor_id ) } char sock_path[PATH_MAX] = ""; - snprintf( sock_path, sizeof(sock_path), "%s/zmf-%d.sock", (const char *)config.Item( ZM_PATH_SOCKS ), monitor_id ); + snprintf( sock_path, sizeof(sock_path), "%s/zmf-%d.sock", config.path_socks, monitor_id ); if ( unlink( sock_path ) < 0 ) { Warning(( "Can't unlink '%s': %s", sock_path, strerror(errno) )); @@ -202,8 +202,8 @@ int main( int argc, char *argv[] ) char capt_path[PATH_MAX]; char anal_path[PATH_MAX]; - snprintf( capt_path, sizeof(capt_path), "%s/%d/%%d/%%0%dd-capture.jpg", (const char *)config.Item( ZM_DIR_EVENTS ), monitor->Id(), (int)config.Item( ZM_EVENT_IMAGE_DIGITS ) ); - snprintf( anal_path, sizeof(anal_path), "%s/%d/%%d/%%0%dd-analyse.jpg", (const char *)config.Item( ZM_DIR_EVENTS ), monitor->Id(), (int)config.Item( ZM_EVENT_IMAGE_DIGITS ) ); + snprintf( capt_path, sizeof(capt_path), "%s/%d/%%d/%%0%dd-capture.jpg", config.dir_events, monitor->Id(), config.event_image_digits ); + snprintf( anal_path, sizeof(anal_path), "%s/%d/%%d/%%0%dd-analyse.jpg", config.dir_events, monitor->Id(), config.event_image_digits ); sigset_t block_set; sigemptyset( &block_set ); diff --git a/src/zmfix.cpp b/src/zmfix.cpp index 581ef9faa..ed5704fd2 100644 --- a/src/zmfix.cpp +++ b/src/zmfix.cpp @@ -137,13 +137,11 @@ int main( int argc, char *argv[] ) // Yadda yadda mysql_free_result( result ); - if ( (bool)config.Item( ZM_OPT_X10 ) ) + if ( config.opt_x10 ) { - const char *x10_port = (const char *)config.Item( ZM_X10_DEVICE ); - - if ( x10_port ) + if ( config.x10_device ) { - fixDevice( x10_port ); + fixDevice( config.x10_device ); } } } diff --git a/src/zms.cpp b/src/zms.cpp index e5ed77bb4..243e6fff3 100644 --- a/src/zms.cpp +++ b/src/zms.cpp @@ -114,7 +114,7 @@ int main( int argc, const char *argv[] ) bitrate = atoi( value ); else if ( !strcmp( name, "ttl" ) ) ttl = atoi(value); - else if ( (bool)config.Item( ZM_OPT_USE_AUTH ) ) + else if ( config.opt_use_auth ) { if ( !strcmp( name, "user" ) ) { @@ -132,7 +132,7 @@ int main( int argc, const char *argv[] ) } } - if ( (bool)config.Item( ZM_OPT_USE_AUTH ) ) + if ( config.opt_use_auth ) { User *user = 0; if ( *username && *password ) diff --git a/src/zmu.cpp b/src/zmu.cpp index 37f6a66fd..9d5421e46 100644 --- a/src/zmu.cpp +++ b/src/zmu.cpp @@ -319,7 +319,7 @@ int main( int argc, char *argv[] ) zmLoadConfig(); - if ( (bool)config.Item( ZM_OPT_USE_AUTH ) ) + if ( config.opt_use_auth ) { if ( !(username && password) && !auth ) { @@ -466,7 +466,7 @@ int main( int argc, char *argv[] ) { if ( verbose ) printf( "Forcing alarm on\n" ); - monitor->ForceAlarmOn( (int)config.Item( ZM_FORCED_ALARM_SCORE ), "Forced Web" ); + monitor->ForceAlarmOn( config.forced_alarm_score, "Forced Web" ); } if ( function & NOALARM ) { diff --git a/zmconfig.pl.in b/zmconfig.pl.in index 08e60a3be..3cb2e9e43 100755 --- a/zmconfig.pl.in +++ b/zmconfig.pl.in @@ -1706,13 +1706,67 @@ if ( $reprocess ) print( CFG_HDR_FILE "// The file is autogenerated by zmconfig.pl\n" ); print( CFG_HDR_FILE "// Do not edit this file as any changes will be overwritten\n\n" ); my $last_id = 0; + my $define_list = ""; + my $declare_list = ""; + my $assign_list = ""; foreach my $option ( @options ) { next if ( !defined($option->{id}) ); - printf( CFG_HDR_FILE "#define $option->{name} $option->{id}\n" ); + + my $opt_id = $option->{id}; + my $opt_name = $option->{name}; + my $opt_type = $option->{type}; + my $var_name = substr( lc($opt_name), 3 ); + + $define_list .= sprintf( "#define $opt_name $opt_id\n" ); + + $declare_list .= sprintf( "\t" ); + if ( $opt_type == $types{boolean} ) + { + $declare_list .= sprintf( "bool " ); + } + elsif ( $opt_type == $types{integer} || $opt_type == $types{hexadecimal} ) + { + $declare_list .= sprintf( "int " ); + } + elsif ( $opt_type == $types{decimal} ) + { + $declare_list .= sprintf( "double " ); + } + else + { + $declare_list .= sprintf( "const char *" ); + } + $declare_list .= sprintf( $var_name.";\\\n" ); + + $assign_list .= sprintf( "\t" ); + $assign_list .= sprintf( $var_name." = " ); + if ( $opt_type == $types{boolean} ) + { + $assign_list .= sprintf( "(bool)" ); + } + elsif ( $opt_type == $types{integer} || $opt_type == $types{hexadecimal} ) + { + $assign_list .= sprintf( "(int)" ); + } + elsif ( $opt_type == $types{decimal} ) + { + $assign_list .= sprintf( "(double) " ); + } + else + { + $assign_list .= sprintf( "(const char *)" ); + } + $assign_list .= sprintf( "config.Item( ".$opt_name." );\\\n" ); + $last_id = $option->{id}; } - printf( CFG_HDR_FILE "#define ZM_MAX_CFG_ID $last_id\n" ); + printf( CFG_HDR_FILE $define_list."\n\n" ); + printf( CFG_HDR_FILE "#define ZM_MAX_CFG_ID $last_id\n\n" ); + printf( CFG_HDR_FILE "#define ZM_CFG_DECLARE_LIST \\\n" ); + printf( CFG_HDR_FILE $declare_list."\n\n" ); + printf( CFG_HDR_FILE "#define ZM_CFG_ASSIGN_LIST \\\n" ); + printf( CFG_HDR_FILE $assign_list."\n\n" ); close( CFG_HDR_FILE ); my @config_files = qw( zm.conf src/zm_config.h web/zm_config.php scripts/zmdc.pl scripts/zmwatch.pl scripts/zmaudit.pl scripts/zmfilter.pl scripts/zmtrigger.pl scripts/zmx10.pl scripts/zmpkg.pl scripts/zmupdate.pl scripts/zmvideo.pl scripts/zmcontrol-pelco-d.pl scripts/zmcontrol-visca.pl scripts/zmcontrol-kx-hcm10.pl scripts/zmtrack.pl scripts/zm db/zmschema.sql );