File Coverage

blib/lib/Rinchi/CIGIPP.pm
Criterion Covered Total %
statement 182 480 37.9
branch 0 266 0.0
condition 0 23 0.0
subroutine 61 70 87.1
pod 9 9 100.0
total 252 848 29.7


line stmt bran cond sub pod time code
1             package Rinchi::CIGIPP;
2              
3 1     1   14687 use 5.006;
  1         6  
  1         46  
4 1     1   6 use strict;
  1         1  
  1         38  
5 1     1   6 use warnings;
  1         7  
  1         33  
6 1     1   6 use Carp;
  1         1  
  1         104  
7 1     1   1060 use IO::Select;
  1         2024  
  1         46  
8 1     1   897 use IO::Socket;
  1         121710  
  1         6  
9              
10 1     1   2820 use Rinchi::CIGIPP::IGControl;
  1         15  
  1         57  
11 1     1   2011 use Rinchi::CIGIPP::EntityControl;
  1         4  
  1         78  
12 1     1   3348 use Rinchi::CIGIPP::ConformalClampedEntityControl;
  1         4  
  1         57  
13 1     1   5303 use Rinchi::CIGIPP::ComponentControl;
  1         4  
  1         945  
14 1     1   2426 use Rinchi::CIGIPP::ShortComponentControl;
  1         4  
  1         60  
15 1     1   751 use Rinchi::CIGIPP::ArticulatedPartControl;
  1         3  
  1         70  
16 1     1   2353 use Rinchi::CIGIPP::ShortArticulatedPartControl;
  1         4  
  1         84  
17 1     1   2372 use Rinchi::CIGIPP::RateControl;
  1         4  
  1         4596  
18 1     1   2222 use Rinchi::CIGIPP::CelestialSphereControl;
  1         6  
  1         73  
19 1     1   914 use Rinchi::CIGIPP::AtmosphereControl;
  1         5  
  1         64  
20 1     1   2004 use Rinchi::CIGIPP::EnvironmentalRegionControl;
  1         4  
  1         63  
21 1     1   2821 use Rinchi::CIGIPP::WeatherControl;
  1         5  
  1         77  
22 1     1   2016 use Rinchi::CIGIPP::MaritimeSurfaceConditionsControl;
  1         4  
  1         739  
23 1     1   1985 use Rinchi::CIGIPP::WaveControl;
  1         4  
  1         60  
24 1     1   1943 use Rinchi::CIGIPP::TerrestrialSurfaceConditionsControl;
  1         4  
  1         66  
25 1     1   2148 use Rinchi::CIGIPP::ViewControl;
  1         4  
  1         63  
26 1     1   2094 use Rinchi::CIGIPP::SensorControl;
  1         5  
  1         70  
27 1     1   1014 use Rinchi::CIGIPP::MotionTrackerControl;
  1         4  
  1         61  
28 1     1   1910 use Rinchi::CIGIPP::EarthReferenceModelDefinition;
  1         3  
  1         58  
29 1     1   711 use Rinchi::CIGIPP::TrajectoryDefinition;
  1         4  
  1         121  
30 1     1   1006 use Rinchi::CIGIPP::ViewDefinition;
  1         5  
  1         102  
31 1     1   930 use Rinchi::CIGIPP::CollisionDetectionSegmentDefinition;
  1         4  
  1         157  
32 1     1   772 use Rinchi::CIGIPP::CollisionDetectionVolumeDefinition;
  1         88  
  1         62  
33 1     1   802 use Rinchi::CIGIPP::HAT_HOTRequest;
  1         4  
  1         51  
34 1     1   893 use Rinchi::CIGIPP::LineOfSightSegmentRequest;
  1         4  
  1         73  
35 1     1   938 use Rinchi::CIGIPP::LineOfSightVectorRequest;
  1         3  
  1         66  
36 1     1   929 use Rinchi::CIGIPP::PositionRequest;
  1         4  
  1         57  
37 1     1   831 use Rinchi::CIGIPP::EnvironmentalConditionsRequest;
  1         3  
  1         58  
38 1     1   955 use Rinchi::CIGIPP::SymbolSurfaceDefinition;
  1         3  
  1         59  
39 1     1   987 use Rinchi::CIGIPP::SymbolTextDefinition;
  1         5  
  1         201  
40 1     1   900 use Rinchi::CIGIPP::SymbolCircleDefinition;
  1         4  
  1         55  
41             #use Rinchi::CIGIPP::SymbolCircle;
42 1     1   876 use Rinchi::CIGIPP::SymbolLineDefinition;
  1         3  
  1         64  
43             #use Rinchi::CIGIPP::SymbolLineVertex;
44 1     1   863 use Rinchi::CIGIPP::SymbolClone;
  1         3  
  1         52  
45 1     1   693 use Rinchi::CIGIPP::SymbolControl;
  1         4  
  1         61  
46 1     1   833 use Rinchi::CIGIPP::ShortSymbolControl;
  1         4  
  1         67  
47 1     1   913 use Rinchi::CIGIPP::StartOfFrame;
  1         3  
  1         50  
48 1     1   621 use Rinchi::CIGIPP::HAT_HOTResponse;
  1         3  
  1         50  
49 1     1   813 use Rinchi::CIGIPP::HAT_HOTExtendedResponse;
  1         4  
  1         177  
50 1     1   862 use Rinchi::CIGIPP::LineOfSightResponse;
  1         4  
  1         57  
51 1     1   856 use Rinchi::CIGIPP::LineOfSightExtendedResponse;
  1         4  
  1         66  
52 1     1   946 use Rinchi::CIGIPP::SensorResponse;
  1         4  
  1         51  
53 1     1   1182 use Rinchi::CIGIPP::SensorExtendedResponse;
  1         4  
  1         227  
54 1     1   1046 use Rinchi::CIGIPP::PositionResponse;
  1         4  
  1         56  
55 1     1   1489 use Rinchi::CIGIPP::WeatherConditionsResponse;
  1         3  
  1         48  
56 1     1   575 use Rinchi::CIGIPP::AerosolConcentrationResponse;
  1         4  
  1         58  
57 1     1   906 use Rinchi::CIGIPP::MaritimeSurfaceConditionsResponse;
  1         4  
  1         324  
58 1     1   587 use Rinchi::CIGIPP::TerrestrialSurfaceConditionsResponse;
  1         2  
  1         50  
59 1     1   1105 use Rinchi::CIGIPP::CollisionDetectionSegmentNotification;
  1         3  
  1         195  
60 1     1   811 use Rinchi::CIGIPP::CollisionDetectionVolumeNotification;
  1         3  
  1         53  
61 1     1   697 use Rinchi::CIGIPP::AnimationStopNotification;
  1         4  
  1         68  
62 1     1   1281 use Rinchi::CIGIPP::EventNotification;
  1         3  
  1         69  
63 1     1   947 use Rinchi::CIGIPP::ImageGeneratorMessage;
  1         3  
  1         7654  
