/****************************************************************************
Shanghai Pallas Digital Tech. Ltd, (C) 2002 , All rights are reserved
File : pelco-p.c
实现PELCO-P控制协议
****************************************************************************/
#include <vxworks.h>
#include "base.h"
#if ( HARDWARE_VERSION == 2 )
#include "ads852.h"
#include "m852reg.h"
#include "m852mask.h"
#else
#include "ads8260.h"
#include "m8260reg.h"
#include "m8260mask.h"
#endif
#include "domedrv.h"
U8 pelco_p_spd[] = { 0x02 , 0x20 , 0x38 } ;
typedef struct
{
U8 start ;
U8 addr ;
U16 command ;
U8 data1 ;
U8 data2 ;
U8 end ;
U8 checksum ;
} PELCO_P_FRAME ;
U8 pelco_p_sum( U8 * data )
{
int i ;
U8 sum;
sum = 0 ;
// old Pelco-p checksum from addr to data2
// new Pelco-p checksum from start to end .
//for( i = 1 ; i < 6 ; i++ )
for ( i = 0 ; i < 7 ; i++ )
sum = sum + data[i] ;
return sum ;
}
int pelco_p_init ( int addr , int data )
{
return 1 ;
}
int pelco_p_reset( int addr , int data )
{
/*
PELCO_P_FRAME cmd ;
cmd.start = 0xA0 ;
cmd.addr = ( U8 ) addr ;
cmd.command = 0x0007 ;
cmd.data1 = 0 ;
cmd.data2 = 0x22 ;
cmd.end = 0xAF ;
cmd.checksum= pelco_p_sum( ( U8 *)&cmd ) ;
dome_send_data( (U8*)&cmd , sizeof( PELCO_P_FRAME )) ;
*/
return 1 ;
}
int pelco_p_stop ( int addr , int data )
{
PELCO_P_FRAME cmd ;
cmd.start = 0xA0 ;
cmd.addr = ( U8 ) addr ;
cmd.command = 0 ;
cmd.data1 = 0 ;
cmd.data2 = 0 ;
cmd.end = 0xAF ;
cmd.checksum = pelco_p_sum( ( U8 *)&cmd ) ;
dome_send_data( (U8*)&cmd , sizeof( PELCO_P_FRAME )) ;
return 1 ;
}
int pelco_p_zoom ( int addr , int data )
{
PELCO_P_FRAME cmd ;
cmd.start = 0xA0 ;
cmd.addr = ( U8 ) addr ;
if( data > 0 )
cmd.command = 0x0020 ; /*放大*/
else
cmd.command = 0x0040 ; /*缩小*/
cmd.data1 = 0 ;
cmd.data2 = 0 ;
cmd.end = 0xAF ;
cmd.checksum = pelco_p_sum( ( U8 *)&cmd ) ;
dome_send_data( (U8*)&cmd , sizeof( PELCO_P_FRAME )) ;
return 1 ;
}
int pelco_p_focus( int addr , int data )
{
PELCO_P_FRAME cmd ;
cmd.start = 0xA0 ;
cmd.addr = ( U8 ) addr ;
if( data > 0 )
cmd.command = 0x0100 ; /*拉远*/
else
cmd.command = 0x0200 ; /*拉近*/
cmd.data1 = 0 ;
cmd.data2 = 0 ;
cmd.end = 0xAF ;
cmd.checksum = pelco_p_sum( ( U8 *)&cmd ) ;
dome_send_data( (U8*)&cmd , sizeof( PELCO_P_FRAME )) ;
return 1 ;
}
int pelco_p_vertical( int addr , int data )
{
PELCO_P_FRAME cmd ;
cmd.start = 0xA0 ;
cmd.addr = ( U8 ) addr ;
if( data > 0 )
cmd.command = 0x0008 ; /*上*/
else
cmd.command = 0x0010 ; /*下*/
cmd.data1 = 0 ;
cmd.data2 = pelco_p_spd[dome_speed] ; /*速度 0 ~ 3F*/
cmd.end = 0xAF ;
cmd.checksum = pelco_p_sum( ( U8 *)&cmd ) ;
dome_send_data( (U8*)&cmd , sizeof( PELCO_P_FRAME )) ;
return 1 ;
}
int pelco_p_horizon ( int addr , int data )
{
PELCO_P_FRAME cmd ;
cmd.start = 0xA0 ;
cmd.addr = ( U8 ) addr ;
if( data > 0 )
cmd.command = 0x0004 ; /*左*/
else
cmd.command = 0x0002 ; /*右*/
cmd.data1 = pelco_p_spd[dome_speed] ;
cmd.data2 = 0 ; /*速度 0 ~ 3F*/
cmd.end = 0xAF ;
cmd.checksum = pelco_p_sum( ( U8 *)&cmd ) ;
dome_send_data( (U8*)&cmd , sizeof( PELCO_P_FRAME )) ;
return 1 ;
}
int pelco_p_iris ( int addr , int data )
{
PELCO_P_FRAME cmd ;
cmd.start = 0xA0 ;
cmd.addr = ( U8 ) addr ;
if( data > 0 )
cmd.command = 0x0400 ; /*光圈增大*/
else
cmd.command = 0x0800 ; /*光圈减少*/
cmd.data1 = 0 ;
cmd.data2 = 0 ; /*速度 0 ~ 3F*/
cmd.end = 0xAF ;
cmd.checksum = pelco_p_sum( ( U8 *)&cmd ) ;
dome_send_data( (U8*)&cmd , sizeof( PELCO_P_FRAME )) ;
//#define PELCO_P_DONGBEI
#ifdef PELCO_P_DONGBEI
pelco_p_stop( addr , data ) ;
#endif
return 1 ;
}
int pelco_p_aux ( int addr , int data )
{
PELCO_P_FRAME cmd ;
cmd.start = 0xA0 ;
cmd.addr = ( U8 ) addr ;
cmd.command = ( data>4 ? 0x000b : 0x0009 ) ;
cmd.data1 = 0 ;
cmd.data2 = 1+data%5 ;
cmd.end = 0xAF ;
cmd.checksum = pelco_p_sum( ( U8 *)&cmd ) ;
dome_send_data( (U8*)&cmd , sizeof( PELCO_P_FRAME )) ;
return 1 ;
}
int pelco_p_autopan ( int addr , int data )
{
PELCO_P_FRAME cmd ;
cmd.start = 0xA0 ;
cmd.addr = ( U8 ) addr ;
cmd.command = 0x0007 ;
cmd.data1 = 0 ;
cmd.data2 = (data>0 ? 0x63 : 0x60 ) ;
cmd.end = 0xAF ;
cmd.checksum = pelco_p_sum( ( U8 *)&cmd ) ;
dome_send_data( (U8*)&cmd , sizeof( PELCO_P_FRAME )) ;
return 1 ;
}
int pelco_p_save_preset ( int addr , int data )
{
PELCO_P_FRAME cmd ;
cmd.start = 0xA0 ;
cmd.addr = ( U8 ) addr ;
cmd.command = 0x0003 ;
cmd.data1 = 0 ;
cmd.data2 = data ;
cmd.end = 0xAF ;
cmd.checksum = pelco_p_sum( ( U8 *)&cmd ) ;
dome_send_data( (U8*)&cmd , sizeof( PELCO_P_FRAME )) ;
return 1 ;
}
int pelco_p_call_preset ( int addr , int data )
{
PELCO_P_FRAME cmd ;
cmd.start = 0xA0 ;
cmd.addr = ( U8 ) addr ;
cmd.command = 0x0007 ;
cmd.data1 = 0 ;
cmd.data2 = data ;
cmd.end = 0xAF ;
cmd.checksum = pelco_p_sum( ( U8 *)&cmd ) ;
dome_send_data( (U8*)&cmd , sizeof( PELCO_P_FRAME )) ;
return 1 ;
}
int pelco_p_install( void )
{
DOME_DRV drv ;
drv.driver_type = UI_PROTOCOL_P ;
drv.driver_init = pelco_p_init ;
drv.driver_reset= pelco_p_reset ;
drv.driver_zoom = pelco_p_zoom ;
drv.driver_focus= pelco_p_focus ;
drv.driver_vertical= pelco_p_vertical ;
drv.driver_horizon = pelco_p_horizon ;
drv.driver_iris = pelco_p_iris ;
drv.driver_stop = pelco_p_stop ;
drv.driver_autopan = pelco_p_autopan ;
drv.driver_aux = pelco_p_aux ;
drv.driver_save_preset = pelco_p_save_preset ;
drv.driver_call_preset = pelco_p_call_preset ;
return dome_driver_install ( &drv ) ;
}