'+------------------------------------------------------------------------------+
'|                                                                              |
'|  ASPAC消費財卸　ハンディオプション                                           |
'|      ﾌﾟﾛｸﾞﾗﾑ     ：      入荷・棚番ラベル印刷処理                            |
'|      ﾌﾟﾛｸﾞﾗﾑ ID  ：      TecLabel.SRC                                        |
'|      作成者      ：      TAKAYA.Terachi                                      |
'|      作成日      ：      2004.09.28                                          |
'|      ﾊﾞｰｼﾞｮﾝ     ：      V01L01                                              |
'+------------------------------------------------------------------------------+
'|                                                                              |
'|      ﾊﾞｰｼﾞｮﾝ     ：      V4.2.2                                              |
'|        修正日    ：      2005.08.18  ASCOT)kakihana                          |
'|          ・短縮ＪＡＮが印字できない                      V4-№0091           |
'|                                                                              |
'+------------------------------------------------------------------------------+

'==============================================================='
'       ［　印刷時初期処理　］
'   印刷制御を開始する前にエリア定義とシステム値を設定する
'==============================================================='
Ir.settei
'---------------------------------------------------------------'
'       エリア定義
'---------------------------------------------------------------'
    DEFREG  Cmd.data$[255],work$[255],sbuf$[255],rbuf$[255],pack$[255]
    DEFREG  ans$[1],Prt.msg$[40],Prt.sta$[1],Bat.sta$[1]
    DEFREG  rcrc$[2]

    DIM sline$[254]

    DEFREG IDmh$,IDml$,IDsh$,IDsl$
    DEFREG cmdcnt9 ,data.cnt9 
    DEFREG cmd.len9 ,cmd.len1$
    DEFREG Prt.flg9 ,Pack.flg$
    DEFREG crc$,crc.err9 
    DEFREG rtime9 
    DEFREG mode$
    DEFREG K$

    DEFREG NUL$,ENQ$,ACK$,DLE$,NAK$,ESC$,LF$,PAD$

    NUL$ = chr$( &h00 ): SOH$ = chr$( &h01 ): STX$ = chr$( &h02 )
    ETX$ = chr$( &h03 ): EOT$ = chr$( &h04 ): ENQ$ = chr$( &h05 )
    ACK$ = chr$( &h06 ): DLE$ = chr$( &h10 ): NAK$ = chr$( &h15 )
    ESC$ = chr$( &h1b ): LF$  = chr$( &h0A ): PAD$ = chr$( &hFF )

'---------------------------------------------------------------'
'       システム初期値設定
'---------------------------------------------------------------'
'   out &h6060,&h02                         ' BHT-Irプロトコル

    DEFREG  char$  = ""                     ' 受信文字
    DEFREG  count9 = 0                      ' 実行件数（回数）
    DEFREG  state9 = 0                      ' エラー発生コード
    DEFREG  stage9 = 0                      ' フェーズ移行値
    DEFREG  REcnt9 = 120                    ' ENQリトライ回数

'  >>*  Ｉｒ－ＤＡ通信速度設定　*<<
'   システム設定スピードで通信の場合
'*  gosub s.sysset
'*  OPEN comport$ AS #prt9 

'   固定スピードで通信の場合
    DEFREG  SPD$ = "2"                      ' 通信速度：19200bsp
    select  SPD$
        case    "1"
            OPEN "COM:9600,N,8,1" AS #prt9 
        case    "2"
            OPEN "COM:19200,N,8,1" AS #prt9 
        case    "3"
            OPEN "COM:38400,N,8,1" AS #prt9 
        case    else
            OPEN "COM:9600,N,8,1" AS #prt9 
    end select

    return

'****************************************************************
'*      印刷実行メイン処理              *
'****************************************************************

Lblprt

    gosub s.sysopen2
    get #sysmst29 ,1
    close #sysmst29 

    select LabelC$
        case "NL"
            if ((val(p.bsuryo$)<>0) and (shtbara$<>""))or((val(p.csuryo$)<>0) and (shtcase$<>"")) then
                if p.jancod$ <> "" and sysnyprt$ = "1" then
                    GOSUB Ir.Labl00
                endif
            endif
        case "TL"
            if ((LABELT$="LB") and (shtbara$<>"")) or ((LABELT$ = "LC") and (shtcase$<>"")) then
                if p.jancod$ <> "" and systaprt$ = "1" then
                    GOSUB Ir.Labl00
                endif
            endif
        case else
    end select

    ClOSE #prt9 
    Return


'****************************************************************
'*      発行シーケンス(LABELﾓｰﾄﾞ)           *
'****************************************************************
Ir.Labl00

    gosub Ir.settei                         ' 印刷変数設定

    cls
    locate  1,1 : print " LABELモード   " ;
    gosub   Ir.link                         ' リンク

    if state9 = 0 then
        gosub   Ir.lablini                  ' 初期設定
    endif

    if LABELC$ = "NL" then
        LABELT$ = ""
        if state9 = 0 then
            if (shtcase$ <> "") and (val(p.csuryo$) <> 0) then  ' ケース
                LABELT$ = "LC"
                gosub   Shk.Write
                gosub   Ir.lablprn          ' 印刷実行
            endif
        endif
        if state9 = 0 then
            if (shtbara$ <> "") and (val(p.bsuryo$) <> 0) then  ' バラ
                if LABELT$ = "LC" then
                    locate 1,3 :print "  HIT ENT KEY   "
                    gosub kywait
                endif
                LABELT$ = "LB"
                gosub   Shk.Write
                gosub   Ir.lablprn          ' 印刷実行
            endif
        endif
    end if
    if LABELC$ = "TL" then
        if state9 = 0 then
            gosub   Shk.Write
            gosub   Ir.lablprn              ' 印刷実行
        endif
    endif

    return

