MODULE ofm$pico_statistics;
?? RIGHT := 110 ??

{ PURPOSE:
{   Display the Pico Statistics

?? NEWTITLE := 'Global Declarations Referenced By This Module', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc oss$job_paged_literal
*copyc oss$task_shared
*copyc amt$local_file_name
*copyc dpt$window_id
*copyc ost$halfword
*copyc ost$name
*copyc ost$status
?? POP ??
*copyc clp$close_display
*copyc clp$convert_integer_to_rjstring
*copyc clp$put_display
*copyc clp$trimmed_string_size
*copyc cmp$get_element_name_via_lun
*copyc dpp$clear_window
*copyc dpp$put_next_line
*copyc ofp$build_system_line
*copyc ofp$open_display
*copyc osp$disestablish_cond_handler
*copyc osp$establish_block_exit_hndlr
*copyc iov$disk_pp_usage_p
*copyc osv$task_shared_heap

  PROCEDURE [XREF] iop$get_pico_statistics
    (VAR accept_pico_statistics: boolean;
     VAR pico_statistics_call_count: integer;
     VAR pico_statistics_skip_count: integer;
     VAR pico_unsolicited_msg_count: integer);

?? OLDTITLE ??
?? NEWTITLE := '[xdcl] OFP$PICO_STATISTICS', EJECT ??

  PROCEDURE [XDCL] ofp$pico_statistics
    (    wid: dpt$window_id;
         display_name: ost$name;
         file_name: amt$local_file_name;
         initial_call: boolean;
     VAR status: ost$status);

    CONST
      c$displayed_element_name_size = 11;

    TYPE
      t$element_name = string (c$displayed_element_name_size);

    VAR
      v$title: [READ, oss$job_paged_literal] string (15) := 'PICO Statistics',
      v$title1: [READ, oss$job_paged_literal] string (77) :=
            ' IOU  Channel Equipment     Name SA BusCnt    RSR WTrCom FncTim Resync Parity',
      v$title2: [READ, oss$job_paged_literal] string (77) :=
            ' ----------------------------------------------------------------------------',
      v$port: [READ, oss$job_paged_literal] array [0 .. 1] of char := ['A', 'B'];

    VAR
      previous_data_for_display: [STATIC, oss$task_shared] boolean := FALSE,
      system_line_info: [STATIC, oss$task_shared] ^oft$system_line_info := NIL;

    VAR
      channel_name: string (6),
      display_control: clt$display_control,
      element_name: t$element_name,
      equipment: integer,
      equipment_name: string (6),
      iou_name: string (4),
      local_status: ost$status,
      pico_usage_p: ^iot$pico_usage,
      port: integer,
      pp: integer,
      str: string (80),
      str_length: integer,
      title_displayed: boolean;

    VAR
      accept_pico_statistics: boolean,
      pico_statistics_call_count: integer,
      pico_statistics_skip_count: integer,
      pico_unsolicited_msg_count: integer;

?? NEWTITLE := 'P$ABORT_HANDLER', EJECT ??

    PROCEDURE p$abort_handler
      (    condition: pmt$condition;
           condition_information: ^pmt$condition_information;
           save_area: ^ost$stack_frame_save_area;
       VAR handler_status: ost$status);

      VAR
        ignore_status: ost$status;

      IF wid = 0 THEN
        clp$close_display (display_control, ignore_status);
      IFEND;

    PROCEND p$abort_handler;
?? OLDTITLE ??
?? NEWTITLE := 'P$GET_ELEMENT_NAME', EJECT ??

    PROCEDURE p$get_element_name
      (    logical_unit_number: iot$logical_unit;
       VAR element_name: t$element_name);

      VAR
        i_element_name: ost$name,
        i_element_name_size: integer,
        local_status: ost$status;

      element_name := '';
      cmp$get_element_name_via_lun (logical_unit_number, i_element_name, local_status);
      IF local_status.normal THEN
        i_element_name_size := clp$trimmed_string_size (i_element_name);
        IF i_element_name_size > c$displayed_element_name_size THEN
          i_element_name_size := c$displayed_element_name_size;
        IFEND;
        element_name (c$displayed_element_name_size + 1 - i_element_name_size,
              i_element_name_size) := i_element_name;
      IFEND;

    PROCEND p$get_element_name;
?? OLDTITLE ??
?? NEWTITLE := '[inline] P$PUT_LINE', EJECT ??

    PROCEDURE [INLINE] p$put_line
      (    str: string ( * <= 80));

      VAR
        status: ost$status;

      IF wid <> 0 THEN
        dpp$put_next_line (wid, str, status);
      ELSE
        clp$put_display (display_control, str, clc$trim, status);
      IFEND;

    PROCEND p$put_line;
?? OLDTITLE ??
?? EJECT ??

    status.normal := TRUE;
    title_displayed := FALSE;

    IF wid = 0 THEN
      osp$establish_block_exit_hndlr (^p$abort_handler);
    IFEND;
    IF initial_call THEN
      ofp$open_display (file_name, wid, dpc$wc_sharing, dpc$wk_table, v$title, display_control, status);
      IF NOT status.normal THEN
        RETURN; {----->
      IFEND;
    IFEND;

{ Establish base values for the display if they do not already exist.
    IF NOT previous_data_for_display THEN
      ALLOCATE system_line_info IN osv$task_shared_heap^;
      system_line_info^.initialized := FALSE;
      previous_data_for_display := TRUE;
    IFEND;

    ofp$build_system_line (system_line_info^, str);
    IF wid <> 0 THEN
      dpp$clear_window (wid, status);
    IFEND;

    p$put_line (str);
    p$put_line ('');

    iop$get_pico_statistics (accept_pico_statistics, pico_statistics_call_count, pico_statistics_skip_count,
          pico_unsolicited_msg_count);

    STRINGREP (str, str_length, ' Accept PICO Statistics         : ', accept_pico_statistics);
    p$put_line (str (1, str_length));
    STRINGREP (str, str_length, ' PICO Statistics Call Count     : ', pico_statistics_call_count);
    p$put_line (str (1, str_length));
    STRINGREP (str, str_length, ' PICO Statistics Skip Count     : ', pico_statistics_skip_count);
    p$put_line (str (1, str_length));
    STRINGREP (str, str_length, ' PICO Unsolicited Message Count : ', pico_unsolicited_msg_count);
    p$put_line (str (1, str_length));
    p$put_line ('');

    IF iov$disk_pp_usage_p <> NIL THEN

    /pp_loop/
      FOR pp := 1 TO UPPERBOUND (iov$disk_pp_usage_p^) DO
        IF iov$disk_pp_usage_p^ [pp] = NIL THEN
          CYCLE /pp_loop/; {----->
        IFEND;


        IF iov$disk_pp_usage_p^ [pp]^.iou_number = 0 THEN
          iou_name := 'IOU0';
        ELSE
          iou_name := 'IOU1';
        IFEND;

        FOR port := 0 TO 1 DO
          FOR equipment := 0 TO 7 DO
            IF iov$disk_pp_usage_p^ [pp]^.path_usage [port] [equipment].path_configured THEN
              pico_usage_p := iov$disk_pp_usage_p^ [pp]^.path_usage [port] [equipment].pico_usage_p;
              IF pico_usage_p <> NIL THEN
                IF NOT title_displayed THEN
                  p$put_line (v$title1);
                  p$put_line (v$title2);
                  title_displayed := TRUE;
                IFEND;

                p$get_element_name (iov$disk_pp_usage_p^ [pp]^.path_usage [port] [equipment].logical_unit,
                      element_name);

                clp$convert_integer_to_rjstring (iov$disk_pp_usage_p^ [pp]^.channel.number, 10, FALSE, '0',
                      channel_name (1, 5), local_status);
                IF NOT local_status.normal THEN
                  channel_name := '';
                ELSEIF iov$disk_pp_usage_p^ [pp]^.channel.concurrent THEN
                  channel_name (1, 3) := 'CCH';
                  IF iov$disk_pp_usage_p^ [pp]^.channel.port <> cmc$unspecified_port THEN
                    channel_name (6) := v$port [port];
                  IFEND;
                ELSE
                  channel_name (1, 3) := ' CH';
                IFEND;

                CASE iov$disk_pp_usage_p^ [pp]^.path_usage [port] [equipment].path_type OF
                = cmc$msntdc_1 =
                  equipment_name := 'NTDC_1';
                = cmc$msntdc_2 =
                  equipment_name := 'NTDC_2';
                ELSE
                  equipment_name := '';
                CASEND;
                STRINGREP (str, str_length, ' ', iou_name, ' ', channel_name, '  ', equipment_name, ' ',
                      element_name, ' ', equipment: 2, ' ', pico_usage_p^.bus_control_error_count: 6, ' ',
                      pico_usage_p^.retry_reject_count: 6, ' ', pico_usage_p^.
                      transfer_complete_reject_count: 6, ' ', pico_usage_p^.error_flag_encountered_count: 6,
                      ' ', pico_usage_p^.resync_count: 6, ' ', pico_usage_p^.parity_count: 6);

                p$put_line (str (1, str_length));
              IFEND;
            IFEND;
          FOREND;
        FOREND;
      FOREND /pp_loop/;
    IFEND;

    IF NOT title_displayed THEN
      p$put_line (' No Pico Statistics to display.');
    IFEND;

    IF wid = 0 THEN
      clp$close_display (display_control, status);
      osp$disestablish_cond_handler;
    IFEND;

  PROCEND ofp$pico_statistics;
?? OLDTITLE ??
MODEND ofm$pico_statistics;