64              
65             require Exporter;
66              
67             our @ISA = qw(Exporter);
68              
69             # Items to export into callers namespace by default. Note: do not export
70             # names by default without a very good reason. Use EXPORT_OK instead.
71             # Do not simply export all your public functions/methods/constants.
72              
73             # This allows declaration use Rinchi::CIGIPP ':all';
74             # If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
75             # will save memory.
76             our %EXPORT_TAGS = ( 'all' => [ qw(
77            
78             ) ] );
79              
80             our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
81              
82             our @EXPORT = qw(
83            
84             );
85              
86             our $VERSION = '0.02';
87              
88             our %Handler_Setters = (
89             StartOfMessage => \&SetStartOfMessageHandler,
90             EndOfMessage => \&SetEndOfMessageHandler,
91             IGControl => \&SetIGControlHandler,
92             EntityControl => \&SetEntityControlHandler,
93             ConformalClampedEntityControl => \&SetConformalClampedEntityControlHandler,
94             ComponentControl => \&SetComponentControlHandler,
95             ShortComponentControl => \&SetShortComponentControlHandler,
96             ArticulatedPartControl => \&SetArticulatedPartControlHandler,
97             ShortArticulatedPartControl => \&SetShortArticulatedPartControlHandler,
98             RateControl => \&SetRateControlHandler,
99             CelestialSphereControl => \&SetCelestialSphereControlHandler,
100             AtmosphereControl => \&SetAtmosphereControlHandler,
101             EnvironmentalRegionControl => \&SetEnvironmentalRegionControlHandler,
102             WeatherControl => \&SetWeatherControlHandler,
103             MaritimeSurfaceConditionsControl => \&SetMaritimeSurfaceConditionsControlHandler,
104             WaveControl => \&SetWaveControlHandler,
105             TerrestrialSurfaceConditionsControl => \&SetTerrestrialSurfaceConditionsControlHandler,
106             ViewControl => \&SetViewControlHandler,
107             SensorControl => \&SetSensorControlHandler,
108             MotionTrackerControl => \&SetMotionTrackerControlHandler,
109             EarthReferenceModelDefinition => \&SetEarthReferenceModelDefinitionHandler,
110             TrajectoryDefinition => \&SetTrajectoryDefinitionHandler,
111             ViewDefinition => \&SetViewDefinitionHandler,
112             CollisionDetectionSegmentDefinition => \&SetCollisionDetectionSegmentDefinitionHandler,
113             CollisionDetectionVolumeDefinition => \&SetCollisionDetectionVolumeDefinitionHandler,
114             HAT_HOTRequest => \&SetHAT_HOTRequestHandler,
115             LineOfSightSegmentRequest => \&SetLineOfSightSegmentRequestHandler,
116             LineOfSightVectorRequest => \&SetLineOfSightVectorRequestHandler,
117             PositionRequest => \&SetPositionRequestHandler,
118             EnvironmentalConditionsRequest => \&SetEnvironmentalConditionsRequestHandler,
119             SymbolSurfaceDefinition => \&SetSymbolSurfaceDefinitionHandler,
120             SymbolTextDefinition => \&SetSymbolTextDefinitionHandler,
121             SymbolCircleDefinition => \&SetSymbolCircleDefinitionHandler,
122             SymbolCircle => \&SetSymbolCircleHandler,
123             SymbolLineDefinition => \&SetSymbolLineDefinitionHandler,
124             SymbolLineVertex => \&SetSymbolLineVertexHandler,
125             SymbolClone => \&SetSymbolCloneHandler,
126             SymbolControl => \&SetSymbolControlHandler,
127             ShortSymbolControl => \&SetShortSymbolControlHandler,
128             StartOfFrame => \&SetStartOfFrameHandler,
129             HAT_HOTResponse => \&SetHAT_HOTResponseHandler,
130             HAT_HOTExtendedResponse => \&SetHAT_HOTExtendedResponseHandler,
131             LineOfSightResponse => \&SetLineOfSightResponseHandler,
132             LineOfSightExtendedResponse => \&SetLineOfSightExtendedResponseHandler,
133             SensorResponse => \&SetSensorResponseHandler,
134             SensorExtendedResponse => \&SetSensorExtendedResponseHandler,
135             PositionResponse => \&SetPositionResponseHandler,
136             WeatherConditionsResponse => \&SetWeatherConditionsResponseHandler,
137             AerosolConcentrationResponse => \&SetAerosolConcentrationResponseHandler,
138             MaritimeSurfaceConditionsResponse => \&SetMaritimeSurfaceConditionsResponseHandler,
139             TerrestrialSurfaceConditionsResponse => \&SetTerrestrialSurfaceConditionsResponseHandler,
140             CollisionDetectionSegmentNotification => \&SetCollisionDetectionSegmentNotificationHandler,
141             CollisionDetectionVolumeNotification => \&SetCollisionDetectionVolumeNotificationHandler,
142             AnimationStopNotification => \&SetAnimationStopNotificationHandler,
143             EventNotification => \&SetEventNotificationHandler,
144             ImageGeneratorMessage => \&SetImageGeneratorMessageHandler,
145             );
146              
147             our @opcode_list = (
148             [1, 'IGControl',],
149             [2, 'EntityControl',],
150             [3, 'ConformalClampedEntityControl',],
151             [4, 'ComponentControl',],
152             [5, 'ShortComponentControl',],
153             [6, 'ArticulatedPartControl',],
154             [7, 'ShortArticulatedPartControl',],
155             [8, 'RateControl',],
156             [9, 'CelestialSphereControl',],
157             [10, 'AtmosphereControl',],
158             [11, 'EnvironmentalRegionControl',],
159             [12, 'WeatherControl',],
160             [13, 'MaritimeSurfaceConditionsControl',],
161             [14, 'WaveControl',],
162             [15, 'TerrestrialSurfaceConditionsControl',],
163             [16, 'ViewControl',],
164             [17, 'SensorControl',],
165             [18, 'MotionTrackerControl',],
166             [19, 'EarthReferenceModelDefinition',],
167             [20, 'TrajectoryDefinition',],
168             [21, 'ViewDefinition',],
169             [22, 'CollisionDetectionSegmentDefinition',],
170             [23, 'CollisionDetectionVolumeDefinition',],
171             [24, 'HAT_HOTRequest',],
172             [25, 'LineOfSightSegmentRequest',],
173             [26, 'LineOfSightVectorRequest',],
174             [27, 'PositionRequest',],
175             [28, 'EnvironmentalConditionsRequest',],
176             [29, 'SymbolSurfaceDefinition',],
177             [30, 'SymbolTextDefinition',],
178             [31, 'SymbolCircleDefinition',],
179             [32, 'SymbolLineDefinition',],
180             [33, 'SymbolClone',],
181             [34, 'SymbolControl',],
182             [35, 'ShortSymbolControl',],
183             [101, 'StartOfFrame',],
184             [102, 'HAT_HOTResponse',],
185             [103, 'HAT_HOTExtendedResponse',],
186             [104, 'LineOfSightResponse',],
187             [105, 'LineOfSightExtendedResponse',],
188             [106, 'SensorResponse',],
189             [107, 'SensorExtendedResponse',],
190             [108, 'PositionResponse',],
191             [109, 'WeatherConditionsResponse',],
192             [110, 'AerosolConcentrationResponse',],
193             [111, 'MaritimeSurfaceConditionsResponse',],
194             [112, 'TerrestrialSurfaceConditionsResponse',],
195             [113, 'CollisionDetectionSegmentNotification',],
196             [114, 'CollisionDetectionVolumeNotification',],
197             [115, 'AnimationStopNotification',],
198             [116, 'EventNotification',],
199             [117, 'ImageGeneratorMessage',],
200             );
201              
202             # Below is stub documentation for your module. You'd better edit it!
203              
204             =head1 NAME
205              
206             Rinchi::CIGIPP - Perl extension for the Common Image Generator Interface.
207              
208             =head1 SYNOPSIS
209              
210             use Rinchi::CIGIPP;
211             use Rinchi::CIGIPP::DefaultHandler;
212              
213             my $cigi = Rinchi::CIGIPP->new();
214             my $hdlr = Rinchi::CIGIPP::DefaultHandler->new();
215             my @hp = %{$hdlr->get_handlers()};
216             $cigi->setHandlers(@hp);
217              
218             my @message;
219              
220             my $ig_ctl = Rinchi::CIGIPP::IGControl->new();
221             push @message,$ig_ctl;
222              
223             my $ent_ctl = Rinchi::CIGIPP::EntityControl->new();
224             push @message,$ent_ctl;
225              
226             my $ccent_ctl = Rinchi::CIGIPP::ConformalClampedEntityControl->new();
227             push @message,$ccent_ctl;
228              
229             my $cmp_ctl = Rinchi::CIGIPP::ComponentControl->new();
230             push @message,$cmp_ctl;
231              
232             my $scmp_ctl = Rinchi::CIGIPP::ShortComponentControl->new();
233             push @message,$scmp_ctl;
234              
235             my $ap_ctl = Rinchi::CIGIPP::ArticulatedPartControl->new();
236             push @message,$ap_ctl;
237              
238             my $sap_ctl = Rinchi::CIGIPP::ShortArticulatedPartControl->new();
239             push @message,$sap_ctl;
240              
241             my $rate_ctl = Rinchi::CIGIPP::RateControl->new();
242             push @message,$rate_ctl;
243              
244             my $sky_ctl = Rinchi::CIGIPP::CelestialSphereControl->new();
245             push @message,$sky_ctl;
246              
247             my $atmos_ctl = Rinchi::CIGIPP::AtmosphereControl->new();
248             push @message,$atmos_ctl;
249              
250             my $env_ctl = Rinchi::CIGIPP::EnvironmentalRegionControl->new();
251             push @message,$env_ctl;
252              
253             my $wthr_ctl = Rinchi::CIGIPP::WeatherControl->new();
254             push @message,$wthr_ctl;
255              
256             my $msc_ctl = Rinchi::CIGIPP::MaritimeSurfaceConditionsControl->new();
257             push @message,$msc_ctl;
258              
259             my $wave_ctl = Rinchi::CIGIPP::WaveControl->new();
260             push @message,$wave_ctl;
261              
262             my $tsc_ctl = Rinchi::CIGIPP::TerrestrialSurfaceConditionsControl->new();
263             push @message,$tsc_ctl;
264              
265             my $view_ctl = Rinchi::CIGIPP::ViewControl->new();
266             push @message,$view_ctl;
267              
268             my $sensor_ctl = Rinchi::CIGIPP::SensorControl->new();
269             push @message,$sensor_ctl;
270              
271             my $mt_ctl = Rinchi::CIGIPP::MotionTrackerControl->new();
272             push @message,$mt_ctl;
273              
274             my $erm_def = Rinchi::CIGIPP::EarthReferenceModelDefinition->new();
275             push @message,$erm_def;
276              
277             my $traj_def = Rinchi::CIGIPP::TrajectoryDefinition->new();
278             push @message,$traj_def;
279              
280             my $view_def = Rinchi::CIGIPP::ViewDefinition->new();
281             push @message,$view_def;
282              
283             my $cds_def = Rinchi::CIGIPP::CollisionDetectionSegmentDefinition->new();
284             push @message,$cds_def;
285              
286             my $cdv_def = Rinchi::CIGIPP::CollisionDetectionVolumeDefinition->new();
287             push @message,$cdv_def;
288              
289             my $hgt_rqst = Rinchi::CIGIPP::HAT_HOTRequest->new();
290             push @message,$hgt_rqst;
291              
292             my $loss_rqst = Rinchi::CIGIPP::LineOfSightSegmentRequest->new();
293             push @message,$loss_rqst;
294              
295             my $losv_rqst = Rinchi::CIGIPP::LineOfSightVectorRequest->new();
296             push @message,$losv_rqst;
297              
298             my $pos_rqst = Rinchi::CIGIPP::PositionRequest->new();
299             push @message,$pos_rqst;
300              
301             my $ec_rqst = Rinchi::CIGIPP::EnvironmentalConditionsRequest->new();
302             push @message,$ec_rqst;
303              
304             my $sym_surf = Rinchi::CIGIPP::SymbolSurfaceDefinition->new();
305             push @message,$sym_surf;
306              
307             my $sym_text = Rinchi::CIGIPP::SymbolTextDefinition->new();
308             push @message,$sym_text;
309              
310             my $sym_circ = Rinchi::CIGIPP::SymbolCircleDefinition->new();
311             push @message,$sym_circ;
312              
313             my $circle0 = Rinchi::CIGIPP::SymbolCircle->new();
314             $sym_circ->circle(0, $circle0);
315              
316             my $circle1 = Rinchi::CIGIPP::SymbolCircle->new();
317             $sym_circ->circle(1, $circle1);
318              
319             my $sym_line = Rinchi::CIGIPP::SymbolLineDefinition->new();
320             push @message,$sym_line;
321              
322             my $vertex0 = Rinchi::CIGIPP::SymbolVertex->new();
323             $sym_line->vertex(0, $vertex0);
324              
325             my $vertex1 = Rinchi::CIGIPP::SymbolVertex->new();
326             $sym_line->vertex(1, $vertex1);
327              
328             my $vertex2 = Rinchi::CIGIPP::SymbolVertex->new();
329             $sym_line->vertex(2, $vertex2);
330              
331             my $vertex3 = Rinchi::CIGIPP::SymbolVertex->new();
332             $sym_line->vertex(3, $vertex3);
333              
334             my $sym_clone = Rinchi::CIGIPP::SymbolClone->new();
335             push @message,$sym_clone;
336              
337             my $sym_ctl = Rinchi::CIGIPP::SymbolControl->new();
338             push @message,$sym_ctl;
339              
340             my $ssym_ctl = Rinchi::CIGIPP::ShortSymbolControl->new();
341             push @message,$ssym_ctl;
342              
343             my $start_of_frame = Rinchi::CIGIPP::StartOfFrame->new();
344             push @message,$start_of_frame;
345              
346             my $hgt_resp = Rinchi::CIGIPP::HAT_HOTResponse->new();
347             push @message,$hgt_resp;
348              
349             my $hgt_xresp = Rinchi::CIGIPP::HAT_HOTExtendedResponse->new();
350             push @message,$hgt_xresp;
351              
352             my $los_resp = Rinchi::CIGIPP::LineOfSightResponse->new();
353             push @message,$los_resp;
354              
355             my $los_xresp = Rinchi::CIGIPP::LineOfSightExtendedResponse->new();
356             push @message,$los_xresp;
357              
358             my $sensor_resp = Rinchi::CIGIPP::SensorResponse->new();
359             push @message,$sensor_resp;
360              
361             my $sensor_xresp = Rinchi::CIGIPP::SensorExtendedResponse->new();
362             push @message,$sensor_xresp;
363              
364             my $pos_resp = Rinchi::CIGIPP::PositionResponse->new();
365             push @message,$pos_resp;
366              
367             my $wthr_resp = Rinchi::CIGIPP::WeatherConditionsResponse->new();
368             push @message,$wthr_resp;
369              
370             my $ac_resp = Rinchi::CIGIPP::AerosolConcentrationResponse->new();
371             push @message,$ac_resp;
372              
373             my $msc_resp = Rinchi::CIGIPP::MaritimeSurfaceConditionsResponse->new();
374             push @message,$msc_resp;
375              
376             my $tsc_resp = Rinchi::CIGIPP::TerrestrialSurfaceConditionsResponse->new();
377             push @message,$tsc_resp;
378              
379             my $cds_ntc = Rinchi::CIGIPP::CollisionDetectionSegmentNotification->new();
380             push @message,$cds_ntc;
381              
382             my $cdv_ntc = Rinchi::CIGIPP::CollisionDetectionVolumeNotification->new();
383             push @message,$cdv_ntc;
384              
385             my $stop_ntc = Rinchi::CIGIPP::AnimationStopNotification->new();
386             push @message,$stop_ntc;
387              
388             my $evt_ntc = Rinchi::CIGIPP::EventNotification->new();
389             push @message,$evt_ntc;
390              
391             my $ig_msg = Rinchi::CIGIPP::ImageGeneratorMessage->new();
392             push @message,$ig_msg;
393              
394             my $msg_no = 1;
395             $cigi->write_message_to_file(\@message,"message$msg_no.cigi");
396             $cigi->dispatch_packets(\@message,1);
397             my $messages = $cigi->scan_file("message$msg_no.cigi");
398             foreach $message (@{$messages}) {
399             $msg_no++;
400             $cigi->write_message_to_file($message,"message$msg_no.cigi");
401             $cigi->dispatch_packets($message,$msg_no);
402             }
403             $msg_no++;
404             $cigi->write_messages_to_file($messages,"message$msg_no.cigi");
405              
406             =head1 DESCRIPTION
407              
408             This module provides an interface between an image generator and host computer
409             that is compliant with the CIGI ICD version 3.3.
410              
411             =head2 EXPORT
412              
413             None by default.
414              
415             =head1 METHODS
416              
417             =over 4
418              
419             #==============================================================================
420              
421             =item new
422              
423             Constructor for Rinchi::CIGIPP.
424              
425             =cut
426              
427             sub new {
428 0     0 1   my ($class, %args) = @_;
429 0           my $self = bless \%args, $class;
430 0           $args{'_State_'} = 0;
431 0           $args{'Context'} = [];
432 0   0       $args{'ErrorMessage'} ||= '';
433 0           $args{'_Setters'} = \%Handler_Setters;
434 0           $args{'_Handlers'} = {};
435              
436 0           return $self;
437             }
438              
439             #==============================================================================
440              
441             =item setHandlers(TYPE, HANDLER [, TYPE, HANDLER [...]])
442              
443             This method registers handlers for the various events.
444              
445             Setting a handler to something that evaluates to false unsets that
446             handler.
447              
448             This method returns a list of type, handler pairs corresponding to the
449             input. The handlers returned are the ones that were in effect before the
450             call to setHandlers.
451              
452             The recognized events and the parameters passed to the corresponding
453             handlers are:
454              
455             =over 4
456              
457             IGControl (PacketType, [, Attr, Val [,...]])
458              
459             This event is generated when an IGControl data packet is recognized. PacketType
460             is the numeric packet type (1) of the IGControl data packet as defined by the
461             CIGI ICD. The Attr and Val pairs are generated for each attribute in the data packet.
462              
463             EntityControl (PacketType, [, Attr, Val [,...]])
464              
465             This event is generated when an EntityControl data packet is recognized.
466             PacketType is the numeric packet type (2) of the EntityControl data packet as
467             defined by the CIGI ICD. The Attr and Val pairs are generated for each
468             attribute in the data packet.
469              
470             ConformalClampedEntityControl (PacketType, [, Attr, Val [,...]])
471              
472             This event is generated when a ConformalClampedEntityControl data packet is
473             recognized. PacketType is the numeric packet type (3) of the
474             ConformalClampedEntityControl data packet as defined by the CIGI ICD. The Attr
475             and Val pairs are generated for each attribute in the data packet.
476              
477             ComponentControl (PacketType, [, Attr, Val [,...]])
478              
479             This event is generated when a ComponentControl data packet is recognized.
480             PacketType is the numeric packet type (4) of the ComponentControl data packet
481             as defined by the CIGI ICD. The Attr and Val pairs are generated for each
482             attribute in the data packet.
483              
484             ShortComponentControl (PacketType, [, Attr, Val [,...]])
485              
486             This event is generated when a ShortComponentControl data packet is recognized.
487             PacketType is the numeric packet type (5) of the ShortComponentControl data
488             packet as defined by the CIGI ICD. The Attr and Val pairs are generated for
489             each attribute in the data packet.
490              
491             ArticulatedPartControl (PacketType, [, Attr, Val [,...]])
492              
493             This event is generated when an ArticulatedPartControl data packet is
494             recognized. PacketType is the numeric packet type (6) of the
495             ArticulatedPartControl data packet as defined by the CIGI ICD. The Attr and Val
496             pairs are generated for each attribute in the data packet.
497              
498             ShortArticulatedPartControl (PacketType, [, Attr, Val [,...]])
499              
500             This event is generated when a ShortArticulatedPartControl data packet is
501             recognized. PacketType is the numeric packet type (7) of the
502             ShortArticulatedPartControl data packet as defined by the CIGI ICD. The Attr
503             and Val pairs are generated for each attribute in the data packet.
504              
505             RateControl (PacketType, [, Attr, Val [,...]])
506              
507             This event is generated when a RateControl data packet is recognized.
508             PacketType is the numeric packet type (8) of the RateControl data packet as
509             defined by the CIGI ICD. The Attr and Val pairs are generated for each
510             attribute in the data packet.
511              
512             CelestialSphereControl (PacketType, [, Attr, Val [,...]])
513              
514             This event is generated when a CelestialSphereControl data packet is
515             recognized. PacketType is the numeric packet type (9) of the
516             CelestialSphereControl data packet as defined by the CIGI ICD. The Attr and Val
517             pairs are generated for each attribute in the data packet.
518              
519             AtmosphereControl (PacketType, [, Attr, Val [,...]])
520              
521             This event is generated when an AtmosphereControl data packet is recognized.
522             PacketType is the numeric packet type (10) of the AtmosphereControl data packet
523             as defined by the CIGI ICD. The Attr and Val pairs are generated for each
524             attribute in the data packet.
525              
526             EnvironmentalRegionControl (PacketType, [, Attr, Val [,...]])
527              
528             This event is generated when an EnvironmentalRegionControl data packet is
529             recognized. PacketType is the numeric packet type (11) of the
530             EnvironmentalRegionControl data packet as defined by the CIGI ICD. The Attr and
531             Val pairs are generated for each attribute in the data packet.
532              
533             WeatherControl (PacketType, [, Attr, Val [,...]])
534              
535             This event is generated when a WeatherControl data packet is recognized.
536             PacketType is the numeric packet type (12) of the WeatherControl data packet as
537             defined by the CIGI ICD. The Attr and Val pairs are generated for each
538             attribute in the data packet.
539              
540             MaritimeSurfaceConditionsControl (PacketType, [, Attr, Val [,...]])
541              
542             This event is generated when a MaritimeSurfaceConditionsControl data packet is
543             recognized. PacketType is the numeric packet type (13) of the
544             MaritimeSurfaceConditionsControl data packet as defined by the CIGI ICD. The
545             Attr and Val pairs are generated for each attribute in the data packet.
546              
547             WaveControl (PacketType, [, Attr, Val [,...]])
548              
549             This event is generated when a WaveControl data packet is recognized.
550             PacketType is the numeric packet type (14) of the WaveControl data packet as
551             defined by the CIGI ICD. The Attr and Val pairs are generated for each
552             attribute in the data packet.
553              
554             TerrestrialSurfaceConditionsControl (PacketType, [, Attr, Val [,...]])
555              
556             This event is generated when a TerrestrialSurfaceConditionsControl data packet
557             is recognized. PacketType is the numeric packet type (15) of the
558             TerrestrialSurfaceConditionsControl data packet as defined by the CIGI ICD. The
559             Attr and Val pairs are generated for each attribute in the data packet.
560              
561             ViewControl (PacketType, [, Attr, Val [,...]])
562              
563             This event is generated when a ViewControl data packet is recognized.
564             PacketType is the numeric packet type (16) of the ViewControl data packet as
565             defined by the CIGI ICD. The Attr and Val pairs are generated for each
566             attribute in the data packet.
567              
568             SensorControl (PacketType, [, Attr, Val [,...]])
569              
570             This event is generated when a SensorControl data packet is recognized.
571             PacketType is the numeric packet type (17) of the SensorControl data packet as
572             defined by the CIGI ICD. The Attr and Val pairs are generated for each
573             attribute in the data packet.
574              
575             MotionTrackerControl (PacketType, [, Attr, Val [,...]])
576              
577             This event is generated when a MotionTrackerControl data packet is recognized.
578             PacketType is the numeric packet type (18) of the MotionTrackerControl data
579             packet as defined by the CIGI ICD. The Attr and Val pairs are generated for
580             each attribute in the data packet.
581              
582             EarthReferenceModelDefinition (PacketType, [, Attr, Val [,...]])
583              
584             This event is generated when an EarthReferenceModelDefinition data packet is
585             recognized. PacketType is the numeric packet type (19) of the
586             EarthReferenceModelDefinition data packet as defined by the CIGI ICD. The Attr
587             and Val pairs are generated for each attribute in the data packet.
588              
589             TrajectoryDefinition (PacketType, [, Attr, Val [,...]])
590              
591             This event is generated when a TrajectoryDefinition data packet is recognized.
592             PacketType is the numeric packet type (20) of the TrajectoryDefinition data
593             packet as defined by the CIGI ICD. The Attr and Val pairs are generated for
594             each attribute in the data packet.
595              
596             ViewDefinition (PacketType, [, Attr, Val [,...]])
597              
598             This event is generated when a ViewDefinition data packet is recognized.
599             PacketType is the numeric packet type (21) of the ViewDefinition data packet as
600             defined by the CIGI ICD. The Attr and Val pairs are generated for each
601             attribute in the data packet.
602              
603             CollisionDetectionSegmentDefinition (PacketType, [, Attr, Val [,...]])
604              
605             This event is generated when a CollisionDetectionSegmentDefinition data packet
606             is recognized. PacketType is the numeric packet type (22) of the
607             CollisionDetectionSegmentDefinition data packet as defined by the CIGI ICD. The
608             Attr and Val pairs are generated for each attribute in the data packet.
609              
610             CollisionDetectionVolumeDefinition (PacketType, [, Attr, Val [,...]])
611              
612             This event is generated when a CollisionDetectionVolumeDefinition data packet
613             is recognized. PacketType is the numeric packet type (23) of the
614             CollisionDetectionVolumeDefinition data packet as defined by the CIGI ICD. The
615             Attr and Val pairs are generated for each attribute in the data packet.
616              
617             HAT_HOTRequest (PacketType, [, Attr, Val [,...]])
618              
619             This event is generated when a HAT_HOTRequest data packet is recognized.
620             PacketType is the numeric packet type (24) of the HAT_HOTRequest data packet as
621             defined by the CIGI ICD. The Attr and Val pairs are generated for each
622             attribute in the data packet.
623              
624             LineOfSightSegmentRequest (PacketType, [, Attr, Val [,...]])
625              
626             This event is generated when a LineOfSightSegmentRequest data packet is
627             recognized. PacketType is the numeric packet type (25) of the
628             LineOfSightSegmentRequest data packet as defined by the CIGI ICD. The Attr and
629             Val pairs are generated for each attribute in the data packet.
630              
631             LineOfSightVectorRequest (PacketType, [, Attr, Val [,...]])
632              
633             This event is generated when a LineOfSightVectorRequest data packet is
634             recognized. PacketType is the numeric packet type (26) of the
635             LineOfSightVectorRequest data packet as defined by the CIGI ICD. The Attr and
636             Val pairs are generated for each attribute in the data packet.
637              
638             PositionRequest (PacketType, [, Attr, Val [,...]])
639              
640             This event is generated when a PositionRequest data packet is recognized.
641             PacketType is the numeric packet type (27) of the PositionRequest data packet
642             as defined by the CIGI ICD. The Attr and Val pairs are generated for each
643             attribute in the data packet.
644              
645             EnvironmentalConditionsRequest (PacketType, [, Attr, Val [,...]])
646              
647             This event is generated when an EnvironmentalConditionsRequest data packet is
648             recognized. PacketType is the numeric packet type (28) of the
649             EnvironmentalConditionsRequest data packet as defined by the CIGI ICD. The Attr
650             and Val pairs are generated for each attribute in the data packet.
651              
652             SymbolSurfaceDefinition (PacketType, [, Attr, Val [,...]])
653              
654             This event is generated when a SymbolSurfaceDefinition data packet is
655             recognized. PacketType is the numeric packet type (29) of the
656             SymbolSurfaceDefinition data packet as defined by the CIGI ICD. The Attr and
657             Val pairs are generated for each attribute in the data packet.
658              
659             SymbolTextDefinition (PacketType, [, Attr, Val [,...]])
660              
661             This event is generated when a SymbolTextDefinition data packet is recognized.
662             PacketType is the numeric packet type (30) of the SymbolTextDefinition data
663             packet as defined by the CIGI ICD. The Attr and Val pairs are generated for
664             each attribute in the data packet.
665              
666             SymbolCircleDefinition (PacketType, Circles, [, Attr, Val [,...]])
667              
668             This event is generated when a SymbolCircleDefinition data packet is
669             recognized. PacketType is the numeric packet type (31) of the
670             SymbolCircleDefinition data packet as defined by the CIGI ICD. The Attr and Val
671             pairs are generated for each attribute in the data packet.
672              
673             SymbolCircle (Index, [, Attr, Val [,...]])
674              
675             This event is generated for each circle when a SymbolCircleDefinition data
676             packet is recognized. Index is the 0-based position of the circle in the
677             SymbolCircleDefinition data packet as defined by the CIGI ICD. The Attr and Val
678             pairs are generated for each attribute in the circle.
679              
680             SymbolLineDefinition (PacketType, Vertices, [, Attr, Val [,...]])
681              
682             This event is generated when a SymbolLineDefinition data packet is recognized.
683             PacketType is the numeric packet type (32) of the SymbolLineDefinition data
684             packet as defined by the CIGI ICD. The Attr and Val pairs are generated for
685             each attribute in the data packet.
686              
687             SymbolLineVertex (Index, [, Attr, Val [,...]])
688              
689             This event is generated for each vertex when a SymbolLineDefinition data packet
690             is recognized. Index is the 0-based position of the vertex in the
691             SymbolLineDefinition data packet as defined by the CIGI ICD. The Attr and Val
692             pairs are generated for each attribute in the vertex.
693              
694             SymbolClone (PacketType, [, Attr, Val [,...]])
695              
696             This event is generated when a SymbolClone data packet is recognized.
697             PacketType is the numeric packet type (33) of the SymbolClone data packet as
698             defined by the CIGI ICD. The Attr and Val pairs are generated for each
699             attribute in the data packet.
700              
701             SymbolControl (PacketType, [, Attr, Val [,...]])
702              
703             This event is generated when a SymbolControl data packet is recognized.
704             PacketType is the numeric packet type (34) of the SymbolControl data packet as
705             defined by the CIGI ICD. The Attr and Val pairs are generated for each
706             attribute in the data packet.
707              
708             ShortSymbolControl (PacketType, [, Attr, Val [,...]])
709              
710             This event is generated when a ShortSymbolControl data packet is recognized.
711             PacketType is the numeric packet type (35) of the ShortSymbolControl data
712             packet as defined by the CIGI ICD. The Attr and Val pairs are generated for
713             each attribute in the data packet.
714              
715             StartOfFrame (PacketType, [, Attr, Val [,...]])
716              
717             This event is generated when a StartOfFrame data packet is recognized.
718             PacketType is the numeric packet type (101) of the StartOfFrame data packet as
719             defined by the CIGI ICD. The Attr and Val pairs are generated for each
720             attribute in the data packet.
721              
722             HAT_HOTResponse (PacketType, [, Attr, Val [,...]])
723              
724             This event is generated when a HAT_HOTResponse data packet is recognized.
725             PacketType is the numeric packet type (102) of the HAT_HOTResponse data packet
726             as defined by the CIGI ICD. The Attr and Val pairs are generated for each
727             attribute in the data packet.
728              
729             HAT_HOTExtendedResponse (PacketType, [, Attr, Val [,...]])
730              
731             This event is generated when a HAT_HOTExtendedResponse data packet is
732             recognized. PacketType is the numeric packet type (103) of the
733             HAT_HOTExtendedResponse data packet as defined by the CIGI ICD. The Attr and
734             Val pairs are generated for each attribute in the data packet.
735              
736             LineOfSightResponse (PacketType, [, Attr, Val [,...]])
737              
738             This event is generated when a LineOfSightResponse data packet is recognized.
739             PacketType is the numeric packet type (104) of the LineOfSightResponse data
740             packet as defined by the CIGI ICD. The Attr and Val pairs are generated for
741             each attribute in the data packet.
742              
743             LineOfSightExtendedResponse (PacketType, [, Attr, Val [,...]])
744              
745             This event is generated when a LineOfSightExtendedResponse data packet is
746             recognized. PacketType is the numeric packet type (105) of the
747             LineOfSightExtendedResponse data packet as defined by the CIGI ICD. The Attr
748             and Val pairs are generated for each attribute in the data packet.
749              
750             SensorResponse (PacketType, [, Attr, Val [,...]])
751              
752             This event is generated when a SensorResponse data packet is recognized.
753             PacketType is the numeric packet type (106) of the SensorResponse data packet
754             as defined by the CIGI ICD. The Attr and Val pairs are generated for each
755             attribute in the data packet.
756              
757             SensorExtendedResponse (PacketType, [, Attr, Val [,...]])
758              
759             This event is generated when a SensorExtendedResponse data packet is
760             recognized. PacketType is the numeric packet type (107) of the
761             SensorExtendedResponse data packet as defined by the CIGI ICD. The Attr and Val
762             pairs are generated for each attribute in the data packet.
763              
764             PositionResponse (PacketType, [, Attr, Val [,...]])
765              
766             This event is generated when a PositionResponse data packet is recognized.
767             PacketType is the numeric packet type (108) of the PositionResponse data packet
768             as defined by the CIGI ICD. The Attr and Val pairs are generated for each
769             attribute in the data packet.
770              
771             WeatherConditionsResponse (PacketType, [, Attr, Val [,...]])
772              
773             This event is generated when a WeatherConditionsResponse data packet is
774             recognized. PacketType is the numeric packet type (109) of the
775             WeatherConditionsResponse data packet as defined by the CIGI ICD. The Attr and
776             Val pairs are generated for each attribute in the data packet.
777              
778             AerosolConcentrationResponse (PacketType, [, Attr, Val [,...]])
779              
780             This event is generated when an AerosolConcentrationResponse data packet is
781             recognized. PacketType is the numeric packet type (110) of the
782             AerosolConcentrationResponse data packet as defined by the CIGI ICD. The Attr
783             and Val pairs are generated for each attribute in the data packet.
784              
785             MaritimeSurfaceConditionsResponse (PacketType, [, Attr, Val [,...]])
786              
787             This event is generated when a MaritimeSurfaceConditionsResponse data packet is
788             recognized. PacketType is the numeric packet type (111) of the
789             MaritimeSurfaceConditionsResponse data packet as defined by the CIGI ICD. The
790             Attr and Val pairs are generated for each attribute in the data packet.
791              
792             TerrestrialSurfaceConditionsResponse (PacketType, [, Attr, Val [,...]])
793              
794             This event is generated when a TerrestrialSurfaceConditionsResponse data packet
795             is recognized. PacketType is the numeric packet type (112) of the
796             TerrestrialSurfaceConditionsResponse data packet as defined by the CIGI ICD.
797             The Attr and Val pairs are generated for each attribute in the data packet.
798              
799             CollisionDetectionSegmentNotification (PacketType, [, Attr, Val [,...]])
800              
801             This event is generated when a CollisionDetectionSegmentNotification data
802             packet is recognized. PacketType is the numeric packet type (113) of the
803             CollisionDetectionSegmentNotification data packet as defined by the CIGI ICD.
804             The Attr and Val pairs are generated for each attribute in the data packet.
805              
806             CollisionDetectionVolumeNotification (PacketType, [, Attr, Val [,...]])
807              
808             This event is generated when a CollisionDetectionVolumeNotification data packet
809             is recognized. PacketType is the numeric packet type (114) of the
810             CollisionDetectionVolumeNotification data packet as defined by the CIGI ICD.
811             The Attr and Val pairs are generated for each attribute in the data packet.
812              
813             AnimationStopNotification (PacketType, [, Attr, Val [,...]])
814              
815             This event is generated when an AnimationStopNotification data packet is
816             recognized. PacketType is the numeric packet type (115) of the
817             AnimationStopNotification data packet as defined by the CIGI ICD. The Attr and
818             Val pairs are generated for each attribute in the data packet.
819              
820             EventNotification (PacketType, [, Attr, Val [,...]])
821              
822             This event is generated when an EventNotification data packet is recognized.
823             PacketType is the numeric packet type (116) of the EventNotification data
824             packet as defined by the CIGI ICD. The Attr and Val pairs are generated for
825             each attribute in the data packet.
826              
827             ImageGeneratorMessage (PacketType, [, Attr, Val [,...]])
828              
829             This event is generated when an ImageGeneratorMessage data packet is
830             recognized. PacketType is the numeric packet type (117) of the
831             ImageGeneratorMessage data packet as defined by the CIGI ICD. The Attr and Val
832             pairs are generated for each attribute in the data packet.
833              
834             =back
835              
836             =cut
837              
838             sub setHandlers {
839 0     0 1   my ($self, @handler_pairs) = @_;
840              
841 0 0         croak("Uneven number of arguments to setHandlers method")
842             if (int(@handler_pairs) & 1);
843              
844 0           my @ret;
845              
846 0           while (@handler_pairs) {
847 0           my $type = shift @handler_pairs;
848 0           my $handler = shift @handler_pairs;
849 0 0 0       croak "Handler for $type not a Code ref"
      0        
850             unless (! defined($handler) or ! $handler or ref($handler) eq 'CODE');
851              
852 0           my $hndl = $self->{'_Setters'}->{$type};
853              
854 0 0         unless (defined($hndl)) {
855 0           my @types = sort keys %{$self->{'_Setters'}};
  0            
856 0           croak("Unknown handler type: $type\n Valid types: @types");
857             }
858              
859 0           $self->{'_Handlers'}->{$type} = $handler;
860             }
861              
862             }
863              
864             #==============================================================================
865              
866             =item sub dispatch_packets($packets)
867              
868             $cigi->dispatch_packets($packets);
869              
870             Where $packets is a reference to an array of packets to be dispatched.
871              
872             =cut
873              
874             sub dispatch_packets($$) {
875 0     0 1   my ($self, $packets, $msg_no) = @_;
876 0           my @args = ($msg_no);
877              
878 0           $self->{'_Handlers'}{'StartOfMessage'}(@args);
879 0           foreach my $packet (@{$packets}) {
  0            
880 0           my @pcl = split('::',ref($packet));
881 0           my $pclass = pop @pcl;
882 0           @args = ($pclass);
883 0 0         if ($pclass eq 'SymbolCircleDefinition') {
    0          
884 0           my $circles = [];
885 0           push @args,$circles;
886 0           foreach my $circle (@{$packet->{'_circle'}}) {
  0            
887 0           my $circ = ['SymbolCircle'];
888 0           push @{$circles},$circ;
  0            
889 0           foreach my $key (sort keys %{$circle}) {
  0            
890 0 0 0       if (($key =~ /^[a-z]/) and ! ($key =~ /^_unused/)) {
891 0           push @{$circ},$key;
  0            
892 0           push @{$circ},$circle->{$key};
  0            
893             }
894             }
895 0           $self->{'_Handlers'}{'SymbolCircle'}(@{$circ});
  0            
896             }
897             }
898             elsif ($pclass eq 'SymbolLineDefinition') {
899 0           my $vertices = [];
900 0           push @args,$vertices;
901 0           foreach my $vertex (@{$packet->{'_vertex'}}) {
  0            
902 0           my $vert = ['SymbolLineVertex'];
903 0           push @{$vertices},$vert;
  0            
904 0           foreach my $key (sort keys %{$vertex}) {
  0            
905 0 0 0       if (($key =~ /^[a-z]/) and ! ($key =~ /^_unused/)) {
906 0           push @{$vert},$key;
  0            
907 0           push @{$vert},$vertex->{$key};
  0            
908             }
909             }
910 0           $self->{'_Handlers'}{'SymbolLineVertex'}(@{$vert});
  0            
911             }
912             }
913 0           foreach my $key (sort keys %{$packet}) {
  0            
914 0 0 0       if (($key =~ /^[a-z]/) and ! ($key =~ /^_unused/)) {
915 0           push @args,$key;
916 0           push @args,$packet->{$key};
917             }
918             }
919 0           $self->{'_Handlers'}{$pclass}(@args);
920             # print "$pclass\n";
921             }
922 0           @args = ($msg_no);
923              
924 0           $self->{'_Handlers'}{'EndOfMessage'}(@args);
925             }
926              
927             #==============================================================================
928              
929             =item sub scan_file($path)
930              
931             $cigi->scan_file('some_file');
932              
933             Where $path is the path to the file to be scanned.
934              
935             Scan the given file for data packets. Returns a reference to an array of
936             CIGI messages in the order of occurrence in the file scanned. Each message is
937             represented by an array of references to the data packets in order of occurrence.
938              
939             =cut
940              
941             sub scan_file($) {
942 0     0 1   my ($self, $path) = @_;
943              
944 0           my $hdr;
945             my $bdy;
946 0           my $success=1;
947 0           my $packets;
948 0           my $messages = [];
949 0           my $byteswap = 0;
950            
951 0 0         open (CIGI,'<',$path) or $success = 0;
952 0 0         return 0 unless ($success);
953 0           binmode CIGI;
954 0           while (read (CIGI, $hdr, 2)) {
955 0           my ($tp,$sz) = CORE::unpack('CC',$hdr);
956 0           read (CIGI, $bdy, $sz-2);
957 0           my $packet;
958 0 0         if ($tp == 1) {
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
959 0           $packet = Rinchi::CIGIPP::IGControl->new();
960             }
961             elsif ($tp == 2) {
962 0           $packet = Rinchi::CIGIPP::EntityControl->new();
963             }
964             elsif ($tp == 3) {
965 0           $packet = Rinchi::CIGIPP::ConformalClampedEntityControl->new();
966             }
967             elsif ($tp == 4) {
968 0           $packet = Rinchi::CIGIPP::ComponentControl->new();
969             }
970             elsif ($tp == 5) {
971 0           $packet = Rinchi::CIGIPP::ShortComponentControl->new();
972             }
973             elsif ($tp == 6) {
974 0           $packet = Rinchi::CIGIPP::ArticulatedPartControl->new();
975             }
976             elsif ($tp == 7) {
977 0           $packet = Rinchi::CIGIPP::ShortArticulatedPartControl->new();
978             }
979             elsif ($tp == 8) {
980 0           $packet = Rinchi::CIGIPP::RateControl->new();
981             }
982             elsif ($tp == 9) {
983 0           $packet = Rinchi::CIGIPP::CelestialSphereControl->new();
984             }
985             elsif ($tp == 10) {
986 0           $packet = Rinchi::CIGIPP::AtmosphereControl->new();
987             }
988             elsif ($tp == 11) {
989 0           $packet = Rinchi::CIGIPP::EnvironmentalRegionControl->new();
990             }
991             elsif ($tp == 12) {
992 0           $packet = Rinchi::CIGIPP::WeatherControl->new();
993             }
994             elsif ($tp == 13) {
995 0           $packet = Rinchi::CIGIPP::MaritimeSurfaceConditionsControl->new();
996             }
997             elsif ($tp == 14) {
998 0           $packet = Rinchi::CIGIPP::WaveControl->new();
999             }
1000             elsif ($tp == 15) {
1001 0           $packet = Rinchi::CIGIPP::TerrestrialSurfaceConditionsControl->new();
1002             }
1003             elsif ($tp == 16) {
1004 0           $packet = Rinchi::CIGIPP::ViewControl->new();
1005             }
1006             elsif ($tp == 17) {
1007 0           $packet = Rinchi::CIGIPP::SensorControl->new();
1008             }
1009             elsif ($tp == 18) {
1010 0           $packet = Rinchi::CIGIPP::MotionTrackerControl->new();
1011             }
1012             elsif ($tp == 19) {
1013 0           $packet = Rinchi::CIGIPP::EarthReferenceModelDefinition->new();
1014             }
1015             elsif ($tp == 20) {
1016 0           $packet = Rinchi::CIGIPP::TrajectoryDefinition->new();
1017             }
1018             elsif ($tp == 21) {
1019 0           $packet = Rinchi::CIGIPP::ViewDefinition->new();
1020             }
1021             elsif ($tp == 22) {
1022 0           $packet = Rinchi::CIGIPP::CollisionDetectionSegmentDefinition->new();
1023             }
1024             elsif ($tp == 23) {
1025 0           $packet = Rinchi::CIGIPP::CollisionDetectionVolumeDefinition->new();
1026             }
1027             elsif ($tp == 24) {
1028 0           $packet = Rinchi::CIGIPP::HAT_HOTRequest->new();
1029             }
1030             elsif ($tp == 25) {
1031 0           $packet = Rinchi::CIGIPP::LineOfSightSegmentRequest->new();
1032             }
1033             elsif ($tp == 26) {
1034 0           $packet = Rinchi::CIGIPP::LineOfSightVectorRequest->new();
1035             }
1036             elsif ($tp == 27) {
1037 0           $packet = Rinchi::CIGIPP::PositionRequest->new();
1038             }
1039             elsif ($tp == 28) {
1040 0           $packet = Rinchi::CIGIPP::EnvironmentalConditionsRequest->new();
1041             }
1042             elsif ($tp == 29) {
1043 0           $packet = Rinchi::CIGIPP::SymbolSurfaceDefinition->new();
1044             }
1045             elsif ($tp == 30) {
1046 0           $packet = Rinchi::CIGIPP::SymbolTextDefinition->new();
1047             }
1048             elsif ($tp == 31) {
1049 0           $packet = Rinchi::CIGIPP::SymbolCircleDefinition->new();
1050             }
1051             elsif ($tp == 32) {
1052 0           $packet = Rinchi::CIGIPP::SymbolLineDefinition->new();
1053             }
1054             elsif ($tp == 33) {
1055 0           $packet = Rinchi::CIGIPP::SymbolClone->new();
1056             }
1057             elsif ($tp == 34) {
1058 0           $packet = Rinchi::CIGIPP::SymbolControl->new();
1059             }
1060             elsif ($tp == 35) {
1061 0           $packet = Rinchi::CIGIPP::ShortSymbolControl->new();
1062             }
1063             elsif ($tp == 101) {
1064 0           $packet = Rinchi::CIGIPP::StartOfFrame->new();
1065             }
1066             elsif ($tp == 102) {
1067 0           $packet = Rinchi::CIGIPP::HAT_HOTResponse->new();
1068             }
1069             elsif ($tp == 103) {
1070 0           $packet = Rinchi::CIGIPP::HAT_HOTExtendedResponse->new();
1071             }
1072             elsif ($tp == 104) {
1073 0           $packet = Rinchi::CIGIPP::LineOfSightResponse->new();
1074             }
1075             elsif ($tp == 105) {
1076 0           $packet = Rinchi::CIGIPP::LineOfSightExtendedResponse->new();
1077             }
1078             elsif ($tp == 106) {
1079 0           $packet = Rinchi::CIGIPP::SensorResponse->new();
1080             }
1081             elsif ($tp == 107) {
1082 0           $packet = Rinchi::CIGIPP::SensorExtendedResponse->new();
1083             }
1084             elsif ($tp == 108) {
1085 0           $packet = Rinchi::CIGIPP::PositionResponse->new();
1086             }
1087             elsif ($tp == 109) {
1088 0           $packet = Rinchi::CIGIPP::WeatherConditionsResponse->new();
1089             }
1090             elsif ($tp == 110) {
1091 0           $packet = Rinchi::CIGIPP::AerosolConcentrationResponse->new();
1092             }
1093             elsif ($tp == 111) {
1094 0           $packet = Rinchi::CIGIPP::MaritimeSurfaceConditionsResponse->new();
1095             }
1096             elsif ($tp == 112) {
1097 0           $packet = Rinchi::CIGIPP::TerrestrialSurfaceConditionsResponse->new();
1098             }
1099             elsif ($tp == 113) {
1100 0           $packet = Rinchi::CIGIPP::CollisionDetectionSegmentNotification->new();
1101             }
1102             elsif ($tp == 114) {
1103 0           $packet = Rinchi::CIGIPP::CollisionDetectionVolumeNotification->new();
1104             }
1105             elsif ($tp == 115) {
1106 0           $packet = Rinchi::CIGIPP::AnimationStopNotification->new();
1107             }
1108             elsif ($tp == 116) {
1109 0           $packet = Rinchi::CIGIPP::EventNotification->new();
1110             }
1111             elsif ($tp == 117) {
1112 0           $packet = Rinchi::CIGIPP::ImageGeneratorMessage->new();
1113             }
1114 0 0         if (defined($packet)) {
1115 0           $packet->unpack($hdr . $bdy);
1116 0 0 0       if ($tp == 1 or $tp == 101) {
1117 0           $byteswap = ($packet->magic_number == 0x80);
1118 0           $packets = [];
1119 0           push @{$messages},$packets;
  0            
1120             }
1121 0 0         $packet->byte_swap if($byteswap);
1122 0           push @{$packets},$packet;
  0            
1123             } else {
1124 0           print "$tp, $sz\n";
1125             }
1126             }
1127 0           close CIGI;
1128 0           return $messages;
1129             }
1130              
1131             #==============================================================================
1132              
1133             =item sub wait_for_message($port)
1134              
1135             \@message = $cigi->wait_for_message(4321);
1136              
1137             Where $port is the port to which to listen for messages.
1138              
1139             Listen to the given port and scan the UDP messages that arrive. Returns a
1140             reference to an array of data packets in the order of occurrence in the
1141             message received.
1142              
1143             =cut
1144              
1145             sub wait_for_message($) {
1146 0     0 1   my ($self, $port) = @_;
1147              
1148 0           my $hdr;
1149             my $pkt;
1150 0           my $success=1;
1151 0           my @message;
1152 0           my $byteswap = 0;
1153            
1154 0           my $recv_socket = IO::Socket::INET->new(
1155             'Proto' => 'udp',
1156             'LocalPort' => $port,
1157             );
1158            
1159 0           my $text;
1160 0           $recv_socket->recv($text, 1472);
1161              
1162 0           while (length($text) >= 8 ) {
1163 0           $hdr = substr($text,0,2);
1164 0           my ($tp,$sz) = CORE::unpack('CC',$hdr);
1165 0           $pkt = substr($text,0,$sz);
1166 0           my $packet;
1167 0 0         if ($tp == 1) {
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
1168 0           $packet = Rinchi::CIGIPP::IGControl->new();
1169             }
1170             elsif ($tp == 2) {
1171 0           $packet = Rinchi::CIGIPP::EntityControl->new();
1172             }
1173             elsif ($tp == 3) {
1174 0           $packet = Rinchi::CIGIPP::ConformalClampedEntityControl->new();
1175             }
1176             elsif ($tp == 4) {
1177 0           $packet = Rinchi::CIGIPP::ComponentControl->new();
1178             }
1179             elsif ($tp == 5) {
1180 0           $packet = Rinchi::CIGIPP::ShortComponentControl->new();
1181             }
1182             elsif ($tp == 6) {
1183 0           $packet = Rinchi::CIGIPP::ArticulatedPartControl->new();
1184             }
1185             elsif ($tp == 7) {
1186 0           $packet = Rinchi::CIGIPP::ShortArticulatedPartControl->new();
1187             }
1188             elsif ($tp == 8) {
1189 0           $packet = Rinchi::CIGIPP::RateControl->new();
1190             }
1191             elsif ($tp == 9) {
1192 0           $packet = Rinchi::CIGIPP::CelestialSphereControl->new();
1193             }
1194             elsif ($tp == 10) {
1195 0           $packet = Rinchi::CIGIPP::AtmosphereControl->new();
1196             }
1197             elsif ($tp == 11) {
1198 0           $packet = Rinchi::CIGIPP::EnvironmentalRegionControl->new();
1199             }
1200             elsif ($tp == 12) {
1201 0           $packet = Rinchi::CIGIPP::WeatherControl->new();
1202             }
1203             elsif ($tp == 13) {
1204 0           $packet = Rinchi::CIGIPP::MaritimeSurfaceConditionsControl->new();
1205             }
1206             elsif ($tp == 14) {
1207 0           $packet = Rinchi::CIGIPP::WaveControl->new();
1208             }
1209             elsif ($tp == 15) {
1210 0           $packet = Rinchi::CIGIPP::TerrestrialSurfaceConditionsControl->new();
1211             }
1212             elsif ($tp == 16) {
1213 0           $packet = Rinchi::CIGIPP::ViewControl->new();
1214             }
1215             elsif ($tp == 17) {
1216 0           $packet = Rinchi::CIGIPP::SensorControl->new();
1217             }
1218             elsif ($tp == 18) {
1219 0           $packet = Rinchi::CIGIPP::MotionTrackerControl->new();
1220             }
1221             elsif ($tp == 19) {
1222 0           $packet = Rinchi::CIGIPP::EarthReferenceModelDefinition->new();
1223             }
1224             elsif ($tp == 20) {
1225 0           $packet = Rinchi::CIGIPP::TrajectoryDefinition->new();
1226             }
1227             elsif ($tp == 21) {
1228 0           $packet = Rinchi::CIGIPP::ViewDefinition->new();
1229             }
1230             elsif ($tp == 22) {
1231 0           $packet = Rinchi::CIGIPP::CollisionDetectionSegmentDefinition->new();
1232             }
1233             elsif ($tp == 23) {
1234 0           $packet = Rinchi::CIGIPP::CollisionDetectionVolumeDefinition->new();
1235             }
1236             elsif ($tp == 24) {
1237 0           $packet = Rinchi::CIGIPP::HAT_HOTRequest->new();
1238             }
1239             elsif ($tp == 25) {
1240 0           $packet = Rinchi::CIGIPP::LineOfSightSegmentRequest->new();
1241             }
1242             elsif ($tp == 26) {
1243 0           $packet = Rinchi::CIGIPP::LineOfSightVectorRequest->new();
1244             }
1245             elsif ($tp == 27) {
1246 0           $packet = Rinchi::CIGIPP::PositionRequest->new();
1247             }
1248             elsif ($tp == 28) {
1249 0           $packet = Rinchi::CIGIPP::EnvironmentalConditionsRequest->new();
1250             }
1251             elsif ($tp == 29) {
1252 0           $packet = Rinchi::CIGIPP::SymbolSurfaceDefinition->new();
1253             }
1254             elsif ($tp == 30) {
1255 0           $packet = Rinchi::CIGIPP::SymbolTextDefinition->new();
1256             }
1257             elsif ($tp == 31) {
1258 0           $packet = Rinchi::CIGIPP::SymbolCircleDefinition->new();
1259             }
1260             elsif ($tp == 32) {
1261 0           $packet = Rinchi::CIGIPP::SymbolLineDefinition->new();
1262             }
1263             elsif ($tp == 33) {
1264 0           $packet = Rinchi::CIGIPP::SymbolClone->new();
1265             }
1266             elsif ($tp == 34) {
1267 0           $packet = Rinchi::CIGIPP::SymbolControl->new();
1268             }
1269             elsif ($tp == 35) {
1270 0           $packet = Rinchi::CIGIPP::ShortSymbolControl->new();
1271             }
1272             elsif ($tp == 101) {
1273 0           $packet = Rinchi::CIGIPP::StartOfFrame->new();
1274             }
1275             elsif ($tp == 102) {
1276 0           $packet = Rinchi::CIGIPP::HAT_HOTResponse->new();
1277             }
1278             elsif ($tp == 103) {
1279 0           $packet = Rinchi::CIGIPP::HAT_HOTExtendedResponse->new();
1280             }
1281             elsif ($tp == 104) {
1282 0           $packet = Rinchi::CIGIPP::LineOfSightResponse->new();
1283             }
1284             elsif ($tp == 105) {
1285 0           $packet = Rinchi::CIGIPP::LineOfSightExtendedResponse->new();
1286             }
1287             elsif ($tp == 106) {
1288 0           $packet = Rinchi::CIGIPP::SensorResponse->new();
1289             }
1290             elsif ($tp == 107) {
1291 0           $packet = Rinchi::CIGIPP::SensorExtendedResponse->new();
1292             }
1293             elsif ($tp == 108) {
1294 0           $packet = Rinchi::CIGIPP::PositionResponse->new();
1295             }
1296             elsif ($tp == 109) {
1297 0           $packet = Rinchi::CIGIPP::WeatherConditionsResponse->new();
1298             }
1299             elsif ($tp == 110) {
1300 0           $packet = Rinchi::CIGIPP::AerosolConcentrationResponse->new();
1301             }
1302             elsif ($tp == 111) {
1303 0           $packet = Rinchi::CIGIPP::MaritimeSurfaceConditionsResponse->new();
1304             }
1305             elsif ($tp == 112) {
1306 0           $packet = Rinchi::CIGIPP::TerrestrialSurfaceConditionsResponse->new();
1307             }
1308             elsif ($tp == 113) {
1309 0           $packet = Rinchi::CIGIPP::CollisionDetectionSegmentNotification->new();
1310             }
1311             elsif ($tp == 114) {
1312 0           $packet = Rinchi::CIGIPP::CollisionDetectionVolumeNotification->new();
1313             }
1314             elsif ($tp == 115) {
1315 0           $packet = Rinchi::CIGIPP::AnimationStopNotification->new();
1316             }
1317             elsif ($tp == 116) {
1318 0           $packet = Rinchi::CIGIPP::EventNotification->new();
1319             }
1320             elsif ($tp == 117) {
1321 0           $packet = Rinchi::CIGIPP::ImageGeneratorMessage->new();
1322             }
1323 0 0         if (defined($packet)) {
1324 0           $packet->unpack($pkt);
1325 0 0 0       $byteswap = ($packet->magic_number == 0x80) if ($tp == 1 or $tp == 101);
1326 0 0         $packet->byte_swap if($byteswap);
1327 0           push @message,$packet;
1328             } else {
1329 0           print "Unrecognized data packet: Type $tp, Size $sz\n";
1330             }
1331 0           $text = substr($text,$sz);
1332             }
1333 0           return \@message;
1334             }
1335              
1336             #==============================================================================
1337              
1338             =item sub write_message_to_file(\@message,$path)
1339              
1340             $cigi->write_message_to_file(\@message,'some_path');
1341              
1342             Where $packets is a reference to an array of CIGI data packets and $path is a path
1343             to the file to be written.
1344              
1345             =cut
1346              
1347             sub write_message_to_file() {
1348 0     0 1   my ($self, $msg, $path) = @_;
1349              
1350 0 0         if(ref($msg) eq 'ARRAY') {
1351 0           foreach my $pkt (@{$msg}) {
  0            
1352 0           my $obj_cls = ref($pkt);
1353 0 0         unless ($obj_cls =~ /Rinchi::CIGIPP::/) {
1354 0           carp "I don't know what to do with an object of class $obj_cls";
1355 0           return 0;
1356             }
1357             }
1358             } else {
1359 0           carp 'First argument must be an array reference';
1360 0           return 0;
1361             }
1362 0           my $success=1;
1363 0 0         open (CIGI,'>',$path) or $success = 0;
1364 0 0         return 0 unless ($success);
1365 0           binmode CIGI;
1366              
1367 0           foreach my $pkt (@{$msg}) {
  0            
1368 0           print CIGI $pkt->pack();
1369             }
1370 0           close CIGI;
1371            
1372 0           return 1;
1373             }
1374              
1375             #==============================================================================
1376              
1377             =item sub write_messages_to_file(\@messages,$path)
1378              
1379             $cigi->write_messages_to_file(\@messages,'some_path');
1380              
1381             Where $messages is a reference to an array of CIGI messages and $path is a path
1382             to the file to be written.
1383              
1384             =cut
1385              
1386             sub write_messages_to_file() {
1387 0     0 1   my ($self, $messages, $path) = @_;
1388              
1389 0 0         if(ref($messages) eq 'ARRAY') {
1390 0           foreach my $msg (@{$messages}) {
  0            
1391 0 0         if(ref($msg) eq 'ARRAY') {
1392 0           foreach my $pkt (@{$msg}) {
  0            
1393 0           my $obj_cls = ref($pkt);
1394 0 0         unless ($obj_cls =~ /Rinchi::CIGIPP::/) {
1395 0           carp "I don't know what to do with an object of class $obj_cls";
1396 0           return 0;
1397             }
1398             }
1399             } else {
1400 0           carp 'Each message must be an array reference';
1401 0           return 0;
1402             }
1403             }
1404             } else {
1405 0           carp 'First argument must be an array reference';
1406 0           return 0;
1407             }
1408 0           my $success=1;
1409 0 0         open (CIGI,'>',$path) or $success = 0;
1410 0 0         return 0 unless ($success);
1411 0           binmode CIGI;
1412              
1413 0           foreach my $msg (@{$messages}) {
  0            
1414 0           foreach my $pkt (@{$msg}) {
  0            
1415 0           print CIGI $pkt->pack();
1416             }
1417             }
1418 0           close CIGI;
1419            
1420 0           return 1;
1421             }
1422              
1423             #==============================================================================
1424              
1425             =item sub send_message(\@message, $ip_addr, $port)
1426              
1427             $cigi->send_message(\@message,'172.0.0.1',4321);
1428              
1429             Where \@message is a reference to an array containing the data packets to send,
1430             and $ip_addr and $port identify the destination.
1431              
1432             =cut
1433              
1434             sub send_message() {
1435 0     0 1   my ($self, $msg, $ip_addr, $port) = @_;
1436              
1437 0 0         if(ref($msg) eq 'ARRAY') {
1438 0           foreach my $pkt (@{$msg}) {
  0            
1439 0           my $obj_cls = ref($pkt);
1440 0 0         unless ($obj_cls =~ /Rinchi::CIGIPP::/) {
1441 0           carp "I don't know what to do with an object of class $obj_cls";
1442 0           return 0;
1443             }
1444             }
1445             } else {
1446 0           carp 'First argument must be an array reference';
1447 0           return 0;
1448             }
1449 0           my $buffer='';
1450 0           foreach my $pkt (@{$msg}) {
  0            
1451 0           $buffer .= $pkt->pack();
1452             }
1453 0           my $socket = IO::Socket::INET->new(
1454             'Proto' => 'udp',
1455             'PeerPort' => $port,
1456             'PeerAddr' => $ip_addr
1457             );
1458            
1459 0           $socket->send($buffer);
1460             }
1461              
1462             #==============================================================================
1463              
1464             =item sub byte_swap(\@message)
1465              
1466             $cigi->byte_swap(\@message);
1467              
1468             Where \@message is a reference to an array containing the data packets to swap.
1469              
1470             =cut
1471              
1472             sub byte_swap() {
1473 0     0 1   my ($self, $msg, $ip_addr, $port) = @_;
1474              
1475 0 0         if(ref($msg) eq 'ARRAY') {
1476 0           foreach my $pkt (@{$msg}) {
  0            
1477 0           my $obj_cls = ref($pkt);
1478 0 0         unless ($obj_cls =~ /Rinchi::CIGIPP::/) {
1479 0           carp "I don't know what to do with an object of class $obj_cls";
1480 0           return 0;
1481             }
1482             }
1483             } else {
1484 0           carp 'First argument must be an array reference';
1485 0           return 0;
1486             }
1487 0           my $buffer='';
1488 0           foreach my $pkt (@{$msg}) {
  0            
1489 0           $pkt->byte_swap();
1490             }
1491             }
1492              
1493             #==============================================================================
1494              
1495             =head1 ENUMERATIONS
1496              
1497             The following literals may be used in place of numeric values as defined by the
1498             CIGI ICD. Slight modifications have be made to create global uniqueness.
1499              
1500             =item AnimationDirection
1501              
1502             Forward 0,
1503             Backward 1,
1504              
1505             =item AnimationLoopMode
1506              
1507             OneShot 0,
1508             Continuous 1,
1509              
1510             =item AnimationState
1511              
1512             Stop 0,
1513             Pause 1,
1514             Play 2,
1515             Continue 3,
1516              
1517             =item AttachState
1518              
1519             Detach 0,
1520             Attach 1,
1521              
1522             =item AttachType
1523              
1524             EntityAT 0,
1525             ViewAT 1,
1526              
1527             =item Billboard
1528              
1529             NonBillboard 0,
1530             Billboard 1,
1531              
1532             =item Boolean
1533              
1534             False 0,
1535             True 1,
1536              
1537             =item BreakerType
1538              
1539             Plunging 0,
1540             Spilling 1,
1541             Surging 2,
1542              
1543             =item CloudType
1544              
1545             None 0,
1546             Altocumulus 1,
1547             Altostratus 2,
1548             Cirrocumulus 3,
1549             Cirrostratus 4,
1550             Cirrus 5,
1551             Cumulonimbus 6,
1552             Cumulus 7,
1553             Nimbostratus 8,
1554             Stratocumulus 9,
1555             Stratus 10,
1556             Other1 11,
1557             Other2 12,
1558             Other3 13,
1559             Other4 14,
1560             Other5 15,
1561              
1562             =item CollisionType
1563              
1564             CollisionNonEntity 0,
1565             CollisionEntity 1,
1566              
1567             =item ComponentClass
1568              
1569             EntityCC 0,
1570             ViewCC 1,
1571             ViewGroupCC 2,
1572             SensorCC 3,
1573             RegionalSeaSurfaceCC 4,
1574             RegionalTerrainSurfaceCC 5,
1575             RegionalLayeredWeatherCC 6,
1576             GlobalSeaSurfaceCC 7,
1577             GlobalTerrainSurfaceCC 8,
1578             GlobalLayeredWeatherCC 9,
1579             AtmosphereCC 10,
1580             CelestialSphereCC 11,
1581             EventCC 12,
1582             SystemCC 13,
1583             SymbolSurfaceCC 14,
1584             SymbolCC 15,
1585              
1586             =item DOFSelect
1587              
1588             NotUsed 0,
1589             XOffset 1,
1590             YOffset 2,
1591             ZOffset 3,
1592             Yaw 4,
1593             Pitch 5,
1594             Roll 6,
1595              
1596             =item DrawingStyle
1597              
1598             DrawingStyleLine 0,
1599             DrawingStyleFill 1,
1600              
1601             =item EarthReferenceModel
1602              
1603             WGS84 0,
1604             HostDefined 1,
1605              
1606             =item Enable
1607              
1608             Disable 0,
1609             Enable 1,
1610              
1611             =item Enabled
1612              
1613             Disabled 0,
1614             Enabled 1,
1615              
1616             =item EntityState
1617              
1618             EntityInactive 0,
1619             EntityStandby 1,
1620             EntityActive 1,
1621             EntityDestroyed 2,
1622              
1623             =item EnvironmentalConditionsResponseType
1624              
1625             MaritimeSurfaceConditions 1,
1626             TerrestrialSurfaceConditions 2,
1627             WeatherConditions 4,
1628             AerosolConcentrations 8,
1629              
1630             =item FlashControl
1631              
1632             ContinueFlash 0,
1633             RestartFlash 1,
1634              
1635             =item FontIdent
1636              
1637             IGDefault 0,
1638             ProportionalSansSerif 1,
1639             ProportionalSanSerifBold 2,
1640             ProportionalSansSerifItalic 3,
1641             ProportionalSansSerifBoldItalic 4,
1642             ProportionalSerif 5,
1643             ProportionalSerifBold 6,
1644             ProportionalSerifItalic 7,
1645             ProportionalSerifBoldItalic 8,
1646             MonospaceSansSerif 9,
1647             MonospaceSansSerifBold 10,
1648             MonospaceSansSerifItalic 11,
1649             MonospaceSansSerifBoldItalic 12,
1650             MonospaceSerif 13,
1651             MonospaceSerifBold 14,
1652             MonospaceSerifItalic 15,
1653             MonospaceSerifBoldItalic 16,
1654              
1655             =item GroundOceanClamp
1656              
1657             NoClamp 0,
1658             NonConformal 1,
1659             Conformal 2,
1660              
1661             =item HAT_HOT_CS
1662              
1663             GeodeticCS 0,
1664             EntityCS 1,
1665              
1666             =item HAT_HOT_RST
1667              
1668             HeightAboveTerrain 0,
1669             HeightOfTerrain 1,
1670              
1671             =item HAT_HOT_RT
1672              
1673             HeightAboveTerrain 0,
1674             HeightOfTerrain 1,
1675             Extended 2,
1676              
1677             =item IGMode
1678              
1679             Reset 0,
1680             Standby 1,
1681             Operate 1,
1682             Debug 2,
1683             OfflineMaintenance 3,
1684              
1685             =item Inherited
1686              
1687             NotInherited 0,
1688             Inherited 1,
1689              
1690             =item LOS_CS
1691              
1692             GeodeticCS 0,
1693             EntityCS 1,
1694              
1695             =item LOS_RT
1696              
1697             BasicLOS 0,
1698             ExtendedLOS 1,
1699              
1700             =item LOS_Visible
1701              
1702             Occluded 0,
1703             Visible 1,
1704              
1705             =item LinePrimitiveType
1706              
1707             Point 0,
1708             Line 1,
1709             LineStrip 2,
1710             LineLoop 3,
1711             Triangle 4,
1712             TriangleStrip 5,
1713             TriangleFan 6,
1714              
1715             =item MSCScope
1716              
1717             GlobalScope 0,
1718             RegionalScope 1,
1719             EntityScope 2,
1720              
1721             =item Merge
1722              
1723             UseLast 0,
1724             Merge 1,
1725              
1726             =item MirrorMode
1727              
1728             None 0,
1729             Horizontal 1,
1730             Vertical 2,
1731             HorizontalAndVertical 3,
1732              
1733             =item ObjectClass
1734              
1735             EntityOC 0,
1736             ArticulatedPartOC 1,
1737             ViewOC 2,
1738             ViewGroupOC 3,
1739             MotionTrackerOC 4,
1740              
1741             =item PacketType
1742              
1743             IG_CONTROL 1,
1744             ENTITY_CONTROL 2,
1745             CONFORMAL_CLAMPED_ENTITY_CONTROL 3,
1746             COMPONENT_CONTROL 4,
1747             SHORT_COMPONENT_CONTROL 5,
1748             ARTICULATED_PART_CONTROL 6,
1749             SHORT_ARTICULATED_PART_CONTROL 7,
1750             RATE_CONTROL 8,
1751             CELESTIAL_SPHERE_CONTROL 9,
1752             ATMOSPHERE_CONTROL 10,
1753             ENVIRONMENTAL_REGION_CONTROL 11,
1754             WEATHER_CONTROL 12,
1755             MARITIME_SURFACE_CONDITIONS_CONTROL 13,
1756             WAVE_CONTROL 14,
1757             TERRESTRIAL_SURFACE_CONDITIONS_CONTROL 15,
1758             VIEW_CONTROL 16,
1759             SENSOR_CONTROL 17,
1760             MOTION_TRACKER_CONTROL 18,
1761             EARTH_REFERENCE_MODEL_DEFINITION 19,
1762             TRAJECTORY_DEFINITION 20,
1763             VIEW_DEFINITION 21,
1764             COLLISION_DETECTION_SEGMENT_DEFINITION 22,
1765             COLLISION_DETECTION_VOLUME_DEFINITION 23,
1766             HAT_HOT_REQUEST 24,
1767             LINE_OF_SIGHT_SEGMENT_REQUEST 25,
1768             LINE_OF_SIGHT_VECTOR_REQUEST 26,
1769             POSITION_REQUEST 27,
1770             ENVIRONMENTAL_CONDITIONS_REQUEST 28,
1771             SYMBOL_SURFACE_DEFINITION 29,
1772             SYMBOL_TEXT_DEFINITION 30,
1773             SYMBOL_CIRCLE_DEFINITION 31,
1774             SYMBOL_LINE_DEFINITION 32,
1775             SYMBOL_CLONE 33,
1776             SYMBOL_CONTROL 34,
1777             SHORT_SYMBOL_CONTROL 35,
1778             START_OF_FRAME 101,
1779             HAT_HOT_RESPONSE 102,
1780             HAT_HOT_EXTENDED_RESPONSE 103,
1781             LINE_OF_SIGHT_RESPONSE 104,
1782             LINE_OF_SIGHT_EXTENDED_RESPONSE 105,
1783             SENSOR_RESPONSE 106,
1784             SENSOR_EXTENDED_RESPONSE 107,
1785             POSITION_RESPONSE 108,
1786             WEATHER_CONDITIONS_RESPONSE 109,
1787             AEROSOL_CONCENTRATION_RESPONSE 110,
1788             MARITIME_SURFACE_CONDITIONS_RESPONSE 111,
1789             TERRESTRIAL_SURFACE_CONDITIONS_RESPONSE 112,
1790             COLLISION_DETECTION_SEGMENT_NOTIFICATION 113,
1791             COLLISION_DETECTION_VOLUME_NOTIFICATION 114,
1792             ANIMATION_STOP_NOTIFICATION 115,
1793             EVENT_NOTIFICATION 116,
1794             IMAGE_GENERATOR_MESSAGE 117,
1795              
1796             =item PixelRpMode
1797              
1798             None 0,
1799             Replicate1x2 1,
1800             Replicate2x1 2,
1801             Replicate2x2 3,
1802              
1803             =item Polarity
1804              
1805             WhiteHot 0,
1806             BlackHot 1,
1807              
1808             =item PositionCS
1809              
1810             GeodeticCS 0,
1811             ParentEntityCS 1,
1812             SubmodelCS 2,
1813              
1814             =item ProjectnTyp
1815              
1816             Perspective 0,
1817             OrthographicParallel 1,
1818              
1819             =item RateControlCoordinateSystem
1820              
1821             World_Parent 0,
1822             Local 1,
1823              
1824             =item RegionState
1825              
1826             Inactive 0,
1827             Active 1,
1828             Destroyed 2,
1829              
1830             =item ResponseTyp
1831              
1832             NormalSRT 0,
1833             ExtendedSRT 1,
1834              
1835             =item SensorOnOff
1836              
1837             Off 0,
1838             On 1,
1839              
1840             =item SensorStatus
1841              
1842             Searching 0,
1843             Tracking 1,
1844             ImpendingBreaklock 2,
1845             Breaklock 3,
1846              
1847             =item SourceType
1848              
1849             Symbol 0,
1850             SymbolTemplate 1,
1851              
1852             =item SurfaceState
1853              
1854             ActiveSS 0,
1855             DestroyedSS 1,
1856              
1857             =item SymbolAttribute
1858              
1859             None 0,
1860             SurfaceIdent 1,
1861             ParentSymbolIdent 2,
1862             Layer 3,
1863             FlashDutyCycle 4,
1864             FlashPeriod 5,
1865             PositionU 6,
1866             PositionV 7,
1867             Rotation 8,
1868             Color 9,
1869             ScaleU 10,
1870             ScaleV 11,
1871              
1872             =item SymbolState
1873              
1874             Hidden 0,
1875             Visible 1,
1876             Destroyed 2,
1877              
1878             =item TSCScope
1879              
1880             GlobalScope 0,
1881             RegionalScope 1,
1882             EntityScope 2,
1883              
1884             =item TextAlignment
1885              
1886             TopLeft 0,
1887             TopCenter 1,
1888             TopRight 2,
1889             CenterLeft 3,
1890             Center 4,
1891             CenterRight 5,
1892             BottomLeft 6,
1893             BottomCenter 7,
1894             BottomRight 8,
1895              
1896             =item TextDirection
1897              
1898             LeftToRight 0,
1899             TopToBottom 1,
1900             RightToLeft 2,
1901             BottomToTop 3,
1902              
1903             =item TrackMode
1904              
1905             Off 0,
1906             ForceCorrelate 1,
1907             Scene 2,
1908             Target 3,
1909             Ship 4,
1910             IGDefined3 5,
1911             IGDefined2 6,
1912             IGDefined1 7,
1913              
1914             =item TrackWhtBlk
1915              
1916             White 0,
1917             Black 1,
1918              
1919             =item Valid
1920              
1921             Invalid 0,
1922             Valid 1,
1923              
1924             =item ValidNot
1925              
1926             NotValid 0,
1927             Valid 1,
1928              
1929             =item ViewReorder
1930              
1931             NoReorder 0,
1932             BringToTop 1,
1933              
1934             =item VolumeType
1935              
1936             Sphere 0,
1937             Cuboid 1,
1938              
1939             =item VwGrpSelect
1940              
1941             View 0,
1942             ViewGroup 1,
1943              
1944             =item WaveScope
1945              
1946             GlobalScope 0,
1947             RegionalScope 1,
1948             EntityScope 2,
1949              
1950             =item WeatherLayer
1951              
1952             GroundFog 0,
1953             CloudLayer1 1,
1954             CloudLayer2 2,
1955             CloudLayer3 3,
1956             Rain 4,
1957             Snow 5,
1958             Sleet 6,
1959             Hail 7,
1960             Sand 8,
1961             Dust 9,
1962              
1963             =item WthrScope
1964              
1965             GlobalScope 0,
1966             RegionalScope 1,
1967             EntityScope 2,
1968              
1969             =cut
1970              
1971             #==============================================================================
1972              
1973             BEGIN {
1974 1     1   220 my %symbols = (
1975             # AnimationDirection
1976             'Forward' => 0,
1977             'Backward' => 1,
1978             # AnimationLoopMode
1979             'OneShot' => 0,
1980             'Continuous' => 1,
1981             # AnimationState
1982             'Stop' => 0,
1983             'Pause' => 1,
1984             'Play' => 2,
1985             'Continue' => 3,
1986             # AttachState
1987             'Detach' => 0,
1988             'Attach' => 1,
1989             # AttachType
1990             'EntityAT' => 0,
1991             'ViewAT' => 1,
1992             # Billboard
1993             'NonBillboard' => 0,
1994             'Billboard' => 1,
1995             # Boolean
1996             'False' => 0,
1997             'True' => 1,
1998             # BreakerType
1999             'Plunging' => 0,
2000             'Spilling' => 1,
2001             'Surging' => 2,
2002             # CloudType
2003             'None' => 0,
2004             'Altocumulus' => 1,
2005             'Altostratus' => 2,
2006             'Cirrocumulus' => 3,
2007             'Cirrostratus' => 4,
2008             'Cirrus' => 5,
2009             'Cumulonimbus' => 6,
2010             'Cumulus' => 7,
2011             'Nimbostratus' => 8,
2012             'Stratocumulus' => 9,
2013             'Stratus' => 10,
2014             'Other1' => 11,
2015             'Other2' => 12,
2016             'Other3' => 13,
2017             'Other4' => 14,
2018             'Other5' => 15,
2019             # CollisionType
2020             'CollisionNonEntity' => 0,
2021             'CollisionEntity' => 1,
2022             # ComponentClass
2023             'EntityCC' => 0,
2024             'ViewCC' => 1,
2025             'ViewGroupCC' => 2,
2026             'SensorCC' => 3,
2027             'RegionalSeaSurfaceCC' => 4,
2028             'RegionalTerrainSurfaceCC' => 5,
2029             'RegionalLayeredWeatherCC' => 6,
2030             'GlobalSeaSurfaceCC' => 7,
2031             'GlobalTerrainSurfaceCC' => 8,
2032             'GlobalLayeredWeatherCC' => 9,
2033             'AtmosphereCC' => 10,
2034             'CelestialSphereCC' => 11,
2035             'EventCC' => 12,
2036             'SystemCC' => 13,
2037             'SymbolSurfaceCC' => 14,
2038             'SymbolCC' => 15,
2039             # DOFSelect
2040             'NotUsed' => 0,
2041             'XOffset' => 1,
2042             'YOffset' => 2,
2043             'ZOffset' => 3,
2044             'Yaw' => 4,
2045             'Pitch' => 5,
2046             'Roll' => 6,
2047             # DrawingStyle
2048             'DrawingStyleLine' => 0,
2049             'DrawingStyleFill' => 1,
2050             # EarthReferenceModel
2051             'WGS84' => 0,
2052             'HostDefined' => 1,
2053             # Enable
2054             'Disable' => 0,
2055             'Enable' => 1,
2056             # Enabled
2057             'Disabled' => 0,
2058             'Enabled' => 1,
2059             # EntityState
2060             'EntityInactive' => 0,
2061             'EntityStandby' => 1,
2062             'EntityActive' => 1,
2063             'EntityDestroyed' => 2,
2064             # EnvironmentalConditionsResponseType
2065             'MaritimeSurfaceConditions' => 1,
2066             'TerrestrialSurfaceConditions' => 2,
2067             'WeatherConditions' => 4,
2068             'AerosolConcentrations' => 8,
2069             # FlashControl
2070             'ContinueFlash' => 0,
2071             'RestartFlash' => 1,
2072             # FontIdent
2073             'IGDefault' => 0,
2074             'ProportionalSansSerif' => 1,
2075             'ProportionalSanSerifBold' => 2,
2076             'ProportionalSansSerifItalic' => 3,
2077             'ProportionalSansSerifBoldItalic' => 4,
2078             'ProportionalSerif' => 5,
2079             'ProportionalSerifBold' => 6,
2080             'ProportionalSerifItalic' => 7,
2081             'ProportionalSerifBoldItalic' => 8,
2082             'MonospaceSansSerif' => 9,
2083             'MonospaceSansSerifBold' => 10,
2084             'MonospaceSansSerifItalic' => 11,
2085             'MonospaceSansSerifBoldItalic' => 12,
2086             'MonospaceSerif' => 13,
2087             'MonospaceSerifBold' => 14,
2088             'MonospaceSerifItalic' => 15,
2089             'MonospaceSerifBoldItalic' => 16,
2090             # GroundOceanClamp
2091             'NoClamp' => 0,
2092             'NonConformal' => 1,
2093             'Conformal' => 2,
2094             # HAT_HOT_CS
2095             'GeodeticCS' => 0,
2096             'EntityCS' => 1,
2097             # HAT_HOT_RST
2098             'HeightAboveTerrain' => 0,
2099             'HeightOfTerrain' => 1,
2100             # HAT_HOT_RT
2101             'HeightAboveTerrain' => 0,
2102             'HeightOfTerrain' => 1,
2103             'Extended' => 2,
2104             # IGMode
2105             'Reset' => 0,
2106             'Standby' => 0,
2107             'Operate' => 1,
2108             'Debug' => 2,
2109             'OfflineMaintenance' => 3,
2110             # Inherited
2111             'NotInherited' => 0,
2112             'Inherited' => 1,
2113             # LOS_CS
2114             'GeodeticCS' => 0,
2115             'EntityCS' => 1,
2116             # LOS_RT
2117             'BasicLOS' => 0,
2118             'ExtendedLOS' => 1,
2119             # LOS_Visible
2120             'Occluded' => 0,
2121             'Visible' => 1,
2122             # LinePrimitiveType
2123             'Point' => 0,
2124             'Line' => 1,
2125             'LineStrip' => 2,
2126             'LineLoop' => 3,
2127             'Triangle' => 4,
2128             'TriangleStrip' => 5,
2129             'TriangleFan' => 6,
2130             # MSCScope
2131             'GlobalScope' => 0,
2132             'RegionalScope' => 1,
2133             'EntityScope' => 2,
2134             # Merge
2135             'UseLast' => 0,
2136             'Merge' => 1,
2137             # MirrorMode
2138             'None' => 0,
2139             'Horizontal' => 1,
2140             'Vertical' => 2,
2141             'HorizontalAndVertical' => 3,
2142             # ObjectClass
2143             'EntityOC' => 0,
2144             'ArticulatedPartOC' => 1,
2145             'ViewOC' => 2,
2146             'ViewGroupOC' => 3,
2147             'MotionTrackerOC' => 4,
2148             # PacketType
2149             'IG_CONTROL' => 1,
2150             'ENTITY_CONTROL' => 2,
2151             'CONFORMAL_CLAMPED_ENTITY_CONTROL' => 3,
2152             'COMPONENT_CONTROL' => 4,
2153             'SHORT_COMPONENT_CONTROL' => 5,
2154             'ARTICULATED_PART_CONTROL' => 6,
2155             'SHORT_ARTICULATED_PART_CONTROL' => 7,
2156             'RATE_CONTROL' => 8,
2157             'CELESTIAL_SPHERE_CONTROL' => 9,
2158             'ATMOSPHERE_CONTROL' => 10,
2159             'ENVIRONMENTAL_REGION_CONTROL' => 11,
2160             'WEATHER_CONTROL' => 12,
2161             'MARITIME_SURFACE_CONDITIONS_CONTROL' => 13,
2162             'WAVE_CONTROL' => 14,
2163             'TERRESTRIAL_SURFACE_CONDITIONS_CONTROL' => 15,
2164             'VIEW_CONTROL' => 16,
2165             'SENSOR_CONTROL' => 17,
2166             'MOTION_TRACKER_CONTROL' => 18,
2167             'EARTH_REFERENCE_MODEL_DEFINITION' => 19,
2168             'TRAJECTORY_DEFINITION' => 20,
2169             'VIEW_DEFINITION' => 21,
2170             'COLLISION_DETECTION_SEGMENT_DEFINITION' => 22,
2171             'COLLISION_DETECTION_VOLUME_DEFINITION' => 23,
2172             'HAT_HOT_REQUEST' => 24,
2173             'LINE_OF_SIGHT_SEGMENT_REQUEST' => 25,
2174             'LINE_OF_SIGHT_VECTOR_REQUEST' => 26,
2175             'POSITION_REQUEST' => 27,
2176             'ENVIRONMENTAL_CONDITIONS_REQUEST' => 28,
2177             'SYMBOL_SURFACE_DEFINITION' => 29,
2178             'SYMBOL_TEXT_DEFINITION' => 30,
2179             'SYMBOL_CIRCLE_DEFINITION' => 31,
2180             'SYMBOL_LINE_DEFINITION' => 32,
2181             'SYMBOL_CLONE' => 33,
2182             'SYMBOL_CONTROL' => 34,
2183             'SHORT_SYMBOL_CONTROL' => 35,
2184             'START_OF_FRAME' => 101,
2185             'HAT_HOT_RESPONSE' => 102,
2186             'HAT_HOT_EXTENDED_RESPONSE' => 103,
2187             'LINE_OF_SIGHT_RESPONSE' => 104,
2188             'LINE_OF_SIGHT_EXTENDED_RESPONSE' => 105,
2189             'SENSOR_RESPONSE' => 106,
2190             'SENSOR_EXTENDED_RESPONSE' => 107,
2191             'POSITION_RESPONSE' => 108,
2192             'WEATHER_CONDITIONS_RESPONSE' => 109,
2193             'AEROSOL_CONCENTRATION_RESPONSE' => 110,
2194             'MARITIME_SURFACE_CONDITIONS_RESPONSE' => 111,
2195             'TERRESTRIAL_SURFACE_CONDITIONS_RESPONSE' => 112,
2196             'COLLISION_DETECTION_SEGMENT_NOTIFICATION' => 113,
2197             'COLLISION_DETECTION_VOLUME_NOTIFICATION' => 114,
2198             'ANIMATION_STOP_NOTIFICATION' => 115,
2199             'EVENT_NOTIFICATION' => 116,
2200             'IMAGE_GENERATOR_MESSAGE' => 117,
2201             # PixelRpMode
2202             'None' => 0,
2203             'Replicate1x2' => 1,
2204             'Replicate2x1' => 2,
2205             'Replicate2x2' => 3,
2206             # Polarity
2207             'WhiteHot' => 0,
2208             'BlackHot' => 1,
2209             # PositionCS
2210             'GeodeticCS' => 0,
2211             'ParentEntityCS' => 1,
2212             'SubmodelCS' => 2,
2213             # ProjectnTyp
2214             'Perspective' => 0,
2215             'OrthographicParallel' => 1,
2216             # RateControlCoordinateSystem
2217             'World_Parent' => 0,
2218             'Local' => 1,
2219             # RegionState
2220             'Inactive' => 0,
2221             'Active' => 1,
2222             'Destroyed' => 2,
2223             # ResponseTyp
2224             'NormalSRT' => 0,
2225             'ExtendedSRT' => 1,
2226             # SensorOnOff
2227             'Off' => 0,
2228             'On' => 1,
2229             # SensorStatus
2230             'Searching' => 0,
2231             'Tracking' => 1,
2232             'ImpendingBreaklock' => 2,
2233             'Breaklock' => 3,
2234             # SourceType
2235             'Symbol' => 0,
2236             'SymbolTemplate' => 1,
2237             # SurfaceState
2238             'ActiveSS' => 0,
2239             'DestroyedSS' => 1,
2240             # SymbolAttribute
2241             'None' => 0,
2242             'SurfaceIdent' => 1,
2243             'ParentSymbolIdent' => 2,
2244             'Layer' => 3,
2245             'FlashDutyCycle' => 4,
2246             'FlashPeriod' => 5,
2247             'PositionU' => 6,
2248             'PositionV' => 7,
2249             'Rotation' => 8,
2250             'Color' => 9,
2251             'ScaleU' => 10,
2252             'ScaleV' => 11,
2253             # SymbolState
2254             'Hidden' => 0,
2255             'Visible' => 1,
2256             'Destroyed' => 2,
2257             # TSCScope
2258             'GlobalScope' => 0,
2259             'RegionalScope' => 1,
2260             'EntityScope' => 2,
2261             # TextAlignment
2262             'TopLeft' => 0,
2263             'TopCenter' => 1,
2264             'TopRight' => 2,
2265             'CenterLeft' => 3,
2266             'Center' => 4,
2267             'CenterRight' => 5,
2268             'BottomLeft' => 6,
2269             'BottomCenter' => 7,
2270             'BottomRight' => 8,
2271             # TextDirection
2272             'LeftToRight' => 0,
2273             'TopToBottom' => 1,
2274             'RightToLeft' => 2,
2275             'BottomToTop' => 3,
2276             # TrackMode
2277             'Off' => 0,
2278             'ForceCorrelate' => 1,
2279             'Scene' => 2,
2280             'Target' => 3,
2281             'Ship' => 4,
2282             'IGDefined3' => 5,
2283             'IGDefined2' => 6,
2284             'IGDefined1' => 7,
2285             # TrackWhtBlk
2286             'White' => 0,
2287             'Black' => 1,
2288             # Valid
2289             'Invalid' => 0,
2290             'Valid' => 1,
2291             # ValidNot
2292             'NotValid' => 0,
2293             'Valid' => 1,
2294             # ViewReorder
2295             'NoReorder' => 0,
2296             'BringToTop' => 1,
2297             # VolumeType
2298             'Sphere' => 0,
2299             'Cuboid' => 1,
2300             # VwGrpSelect
2301             'View' => 0,
2302             'ViewGroup' => 1,
2303             # WaveScope
2304             'GlobalScope' => 0,
2305             'RegionalScope' => 1,
2306             'EntityScope' => 2,
2307             # WeatherLayer
2308             'GroundFog' => 0,
2309             'CloudLayer1' => 1,
2310             'CloudLayer2' => 2,
2311             'CloudLayer3' => 3,
2312             'Rain' => 4,
2313             'Snow' => 5,
2314             'Sleet' => 6,
2315             'Hail' => 7,
2316             'Sand' => 8,
2317             'Dust' => 9,
2318             # WthrScope
2319             'GlobalScope' => 0,
2320             'RegionalScope' => 1,
2321             'EntityScope' => 2,
2322             );
2323 1     1   15 no strict 'refs'; # Allow symbolic references
  1         2  
  1         101  
2324 1         181 for my $name (sort keys %symbols) {
2325 265         307 my $value = $symbols{$name};
2326 265     137   2137 *$name = sub { $value };
  137         1240  
2327             }
2328             }
2329             #==============================================================================
2330              
2331             =head1 SEE ALSO
2332              
2333             Refer the the Common Image Generator Interface ICD which may be had at this URL:
2334             L
2335              
2336             =head1 AUTHOR
2337              
2338             Brian M. Ames, Ebmames@apk.netE
2339              
2340             =head1 COPYRIGHT AND LICENSE
2341              
2342             Copyright (C) 2009 by Brian M. Ames
2343              
2344             This library is free software; you can redistribute it and/or modify
2345             it under the same terms as Perl itself, either Perl version 5.6 or,
2346             at your option, any later version of Perl 5 you may have available.
2347              
2348             =cut
2349              
2350             1;
2351             __END__