'==============================================================='
'       サブルーチンプログラム
'==============================================================='

'---------------------------------------------------------------'
'       ビットマップ文字列フィールドコマンド
'       （ＬＡＢＥＬフィールド）
'   ESC+"PC"+aa+";"+bbbb+","+cccc+","+d+","+e+","+f+","+
'        gg+","+h+","+ii+","+j+","+k+(","+PI+)0Ah+00h
'       aa:　文字列フィールドNo.(00～99の連番)
'       bbbb:文字列の基点Ｘ座標(４桁0.1mm単位)
'       cccc:文字列の基点Ｙ座標(４桁0.1mm単位)
'       d   :文字の横倍率(パラメータ1～8)
'               1:0.5 2:1.0 3:1.5 4:2.0 5:2.5 6:3.0 7:3.5 8:4.0 (単位:倍)
'       e   :文字の縦倍率(パラメータ1～8)
'               1:0.5 2:1.0 3:1.5 4:2.0 5:2.5 6:3.0 7:3.5 8:4.0 (単位:倍)
'       f   :フォント種類(パラメータA～P)
'               A:標準文字(12×24ﾄﾞｯﾄ)
'               B:ﾎﾞﾙﾄﾞ文字(48×96ﾄﾞｯﾄ)
'               C:漢字/外字(24×24ﾄﾞｯﾄ)
'               D:価格文字１(16×40ﾄﾞｯﾄ)
'               E:価格文字２(32×48ﾄﾞｯﾄ)
'               F:ﾀｲﾑｽﾛｰﾏﾝ(21ﾎﾟｲﾝﾄ)
'               G:ﾍﾙﾍﾞﾁｶ(18ﾎﾟｲﾝﾄ)
'               H:ﾚﾀｰｺﾞｼｯｸ(14.3ﾎﾟｲﾝﾄ)
'               I:ｸｰﾘｴ(15ﾎﾟｲﾝﾄ)
'               J:ﾌﾟﾚｾﾞﾝﾃｰｼｮﾝ(27ﾎﾟｲﾝﾄ)
'               O:ｺﾞｼｯｸ725ﾌﾞﾗｯｸ(6ﾎﾟｲﾝﾄ)
'               P:漢字/外字(16×16ﾄﾞｯﾄ)
'       gg  :文字の回転方向(パラメータ00～03)
'               00:回転0°01:90°02:180°03:270°
'       h   :文字背景指定(B固定値：黒文字)
'       ii  :データレングス(00～99)         　(注１)
'       j   :データコード(1:JIS8 2:ﾊﾟｯｸﾄﾞBCD)
'       k   :固定データ番号(0固定値)
'       PI  :印字位置(省略可)
'               0:左寄せ 1:中央寄せ 2:右寄せ
'       (印字１行分は約４ｍｍ)
'   ------------------------------------------------    '
'       バーコードフォーマットコマンド（ＪＡＮ）
'       （ＬＡＢＥＬフィールド）
'   ESC+"XB"+aa+";"+bbbb+","+cccc+","+d+","+e+","+ff+","+g+
'        ","+hhhh+","+iii+","+j+","+kk+","+l+","+m+0Ah+00h
'       aa:　バーコードフィールドNo.(00～99)
'       bbbb:文字列の基点Ｘ座標(４桁0.1mm単位)
'       cccc:文字列の基点Ｙ座標(４桁0.1mm単位)
'       d   :バーコード種類(0,5)
'               0:JAN-8/EAN-8
'               5:JAN-13/EAN-13
'       e   :チェックデジットの種類(3:固定値･自動付加)
'       ff  :１モジュール幅の指定(02～03、1ﾄﾞｯﾄ単位)
'       g   :バーコードの回転方向(パラメータ0～3)
'               00:回転0°01:90°02:180°03:270°
'       hhhh:バーコードの高さ(0001～0350、0.1mm単位)
'       iii :ガードバーの長さ(000～050、0.1mm単位)
'       j   :バー下数字印字指定(0:無し 1:有り)
'       kk  :データレングス
'               07:JAN-8/EAN-8
'               12:JAN-13/EAN-13
'               00:(注２)
'       l   :データコード(1:JIS8 2:ﾊﾟｯｸﾄﾞBCD)
'       m   :固定データ番号(0固定値)
'(注１)：00の時は、ﾃﾞｰﾀ印字ｺﾏﾝﾄﾞで送信された分
'       (JIS8:[LF] ﾊﾟｯｸﾄﾞBCD:"F"区切りまで)のLengthになる
'(注２)：ﾃﾞｰﾀﾚﾝｸﾞｽに00をセットした場合は印字ｺﾏﾝﾄﾞに区切ｺｰﾄﾞLF
'       を付加する、00以外をセットした場合は印字ｺﾏﾝﾄﾞに指定した
'       長さのデータをセットしLFは付加しない事。
'---------------------------------------------------------------'
Ir.lablfld                          '入荷・棚番ラベル用フォーム
    Cmd.data$ =           ESC$+"PC00;0020,0070,4,5,A,00,B,00,1,0"+LF$+NUL$
    Cmd.data$ = Cmd.data$+ESC$+"PC01;0020,0115,2,3,A,00,B,00,1,0"+LF$+NUL$
    Cmd.data$ = Cmd.data$+ESC$+"PC02;0020,0170,2,3,C,00,B,00,1,0"+LF$+NUL$
    Cmd.data$ = Cmd.data$+ESC$+"PC03;0260,0170,2,4,C,00,B,00,1,0"+LF$+NUL$
    Cmd.data$ = Cmd.data$+ESC$+"PC04;0020,0220,2,3,C,00,B,00,1,0"+LF$+NUL$

