@@ -120,6 +120,8 @@ struct mbedit_ping_struct {
120120 int time_i [7 ];
121121 double time_d ;
122122 int multiplicity ;
123+ bool dualprofile ;
124+ int dualprofilebeam ;
123125 double time_interval ;
124126 double navlon ;
125127 double navlat ;
@@ -131,8 +133,6 @@ struct mbedit_ping_struct {
131133 double pitch ;
132134 double heave ;
133135 double distance ;
134- bool dualprofile ;
135- int dualprofilebeam ;
136136 int beams_bath ;
137137 char * beamflag ;
138138 char * beamflagorg ;
@@ -3940,11 +3940,15 @@ int mbedit_load_data(int buffer_size, int *nloaded, int *nbuffer, int *ngood, in
39403940 & ping [nbuff ].sensordepth , & ping [nbuff ].beams_bath , & namp , & nss , beamflag , bath , amp , bathacrosstrack ,
39413941 bathalongtrack , ss , ssacrosstrack , ssalongtrack , comment , & error );
39423942 if (error <= MB_ERROR_NO_ERROR && kind == MB_DATA_DATA ) {
3943+
3944+ /* get navigation */
39433945 if (nbuff > 0 )
39443946 ping [nbuff ].time_interval = ping [nbuff ].time_d - ping [nbuff - 1 ].time_d ;
39453947 status = mb_extract_nav (verbose , imbio_ptr , store_ptr , & kind , ping [nbuff ].time_i , & ping [nbuff ].time_d ,
39463948 & ping [nbuff ].navlon , & ping [nbuff ].navlat , & speed_nav , & ping [nbuff ].heading , & draft ,
39473949 & ping [nbuff ].roll , & ping [nbuff ].pitch , & ping [nbuff ].heave , & error );
3950+
3951+ /* check for ping multiplicity */
39483952 const int sensorhead_status = mb_sensorhead (verbose , imbio_ptr , store_ptr , & sensorhead , & sensorhead_error );
39493953 if (sensorhead_status == MB_SUCCESS ) {
39503954 ping [nbuff ].multiplicity = sensorhead ;
@@ -3960,6 +3964,8 @@ int mbedit_load_data(int buffer_size, int *nloaded, int *nbuffer, int *ngood, in
39603964 else
39613965 ping [nbuff ].distance = ping [nbuff - 1 ].distance + ping [nbuff ].speed * ping [nbuff ].time_interval / 3.6 ;
39623966 nbeams = ping [nbuff ].beams_bath ;
3967+
3968+ /* get detect status */
39633969 detect_status = mb_detects (verbose , imbio_ptr , store_ptr , & kind , & nbeams , detect , & detect_error );
39643970 if (detect_status != MB_SUCCESS ) {
39653971 status = MB_SUCCESS ;
@@ -4043,6 +4049,62 @@ int mbedit_load_data(int buffer_size, int *nloaded, int *nbuffer, int *ngood, in
40434049 ping [nbuff ].bath_x [i ] = 0 ;
40444050 ping [nbuff ].bath_y [i ] = 0 ;
40454051 }
4052+
4053+ /* check if this is a dual profile (e.g. Kongsberg dual swath) */
4054+ double xtrack_min = 0.0 ;
4055+ double xtrack_max = 0.0 ;
4056+ double xtrack_absmax = 0.0 ;
4057+ bool first = true;
4058+ for (int i = 0 ; i < ping [nbuff ].beams_bath ; i ++ ) {
4059+ if (mb_beam_ok (ping [nbuff ].beamflag [i ])) {
4060+ if (first ) {
4061+ xtrack_min = ping [nbuff ].bathacrosstrack [i ];
4062+ xtrack_max = ping [nbuff ].bathacrosstrack [i ];
4063+ first = false;
4064+ }
4065+ else {
4066+ xtrack_min = MIN (xtrack_min , ping [nbuff ].bathacrosstrack [i ]);
4067+ xtrack_max = MAX (xtrack_max , ping [nbuff ].bathacrosstrack [i ]);
4068+ }
4069+ }
4070+ }
4071+ if (first ) {
4072+ for (int i = 0 ; i < ping [nbuff ].beams_bath ; i ++ ) {
4073+ if (!mb_beam_ok (ping [nbuff ].beamflag [i ])
4074+ && !mb_beam_check_flag_unusable2 (ping [nbuff ].beamflag [i ])) {
4075+ if (first ) {
4076+ xtrack_min = ping [nbuff ].bathacrosstrack [i ];
4077+ xtrack_max = ping [nbuff ].bathacrosstrack [i ];
4078+ first = false;
4079+ }
4080+ else {
4081+ xtrack_min = MIN (xtrack_min , ping [nbuff ].bathacrosstrack [i ]);
4082+ xtrack_max = MAX (xtrack_max , ping [nbuff ].bathacrosstrack [i ]);
4083+ }
4084+ }
4085+ }
4086+ }
4087+ xtrack_absmax = MAX (fabs (xtrack_min ), fabs (xtrack_max ));
4088+ ping [nbuff ].dualprofile = false;
4089+ ping [nbuff ].dualprofilebeam = 0 ;
4090+ first = true;
4091+ double xtrack_old = 0.0 ;
4092+ for (int i = 0 ; i < ping [nbuff ].beams_bath ; i ++ ) {
4093+ if (!mb_beam_check_flag_unusable2 (ping [nbuff ].beamflag [i ])) {
4094+ if (first ) {
4095+ xtrack_old = ping [nbuff ].bathacrosstrack [i ];
4096+ first = false;
4097+ }
4098+ else {
4099+ double xtrack_diff = ping [nbuff ].bathacrosstrack [i ] - xtrack_old ;
4100+ if (xtrack_diff < 0.0 && fabs (xtrack_diff ) > 0.5 * xtrack_absmax ) {
4101+ ping [nbuff ].dualprofile = true;
4102+ ping [nbuff ].dualprofilebeam = i ;
4103+ }
4104+ xtrack_old = ping [nbuff ].bathacrosstrack [i ];
4105+ }
4106+ }
4107+ }
40464108 }
40474109 if (status == MB_SUCCESS ) {
40484110 nbuff ++ ;
@@ -4207,7 +4269,7 @@ int mbedit_plot_all(int plwd, int exgr, int xntrvl, int yntrvl, int plt_size,
42074269 show_time = sh_time ,
42084270
42094271 /* figure out which pings to plot */
4210- plot_size = plt_size ;
4272+ plot_size = plt_size ;
42114273 if (current_id + plot_size > nbuff )
42124274 nplot = nbuff - current_id ;
42134275 else
@@ -4265,30 +4327,6 @@ int mbedit_plot_all(int plwd, int exgr, int xntrvl, int yntrvl, int plt_size,
42654327 bathmedian = bathlist [nbathlist / 2 ];
42664328 }
42674329
4268- /* check for dual profile condition */
4269- for (int i = current_id ; i < current_id + nplot ; i ++ ) {
4270- ping [i ].dualprofile = false;
4271- ping [i ].dualprofilebeam = 0 ;
4272- bool first = true;
4273- double xtrack_old = 0.0 ;
4274- for (int j = 0 ; j < ping [i ].beams_bath ; j ++ ) {
4275- if (!mb_beam_check_flag_unusable2 (ping [i ].beamflag [j ])) {
4276- if (first ) {
4277- xtrack_old = ping [i ].bathacrosstrack [j ];
4278- first = false;
4279- }
4280- else {
4281- double xtrack_diff = ping [i ].bathacrosstrack [j ] - xtrack_old ;
4282- if (xtrack_diff < 0.0 && fabs (xtrack_diff ) > 0.5 * xtrack_absmax ) {
4283- ping [i ].dualprofile = true;
4284- ping [i ].dualprofilebeam = j ;
4285- }
4286- xtrack_old = ping [i ].bathacrosstrack [j ];
4287- }
4288- }
4289- }
4290- }
4291-
42924330 /* reset xtrack_absmax if required */
42934331 if (autoscale && xtrack_absmax < 0.5 ) {
42944332 xtrack_absmax = 1000.0 ;
@@ -4380,6 +4418,19 @@ int mbedit_plot_all(int plwd, int exgr, int xntrvl, int yntrvl, int plt_size,
43804418 int sdescent ;
43814419 int sxstart ;
43824420
4421+ if (ping [current_id ].dualprofile ) {
4422+ sprintf (string , "Dual Swath per Ping" );
4423+ xg_justify (mbedit_xgid , string , & swidth , & sascent , & sdescent );
4424+ xg_drawstring (mbedit_xgid , xcen - swidth / 2 , ymin - margin / 2 - sdescent + 5 , string , pixel_values [BLACK ],
4425+ XG_SOLIDLINE );
4426+ }
4427+ else {
4428+ sprintf (string , "Single Swath per Ping" );
4429+ xg_justify (mbedit_xgid , string , & swidth , & sascent , & sdescent );
4430+ xg_drawstring (mbedit_xgid , xcen - swidth / 2 , ymin - margin / 2 - sdescent + 5 , string , pixel_values [BLACK ],
4431+ XG_SOLIDLINE );
4432+ }
4433+
43834434 if (sh_mode == MBEDIT_SHOW_FLAG ) {
43844435 sprintf (string , "Sounding Colors by Flagging: Unflagged Manual Filter Sonar" );
43854436 xg_justify (mbedit_xgid , string , & swidth , & sascent , & sdescent );
@@ -4609,7 +4660,17 @@ int mbedit_plot_all(int plwd, int exgr, int xntrvl, int yntrvl, int plt_size,
46094660 ping [i ].label_y = y ;
46104661 for (int j = 0 ; j < ping [i ].beams_bath ; j ++ ) {
46114662 if (!mb_beam_check_flag_unusable2 (ping [i ].beamflag [j ])) {
4612- if (view_mode == MBEDIT_VIEW_WATERFALL ) {
4663+ if (view_mode == MBEDIT_VIEW_WATERFALL && ping [i ].dualprofile ) {
4664+ ping [i ].bath_x [j ] = (int )(xcen + dxscale * ping [i ].bathacrosstrack [j ]);
4665+ ping [i ].bath_y [j ] = (int )(y + dyscale * ((double )ping [i ].bath [j ] - bathmedian ));
4666+ if (j < ping [i ].dualprofilebeam ) {
4667+ ping [i ].bath_y [j ] -= (int )(dy /4 );
4668+ }
4669+ else {
4670+ ping [i ].bath_y [j ] += (int )(dy /4 );
4671+ }
4672+ }
4673+ else if (view_mode == MBEDIT_VIEW_WATERFALL ) {
46134674 ping [i ].bath_x [j ] = (int )(xcen + dxscale * ping [i ].bathacrosstrack [j ]);
46144675 ping [i ].bath_y [j ] = (int )(y + dyscale * ((double )ping [i ].bath [j ] - bathmedian ));
46154676 }
0 commit comments