'▼ 消費財卸V4      2005/08/18 kakihana (S)     ・短縮ＪＡＮが印字できない                      V4-№0091
'===Cmd.data$ = Cmd.data$+ESC$+"XB05;0130,0225,5,3,02,0,0050,030,1,12,1,0"+LF$+NUL$ ' バーコード
  '▽ 2005.08.04 ARAI 短縮JANの印刷も可能にするための対応(STR)
    if  len(p.jancod$) = 13 then
        Cmd.data$ = Cmd.data$+ESC$+"XB05;0130,0225,5,3,02,0,0050,030,1,12,1,0"+LF$+NUL$ ' バーコード
    else
        Cmd.data$ = Cmd.data$+ESC$+"XB05;0130,0225,0,3,02,0,0050,030,1,07,1,0"+LF$+NUL$ ' バーコード
    end if
  '△ 2005.08.04 ARAI 短縮JANの印刷も可能にするための対応(END)
'▲ 消費財卸V4      2005/08/18 kakihana (E)

    gosub   Lab.cmdsnd
    return

'---------------------------------------------------------------'
'       データ印字コマンド（ＬＡＢＥＬモード）
'       (Ｉｒｄａ：ＴＥＣ Ｐｒｏｔｏｃｏｌの場合）
'   "X"+abc+ddd,,,eee,,,nnn,,,+(0Ah)          (注３)
'       a:フォーム番号(01h～14h)                '
'       b:センサー指定及び発行終了のACK/ｽﾃｰﾀｽ送信
'         00h:透過センサー指定、ACK/ｽﾃｰﾀｽ送信なし
'         01h:透過センサー指定、ACK/ｽﾃｰﾀｽ送信有り
'         10h:反射センサー指定、ACK/ｽﾃｰﾀｽ送信なし
'         11h:反射センサー指定、ACK/ｽﾃｰﾀｽ送信有り
'         20h:センサー指定なし、ACK/ｽﾃｰﾀｽ送信なし
'         21h:センサー指定なし、ACK/ｽﾃｰﾀｽ送信有り
'       c:発行枚数(01h～FFh,1～255枚)
'       ddd,,,:フィールド番号00のデータ
'       eee,,,:フィールド番号01のデータ
'       nnn,,,:フィールド番号nnのデータ
'(注３)：フィールド書式登録でデータ長を指定した場合は各フォーム
'    毎の区切コードLFは付加しない事。
'---------------------------------------------------------------'
Ir.lbprin
    Cmd.data$ = "X"+chr$(&h01)+chr$(&h11)+chr$(&h01)+sbuf$
    gosub   Lab.cmdsnd
    return


'=============  印刷レイアウト定義  =================================
Labldata1                           '入荷ラベル用データ書込み

    if LABELT$ = "LC" then                  'ｹｰｽﾛｹｰｼｮﾝのｾｯﾄ
        sline$ = MID$(shtcase$,1,2)
        if MID$(shtcase$,3,7) <> "" then
            if MID$(shtcase$,3,2) <> "" then
                sline$ = sline$+"-"+MID$(shtcase$,3,2)
            else
                sline$ = sline$+"- "
            endif
        else
            sline$ = sline$+"   "
        endif
        if MID$(shtcase$,5,5) <> "" then
            if MID$(shtcase$,5,2) <> "" then
                sline$ = sline$+"-"+MID$(shtcase$,5,2)
            else
                sline$ = sline$+"- "
            endif
        else
            sline$ = sline$+"  　"
        endif
        if MID$(shtcase$,7,3) <> "" then
            sline$ = sline$+"-"+MID$(shtcase$,7,3)
        else
            sline$ = sline$+" 　"
        endif
        sline$ = sline$+" "+p.overf$
    end if
    if LABELT$ = "LB" then                  'ﾊﾞﾗﾛｹｰｼｮﾝのｾｯﾄ
        sline$ = MID$(shtbara$,1,2)
        if MID$(shtbara$,3,7) <> "" then
            if MID$(shtbara$,3,2) <> "" then
                sline$ = sline$+"-"+MID$(shtbara$,3,2)
            else
                sline$ = sline$+"- "
            endif
        else
            sline$ = sline$+"   "
        endif
        if MID$(shtbara$,5,5) <> "" then
            if MID$(shtbara$,5,2) <> "" then
                sline$ = sline$+"-"+MID$(shtbara$,5,2)
            else
                sline$ = sline$+"- "
            endif
        else
            sline$ = sline$+"  　"
        endif
        if MID$(shtbara$,7,3) <> "" then
            sline$ = sline$+"-"+MID$(shtbara$,7,3)
        else
            sline$ = sline$+" 　"
        endif
        sline$ = sline$+" "+p.overf$
    end if
    put     #prtwk9 ,i
    i=i+1

    sline$ = p.syhmei$
    put     #prtwk9 ,i
    i=i+1

    if LABELC$ = "NL" then
        if LABELT$ = "LC" then
            sline$ = " "+p.toksho$+"     数量             ケース"
            put     #prtwk9 ,i
            i=i+1
            sline$ = p.csuryo$
        end if
        if LABELT$ = "LB" then
            sline$ = " "+p.toksho$+"     数量             バラ  "
            put     #prtwk9 ,i
            i=i+1
            sline$ = p.bsuryo$
        end if
    end if
    if LABELC$ = "TL" then
        if LABELT$ = "LC" then
            sline$ = "                        ケース"
            put     #prtwk9 ,i
            i=i+1
            sline$ = " "
        end if
        if LABELT$ = "LB" then
            sline$ = "                        バラ  "
            put     #prtwk9 ,i
            i=i+1
            sline$ = " "
        end if
    end if
    put     #prtwk9 ,i
    i=i+1

    if LABELC$ = "NL" then
        sline$ = "入荷日 "+date$+"    入数("+p.iri$+")"
    end if
    if LABELC$ = "TL" then
        sline$ = "                   入数("+p.iri$+")"
    end if
    put     #prtwk9 ,i
    i=i+1

    sline$ = p.jancod$
    put     #prtwk9 ,i
    i=i+1
    sline$ = "DATAEND"
    put     #prtwk9 ,i

    Return

'********************************************************************************
'*      内容        ：      印刷用ﾜｰｸﾌｧｲﾙ書込み処理                             *
'********************************************************************************
Shk.Write

    i=1
    Gosub   s.prtwkopn
    CLFILE  #prtwk9 
    Gosub   Labldata1                       ' 入荷ラベルデータ書き込み
    Close #prtwk9 

    return

'********************************************************************************
'*      内容        ：      JANｺｰﾄﾞから商品棚番ﾏｽﾀ情報を取得                    *
'********************************************************************************
Sht.Search
    gosub s.shtmopn                         ' 商品棚番ﾏｽﾀのｵｰﾌﾟﾝ
    if lof(#shtmst9 ) = 0 then
        p.syhmei$ = ""
    else
        c9 = search(#shtmst9 , shtjan$ , p.jancod$)     'JANｺｰﾄﾞのｻｰﾁ
        if c9 <> 0 then
            get #shtmst9 , c9 
            p.syhmei$ = shtmei$
        else
            p.jancod$ = ""
            shtcase$ = ""
            shtbara$ = ""
            p.syhmei$ = ""
        endif
    endif
    close #shtmst9 

    return

'********************************************************************************
'*      内容        ：      JANｺｰﾄﾞから商品ﾏｽﾀ情報を取得                    *
'********************************************************************************
Sho.Search
    gosub s.shomopn                         ' 商品ﾏｽﾀのｵｰﾌﾟﾝ
    if lof(#shomst9 ) = 0 then
        p.syhmei$ = ""
    else
        d9 = search(#shomst9 , shojan$ , p.jancod$)     'JANｺｰﾄﾞのｻｰﾁ
        if d9 <> 0 then
            get #shomst9 , d9 
            p.iri$ = fnspplus$(val(shosu$), 5)
        else
            p.iri$ = "    0"
        endif
    endif
    close # shomst9 

    return

'==============================================================='
'       ［　リンク要求　］
'   伝送制御を開始する前に必ずリンクを確保する
'   始動時にはステータス要求コマンドを送りプリンタのＩＤ
'   を獲得する必要がある
'==============================================================='
Ir.link
    locate 1,3 : print "プリンタ準備中" ;
    IDmh$ = chr$(&h00)                      ' プリンタ指定無し(ID=0000h)
    IDml$ = chr$(&h00)

    stage9 = 1
    while   stage9 < 90
        select  stage9 
            case    1                       '［ リンク要求コマンド ］
                REcnt9 = 20                 ' 送信リトライ回数
                rtime9 = 1                  ' インターバル(1x100ms)
                gosub   Ir.linkreq          ' リンク要求(PAD)
                if  state9 = 0 then
                stage9 = 2
                endif
            case    2                       '［ ステータス要求コマンド ］
                REcnt9 = 20                 ' 送信リトライ回数
                rtime9 = 2                  ' インターバル(2x100ms)
                gosub   Ir.statreq          ' ステータス要求
                if  state9 = 0 then
                    stage9 = 3
                endif
            case    3                       '［ ステータス応答チェック ］
                rtime9 = 10                 ' インターバル(10x100ms)
                gosub   Ir.statchk          ' プリンタ状態チエック
                if  state9 = 0 then
                    stage9 = 4
                else
                    stage9 = 2              ' 再度ステータス要求
                endif
            case    4                       '［　ＥＯＴコマンド送出　］
                REcnt9 = 20                 ' 送信リトライ回数
                rtime9 = 5                  ' インターバル(5x100ms)
                eot.chkf9 = 0               ' コマンド処理(EOT送信後の応答無し)
                gosub   Ir.eotsend          ' 処理終了コマンド
                if  state9 = 0 then
                    stage9 = 90
                endif
        end select
        if  state9 > 0 then
            if  state9 > 900 then           ' 「Ｃ」キーによる処理中断
                beep
                locate 1,3 : print "ＣＬＲキー中断" ;
                gosub   crwait              ' ENTキー入力待ち
                return
            endif
            if  state9 < 800 then           ' プリンタの異常以外のエラー
                beep 3
                locate 1,3 : print "プリンタ無応答" ;
'               locate 1,5 : print "stage=";stage9 ;    ' エラー発生箇所
'               locate 1,7 : print "state=";state9 ;    ' エラー発生原因
                gosub   crwait
                return
            endif
        endif
    wend
    locate 1,3 : print "プリンタ準備完" ;
    return

'==============================================================='
'       初期設定（ＬＡＢＥＬモード）
'   外字・グラフィック・濃度を登録する場合はＬＡＢＥＬモード'
'   に切り替えて登録する
'==============================================================='
Ir.lablini
    locate 1,3 : print "初期設定中　　" ;
    IDmh$ = IDsh$                           ' プリンタから獲得したＩＤ
    IDml$ = IDsl$

    stage9 = 11
    while   stage9 < 90
        select  stage9 
            case    11                      '［ リンク要求コマンド ］
                REcnt9 = 20                 ' 送信リトライ回数
                rtime9 = 1                  ' インターバル(1x100ms)
                gosub   Ir.linkreq          ' リンク要求(PAD)
                if  state9 = 0 then
                    stage9 = 12
                endif
            case    12                      '［ モード切換えコマンド(ラベル) ］
                REcnt9 = 20                 ' 送信リトライ回数
                rtime9 = 2                  ' インターバル(2x100ms)
                mode$ = chr$(&h30)+",1"     ' ラベルモード指定
                gosub   Ir.modechg          ' モード切換え
                if  state9 = 0 then
                    stage9 = 15
                endif
            case    15                      '［ フォーム登録開始コマンド　］
                REcnt9 = 20                 ' 送信リトライ回数
                rtime9 = 2                  ' インターバル(2x100ms)
                gosub   Ir.formreg          ' 印刷フォーム登録開始
                if  state9 = 0 then
                    stage9 = 16
                endif
            case    16                      '［ ラベルサイズ設定コマンド　］
                REcnt9 = 20                 ' 送信リトライ回数
                rtime9 = 2                  ' インターバル(2x100ms)
                gosub   Ir.sizereg          ' ラベルサイズ登録
                if  state9 = 0 then
                    stage9 = 17
                endif
            case    17                      '［ 印字濃度微調コマンド　　］
                REcnt9 = 20                 ' 送信リトライ回数
                rtime9 = 2                  ' インターバル(2x100ms)
                gosub   Ir.contreg          ' 印字濃度微調整
                if  state9 = 0 then
                    stage9 = 18
                endif
            case    18                      '［ 印刷フィールド書式登録コマンド　］
                REcnt9 = 20                 ' 送信リトライ回数
                rtime9 = 2                  ' インターバル(2x100ms)
                gosub   Ir.lablfld          ' 印刷するフィールド毎に書式を登録
                if  state9 = 0 then
                    stage9 = 19
                endif
            case    19                      '［ フォーム登録終了コマンド　　　　］
                REcnt9 = 20                 ' 送信リトライ回数
                rtime9 = 2                  ' インターバル(2x100ms)
                gosub   Ir.formend          ' 印刷フォーム登録終了
                if  state9 = 0 then
                    stage9 = 22
                endif
            case    22                      '［ グラフィック登録コマンド  ］
                REcnt9 = 20                 ' 送信リトライ回数
                rtime9 = 2                  ' インターバル(2x100ms)
                gosub   Ir.grapreg          ' グラフィックデータ登録
                if  state9 = 0 then
                    stage9 = 23
                endif
            case    23                      '［ 外字登録コマンド　　　　］
                REcnt9 = 20                 ' 送信リトライ回数
                rtime9 = 2                  ' インターバル(2x100ms)
                gosub   Ir.gaijreg          ' 外字データ登録
                if  state9 = 0 then
                    stage9 = 24
                endif
            case    24                      '［ ＥＯＴ送出　］
                REcnt9 = 20                 ' 送信リトライ回数
                rtime9 = 15                 ' インターバル(15x100ms)
                eot.chkf9 = 1               ' コマンド処理(EOT送信後の応答有り)
                gosub   Ir.eotsend          ' 処理終了コマンド
                if  state9 = 0 then
                    stage9 = 25
                endif
            case    25                      '［ ステータス要求コマンド ］
                REcnt9 = 20                 ' 送信リトライ回数
                rtime9 = 2                  ' インターバル(2x100ms)
                gosub   Ir.statreq          ' ステータス要求
                if  state9 = 0 then
                    stage9 = 26
                endif
            case    26                      '［ ステータス応答チェック ］
                rtime9 = 10                 ' インターバル(10x100ms)
                gosub   Ir.statchk          ' プリンタ状態チエック
                if  state9 = 0 then
                    stage9 = 91
                else
                    stage9 = 25             ' 再度ステータス要求
                endif
        end select
        if  state9 > 0 then
            if  state9 > 900 then           '「Ｃ」キーによる処理中断
                beep
                locate 1,3 : print "ＣＬＲキー中断" ;
                gosub   crwait
                return
            endif
            if  state9 < 800 then           ' プリンタの異常以外のエラー
                beep 3
                locate 1,3 : print "プリンタ無応答" ;
'               locate 1,5 : print "stage=";stage9 ;    ' エラー発生箇所
'               locate 1,7 : print "state=";state9 ;    ' エラー発生原因
                gosub   crwait
                return
            endif
        endif
    wend
    locate 1,3 : print "初期設定完了　" ;
    return

'==============================================================='
'       発行・フィードシーケンス（ＬＡＢＥＬモード）
'   今回のサンプルプログラムではテストデータをテーブルに
'   セットして印刷しているが、実際のアプリではファイルから
'   読込んで印刷するケースになるであろう。
'==============================================================='
Ir.lablprn
    locate 1,3 : print "データ転送中　" ;
    IDmh$ = IDsh$                           ' プリンタから獲得したＩＤ
    IDml$ = IDsl$
    data.cnt9 = 0                           ' 印刷データカウント（不要）
    sbuf$ = ""

    i=1
    stage9 = 31
    while   stage9 < 90
        select  stage9 
            case    31                      '［ リンク要求コマンド ］
                REcnt9 = 20                 ' 送信リトライ回数
                rtime9 = 1                  ' インターバル(1x100ms)
                gosub   Ir.linkreq          ' リンク要求(PAD)
                if  state9 = 0 then
                    stage9 = 32
                endif
            case    32                      '［ データ印刷実行コマンド ］
                Gosub s.prtwkopn
                Get #prtwk9 ,i               ' データ読込
                work$=sline$
                Close #prtwk9 
                i=i+1

                if  work$ <> "DATAEND" then
                    sbuf$ = sbuf$ + work$ + LF$ ' 印刷データセット
                    data.cnt9 = data.cnt9 + 1
                    locate 5,5
                    print using "#####" ; data.cnt9 ;
                else
                    REcnt9 = 20             ' 送信リトライ回数
                    rtime9 = 2              ' インターバル(2x100ms)
                    gosub   Ir.lbprin       ' 発行コマンド
                    if  state9 = 0 then
                        stage9 = 35
                    endif
                endif
            case    35                      '［ ＥＯＴ送出　］
                REcnt9 = 20                 ' 送信リトライ回数
                rtime9 = 15                 ' インターバル(15x100ms)
                eot.chkf9 = 1               ' コマンド処理(EOT送信後の応答有り)
                gosub   Ir.eotsend          ' 処理終了コマンド
                if  state9 = 0 then
                    stage9 = 36
                endif
            case    36                      '［ ステータス要求コマンド ］
                REcnt9 = 20                 ' 送信リトライ回数
                rtime9 = 2                  ' インターバル(2x100ms)
                gosub   Ir.statreq          ' ステータス要求
                if  state9 = 0 then
                    stage9 = 37
                endif
            case    37                      '［ ステータス応答チェック ］
                rtime9 = 10                 ' インターバル(10x100ms)
                gosub   Ir.statchk          ' プリンタ状態チエック
                if  state9 = 0 then
                    stage9 = 93
                else
                    stage9 = 36             ' 再度ステータス要求
                endif
        end select
        if  state9 > 0 then
            if  state9 > 900 then           ' 「Ｃ」キーによる処理中断
                beep
                locate 1,3 : print "ＣＬＲキー中断" ;
                gosub   crwait              ' ENTキー入力待ち
                return
            endif
            if  state9 < 800 then           ' プリンタの異常以外のエラー
                beep 3
                locate 1,3 : print "プリンタ無応答" ;
'               locate 1,5 : print "stage=";stage9 ;    ' エラー発生箇所
'               locate 1,7 : print "state=";state9 ;    ' エラー発生原因
                gosub   crwait
                return
            endif
        endif
    wend
    locate 1,3 : print "印刷実行完了　" ;
    return

'==============================================================='
'       サブルーチンプログラム
'==============================================================='

'---------------------------------------------------------------'
'       リンク要求コマンド発行
'   PAD(FFh)を送ると40ms以内にNAK(15h)が返る
'   印刷モードに関係なく実行する事
'---------------------------------------------------------------'
Ir.linkreq
    state9 = 0
    cmdcnt9 = 1                             ' コマンド再送カウンタ
s11 gosub   dumred                          ' 受信バッファクリア
    print #prt9 , PAD$ ;                     ' リンク要求
    timeA = rtime9                          ' 受信待ちタイマー
s12 if  loc( #prt9 ) > 0 then
        ans$ = input$( 1, #prt9 )           ' 受信キャラクタ
        select  ans$
            case    NAK$                    ' リンク確立応答
                return
            case    else
                gosub   dumred              ' 受信バッファクリア
        end select
    endif
    if  timeA = 0 then
        cmdcnt9 = cmdcnt9 + 1
        if  cmdcnt9 > REcnt9 then
            state9 = 111                    ' リンクフェーズ・タイムアウト
            return
        else
            goto    s11                     ' リンクコマンド再送
        endif
    endif
    if  inkey$ = chr$( &h18 ) then          ' CLRキー入力
        state9 = 911                        ' ﾕｰｻﾞｰによる処理中断
        return
    endif
    goto    s12
'---------------------------------------------------------------'
'       プリンタのステータス要求コマンド
'   ESC+"FM"+0Ah+00h
'---------------------------------------------------------------'
Ir.statreq
    Cmd.data$ = ESC$+"FM"+LF$+NUL$
    gosub   Lab.cmdsnd
    return
'---------------------------------------------------------------'
'       プリンタ状態チェック
'   リターンコード（state9 ）の内容
'     0：正常状態
'   801：動作中なので指定時間待機しています（今回は１秒間）
'   802：プリンタに問題が有りますキー押下で再確認します
'   981：エラ－表示後中断キーが押されて中断
'---------------------------------------------------------------'
Ir.statchk
    state9 = 0
    Prt.sta$ = mid$( rbuf$,23, 1 )          ' プリンタ状態フラグ
    Bat.sta$ = mid$( rbuf$,24, 1 )          ' バッテリィ充電状態
    select  Prt.sta$
        case    chr$(&h00)                  ' 通常状態（アイドル中）
            Prt.msg$ = ""
        case    chr$(&h01)                  ' カバーオープン状態
            Prt.msg$ = "カバーオープン　"
        case    chr$(&h02)                  ' コマンドのシンタックスエラー
            Prt.msg$ = "コマンドエラー　"
        case    chr$(&h03)                  ' 用紙フィードジャム
            Prt.msg$ = "フィードジャム　"
        case    chr$(&h04)                  ' ラベルエンド
            Prt.msg$ = "ラベルエンド　　"
        case    chr$(&h05)                  ' カバーオープンエラー
            Prt.msg$ = "ｶﾊﾞｰｵｰﾌﾟﾝｴﾗｰ　　"
        case    chr$(&h06)                  ' サーマルヘッド断線エラー
            Prt.msg$ = "ｻｰﾏﾙﾍｯﾄﾞ断線　　"
        case    chr$(&h07)                  ' サーマルヘッド異常高温
            Prt.msg$ = "ｻｰﾏﾙﾍｯﾄﾞ過熱　　"
        case    chr$(&h08)                  ' フラッシュROMへの書込みエラー
            Prt.msg$ = "ﾌﾗｯｼｭROM書込ｴﾗｰ "
        case    chr$(&h09)                  ' フラッシュROMの消去エラー
            Prt.msg$ = "ﾌﾗｯｼｭROM消去ｴﾗｰ "
        case    chr$(&h0A)                  ' ローバッテリィ（印字不能状態）
            Prt.msg$ = "ﾛｰﾊﾞｯﾃﾘｨ印字不能"
        case    chr$(&h0B)                  ' プリンタ動作中
            Prt.msg$ = "プリンタ動作中　"
        case    chr$(&h0C)                  ' 通信エラー(RS-232Cのみ)
            Prt.msg$ = "通信ｴﾗｰ(RS232C) "
        case    chr$(&h0D)                  ' 正常終了＋ラベルエンド
            Prt.msg$ = "正常終了(LBLEND)"
        case    chr$(&h0E)                  ' フラッシュROM登録エリアフル
            Prt.msg$ = "ﾌﾗｯｼｭROMｴﾘｱﾌﾙ　 "
    end select
    if  Prt.msg$ <> "" then
        beep 3
        locate  1, 7 : print Prt.msg$ ;
        if  Prt.sta$ = chr$(&h0B) then      ' プリンタ動作中
            timeA = rtime9 
            while   timeA > 0               ' 動作完了待ち
            wend
            state9 = 801
        else
            gosub   kywait
            if  K$ = chr$(&h18) then        ' 「Ｃ」キー中断
                state9 = 981
            else
                state9 = 802                ' ステータス異常
            endif
        endif
    endif
    return
'---------------------------------------------------------------'
'       処理終了時フェーズ
'   EOTを送信して処理を終了するが、応答が有るケースと無い
'   ケースがあるので注意する
'   ACK応答を待たないケース： eot.chkf9 = 0
'   ACK応答を待つケース：     eot.chkf9 = 1
'---------------------------------------------------------------'
Ir.eotsend
    state9 = 0
    cmdcnt9 = 1                             ' コマンド再送カウンタ
s31 gosub   dumred                          ' 受信バッファクリア
    print #prt9 , EOT$ ;
    timeA = rtime9                          ' 受信待ちタイマー
s32 if  loc( #prt9 ) > 0 then
        ans$ = input$( 1, #prt9 )           ' 受信キャラクタ
        select  ans$
            case    ACK$                    ' ACK応答受信
                return
            case    else
                gosub   dumred              ' 受信バッファクリア
                return
        end select
    endif
'/* ステータス要求コマンド後のＥＯＴにはＡＣＫ応答が来ない      */
    if  timeA = 0 then
        if  eot.chkf9 = 1 then              ' ＥＯＴ待ちフラグＯＮ
            cmdcnt9 = cmdcnt9 + 1           ' 再送カウント＋１
            if  cmdcnt9 > REcnt9 then
                state9 = 131                ' 終了フェーズタイムアウト
                return
            else
                goto    s31
            endif
        else
            return                          ' 応答を待たずに終了
        endif
    endif
    if  inkey$ = chr$( &h18 ) then          ' CLRキー入力
        state9 = 931                        ' ﾕｰｻﾞｰによる処理中断
        return
    endif
    goto    s32
'---------------------------------------------------------------'
'       モード変更コマンド
'   ESC+"M;"+a+0Ah+00h
'       a:発行モード
'       (最上位ﾋﾞｯﾄはIrDA:IrCOMMでｽﾃｰﾀｽ自動応答の有無)
'       0:しない
'       1:する
'       30h,B0h:LABEL    受信済みデータ捨てる
'       31h,B1h:RECEIPT  受信済みデータ捨てる
'       32h,B2h:RECEIPT1 継続印刷
'       33h,B3h:RECEIPT  受信済みデータ捨てる
'       41h,C1h:TPCL-LE  継続印刷
'---------------------------------------------------------------'
Ir.modechg
    Cmd.data$ = ESC$+"M;"+mode$+LF$+NUL$
    gosub   Lab.cmdsnd
    return
'---------------------------------------------------------------'
'       フォーム登録開始コマンド
'   ESC+"XO;"+aa+","+b+0Ah+00h
'       aa:フォーム番号(01～20)
'       b:フォームバージョン番号(0～9)
'---------------------------------------------------------------'
Ir.formreg
    Cmd.data$ = ESC$+"XO;"+"01,1"+LF$+NUL$
    gosub   Lab.cmdsnd
    return
'---------------------------------------------------------------'
'       フォーム登録終了コマンド
'   ESC+"XP"+0Ah+00h
'---------------------------------------------------------------'
Ir.formend
    Cmd.data$ = ESC$+"XP"+LF$+NUL$
    gosub   Lab.cmdsnd
    return
'---------------------------------------------------------------'
'       ラベルサイズ設定コマンド
'   ESC+"D"+aaaa+","+bbbb+","+cccc+0Ah+00h
'       aaaa:ラベルピッチ、タグピッチ(0100～5070)
'       bbbb:有効印字幅(0480固定)   実際のラベル幅
'       cccc:有効印字長(0070～5000) 実際のラベル長
'           パラメータ単位0.1mm
'---------------------------------------------------------------'
Ir.sizereg
    Cmd.data$ = ESC$+"D"+"0440,0480,0360"+LF$+NUL$      ' ﾗﾍﾞﾙ送り長43.5mm、ﾗﾍﾞﾙ48x36mm
    gosub   Lab.cmdsnd
    return

'---------------------------------------------------------------'
'   印字位置微調コマンド
'   ESC+"AX:"+abbb+0Ah+00h
'       a:印字位置微調方向(+:後方、-:前方)
'       bbb:印字位置微調値(000～150)
'           パラメータ単位0.1mm
'---------------------------------------------------------------'
'Ir.contpit
'   Cmd.data$ = ESC$+"AX:-020"+LF$+NUL$
'   gosub   Lab.cmdsnd
'   return
'-------------------------------'
'   印字濃度微調
'-------------------------------'
Ir.contreg
    return
'-------------------------------'
'   グラフィック登録
'-------------------------------'
Ir.grapreg
    return
'-------------------------------'
'   外字登録
'-------------------------------'
Ir.gaijreg
    return

'---------------------------------------------------------------'
'       ステータス受信(STX+26ﾊﾞｲﾄ)
'---------------------------------------------------------------'
Ir.statget
    crc.err9 = 0                            ' CRCエラーフラグ
    state9 = 0
    rbuf$ = ""
s221    if  loc( #prt9 ) >= 26 then
        rbuf$ = input$( 24, #prt9 )         ' 受信データ読み込み
        rcrc$ = input$(  2, #prt9 )         ' CRC読み込み
        call    "CRC.FN3" 1 rbuf$, crc$     ' CRC計算モジュール
        if  rcrc$ = right$(crc$,1)+left$(crc$,1) then
            IDsh$ = mid$( rbuf$, 1, 1 )     ' プリンタＩＤ上位
            IDsl$ = mid$( rbuf$, 2, 1 )     ' プリンタＩＤ下位
            crc.err9 = 0                    ' CRCチェックＯＫ
            return
        else
            crc.err9 = 1                    ' CRCエラー
            return
        endif
    endif
    if  timeA = 0 then
        state9 = 212                        ' ステータス受信フェーズタイムアウト
        return
    endif
    if  inkey$ = chr$( &h18 ) then          ' CLR入力
        state9 = 921                        ' ﾕｰｻﾞｰによる処理中断
        return
    endif
    goto    s221
'---------------------------------------------------------------'
'       コマンド発行 (ラベルフォーマット)
'   STX(1)+ID(2)+LEN(1)+ｺﾏﾝﾄﾞ(n)+CRC(2)
'---------------------------------------------------------------'
Lab.cmdsnd
    state9 = 0
    cmdcnt9 = 1                             ' コマンド再送カウンタ
    gosub   Labl.pack                       ' コマンドパケット生成（ラベルモード）
    sbuf$ = pack$
s21 gosub   dumred                          ' 受信バッファクリア
    print #prt9 , sbuf$ ;                    ' コマンドデータ送信
    timeA = rtime9                          ' 受信待ちタイマー
    ans$ = ""
s22 if  loc( #prt9 ) > 0 then
        ans$ = input$( 1, #prt9 )           ' 受信キャラクタ
        select  ans$
            case    ACK$                    ' 処理終了応答受信
                return
            case    STX$                    ' ステータス受信
                gosub   Ir.statget          '
                if  crc.err9 <> 0 then      ' CRCエラー
                    goto    s21             ' コマンド再送
                endif
                if  state9 = 0 then         ' 正常受信
                    return
                endif
                if  state9 = 921 then       ' CLRキー中断
                    return
                endif
                cmdcnt9 = cmdcnt9 + 1       ' 再送カウント＋１
                if  cmdcnt9 > REcnt9 then
                    state9 = 122            ' 再送カウントオーバー
                    return
                else
                    goto    s21             ' コマンド再送
                endif
            case    NAK$                    ' コマンド再送
                cmdcnt9 = cmdcnt9 + 1       ' 再送カウント＋１
                if  cmdcnt9 > REcnt9 then
                    state9 = 123            ' 再送カウントオーバー
                    return
                else
                    goto    s21             ' プリンタＮＡＫ応答再送
                endif
            case    else
                gosub   dumred              ' 受信バッファクリア
        end select
    endif
    if  timeA = 0 then
        cmdcnt9 = cmdcnt9 + 1               ' 再送カウント＋１
        if  cmdcnt9 > REcnt9 then
            state9 = 124                    'ステータス受信フェーズタイムアウト
            return
        else
            goto    s21                     ' プリンタ応答無し再送
        endif
    endif
    if  inkey$ = chr$( &h18 ) then          ' CLRキー入力
        state9 = 922                        ' ﾕｰｻﾞｰによる処理中断
        return
    endif
    goto    s22
'---------------------------------------------------------------'
'       送信パケットの生成(LABEL)
'         (255ﾊﾞｲﾄ以内)
'---------------------------------------------------------------'
Labl.pack
    cmd.len9  = len(Cmd.data$)              ' 送信データの長さを求める
    cmd.len1$ = chr$(cmd.len9 )              ' 長さを文字形式に変換
    work$ = IDmh$ + IDml$ + cmd.len1$ + Cmd.data$       ' CRC計算範囲のデータをセット
    call    "CRC.FN3" 1 work$, crc$         ' CRC計算モジュールをCall
    scrc$ = right$(crc$,1) + left$(crc$,1)  ' High/Lowを入れ替える
    pack$ = STX$ + work$ + scrc$            ' 送信パケットを生成
    return
'---------------------------------------------------------------'
'       ＥＮＴキー入力待ち
'---------------------------------------------------------------'
crwait
    if  inkey$ <> chr$( &h0d ) then
        goto    crwait
    endif
    beep
    return
'---------------------------------------------------------------'
'       ＫＥＹ入力待ち
'---------------------------------------------------------------'
kywait
    K$ = inkey$
    if  K$ = "" then
        goto    kywait
    endif
    beep
    return
'---------------------------------------------------------------'
'       受信ＢＵＦＦＥＲ読み捨て
'   受信バッファに残っているデータを読み捨てる
'---------------------------------------------------------------'
dumred
    if  loc( #prt9 ) > 0 then
        work$ = input$( loc(#prt9 ), #prt9 )
    endif
    return
'********************************************************************************
'*      内容        ：      印刷用ﾜｰｸﾌｧｲﾙのｵｰﾌﾟﾝ                                *
'********************************************************************************
s.prtwkopn
    open prtwk$ as #prtwk9 
    field #prtwk9 , 254 as sline$

    return

