// File: /workspace/github_c_makefile_star2_O0/bokunimowakaru[P]petit15term/petit15writer.c
// Function: main
int main(int argc,char **argv){
    int fd=-1,loop=1,i,com=0,ret,ver,ok,wait;
    time_t time_val,time_prev;
    char c;
    char s[256],ss[16];
    struct termios uartattr;
    //                    0123456789ABC
    char UART_DEVICE[15]="/dev/ttyUSB10";

    printf("-------------------------------------\n");
    printf("Petit Ichigo Writer  by Wataru KUNINO\n");
    printf("-------------------------------------\n");
    printf("注意：ファームウェアを書き換えます。\n");
    printf("This software updates firmware on LPC\n");
    printf("-------------------------------------\n");
    
    if( argc == 3 ) TARGET_VERSION = atoi(argv[2]);
    if( argc >= 2){
        i=atoi(argv[1]);
        if( i>0 && i<= 64){
            snprintf(&UART_DEVICE[5],8,"ttyS%1d",i-1);  // Cygwin PC用
            fd = uart_open(UART_DEVICE, &uartattr);
            com=i;
        }
    }
    if(com==0) for(i=22;i>=0;i--){
        if(i>=20){
            snprintf(&UART_DEVICE[5],8,"rfcomm%1d",i-20);   // ポート探索(rfcomm0-2)
        }else if(i>=10){
            snprintf(&UART_DEVICE[5],8,"ttyUSB%1d",i-10);  // ポート探索(USB0～9)
        }else if(i==9) snprintf(&UART_DEVICE[5],8,"ttyAMA0");   // 拡張IOのUART端子に設定
        else{
            snprintf(&UART_DEVICE[5],8,"ttyS%1d",i);            // Cygwin PC用
            com=i+1;
        }
    //  log_date(UART_DEVICE);
        fd = uart_open(UART_DEVICE, &uartattr);
        if(fd >=0 ) break;
    }
    
    if (fd < 0){
        log_date("ERROR @ UART OPEN");
        return 1;
    }else{
		if(com) sprintf(s,"COM PORT = COM%d (%s)",com,UART_DEVICE);
        else sprintf(s,"COM PORT = %s",UART_DEVICE);
        log_date(s);
    }
    if(close_serial_port()){            // 一旦閉じる
        log_date("ERROR @ UART CLOSE");
        return 1;
    }
    
    while(loop){
		if(com) sprintf(ss,"com%d",com);
		else sprintf(ss,"%s",UART_DEVICE);
        sprintf(s,"lpc21isp/lpc21isp -verify -donotstart firmware/ichigojam-xtal.hex %s 115200 12000",ss);
        log_date(s);
        log_date("Please connect a LPC Device to your jig.");
        log_date("LPCマイコンをボードにセットしてISPボタンを押してください");
        ret=system(s);
        sprintf(s,"lpc21isp (%d)",ret);         // 256:ファームウェア無し、2560 ユーザ終了 65280
        log_date(s);
        switch(ret){
            case 2560:
                log_date("[Esc]キーが押されたので書き換えを中断しました");
                return 1;
                break;
            case 0:
                log_date("SUCCESS");
                log_date("書き込みに成功しました");
                break;
            default:
                log_date("エラーが発生したので終了します");
                return 1;
                break;
        }

        log_date("Please press reset button on IchigoJam.");
        log_date("マイコンボードのリセットボタンを押してください");
        uart_open(UART_DEVICE, &uartattr);

        wait=0; ok=0; ver=0;
        while(ok>=0){
            if( kbhit() ){
                log_date("Aborted by user.");
                close_serial_port();
                return 1;
            }
            c=read_serial_port();
            if(c){
                if( wait > 3 ){
                    printf("\n");
                }
                wait =0;
                if( isprint((int)c) ) printf("%c",c);
                if( c =='\n' ){
                    printf("\n");
                    if(c =='\n' && ok == 2 && ver == TARGET_VERSION) ok=-1; // ループ終了
                }else if( isdigit((int)c) ){
                    ver *=10;
                    ver += (int)(c - '0');
                }else if( ver !=0 && ver != TARGET_VERSION && c !='.' ){
                    printf("\n");
                    log_date("IchigoJam Version ERROR.");
                    log_date("期待バージョンと異なるので終了します");
                    close_serial_port();
                    return 1;
                }else if( ok==0 && c=='O' ){
                    ok++;
                }else if( ok==1 && c=='K' ){
                    ok++;
                }else if( ok && isprint((int)c) ) ok=0;
            }
            time(&time_val);
            if( time_prev != time_val ){
                time_prev = time_val;
                wait++;
                if( wait>30 ){
                    printf("\n");
                    log_date("No response from IchigoJam.");
                    log_date("IchigoJamからの応答がありません");
                    close_serial_port();
                    return 1;
                }
                if( wait > 3) printf(".");
            }
        }
        if(close_serial_port()){
            log_date("ERROR @ UART CLOSE");
            return 1;
        }
        log_date("CLOSED");
    }
    return(0);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x1c0, %rsp            # imm = 0x1C0
movl $0x0, -0x4(%rbp)
movl %edi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movl $0xffffffff, -0x14(%rbp) # imm = 0xFFFFFFFF
movl $0x1, -0x18(%rbp)
movl $0x0, -0x20(%rbp)
movq 0xda5(%rip), %rax       # 0x23da
movq %rax, -0x1ab(%rbp)
movl 0xda0(%rip), %eax       # 0x23e2
movl %eax, -0x1a3(%rbp)
movw 0xd97(%rip), %ax        # 0x23e6
movw %ax, -0x19f(%rbp)
movb 0xd8c(%rip), %al        # 0x23e8
movb %al, -0x19d(%rbp)
leaq 0x9bc(%rip), %rdi       # 0x2025
movb $0x0, %al
callq 0x1080
leaq 0x9d5(%rip), %rdi       # 0x204c
movb $0x0, %al
callq 0x1080
leaq 0x9a0(%rip), %rdi       # 0x2025
movb $0x0, %al
callq 0x1080
leaq 0x9e0(%rip), %rdi       # 0x2073
movb $0x0, %al
callq 0x1080
leaq 0xa0a(%rip), %rdi       # 0x20ab
movb $0x0, %al
callq 0x1080
leaq 0x976(%rip), %rdi       # 0x2025
movb $0x0, %al
callq 0x1080
cmpl $0x3, -0x8(%rbp)
jne 0x16cf
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rdi
callq 0x1160
movl %eax, 0x2a11(%rip)      # 0x40e0
cmpl $0x2, -0x8(%rbp)
jl 0x1733
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x1160
movl %eax, -0x1c(%rbp)
cmpl $0x0, -0x1c(%rbp)
jle 0x1731
cmpl $0x40, -0x1c(%rbp)
jg 0x1731
leaq -0x1ab(%rbp), %rdi
addq $0x5, %rdi
movl -0x1c(%rbp), %ecx
subl $0x1, %ecx
movl $0x8, %esi
leaq 0x9c4(%rip), %rdx       # 0x20d2
movb $0x0, %al
callq 0x1090
leaq -0x1ab(%rbp), %rdi
leaq -0x19c(%rbp), %rsi
callq 0x13f0
movl %eax, -0x14(%rbp)
movl -0x1c(%rbp), %eax
movl %eax, -0x20(%rbp)
jmp 0x1733
cmpl $0x0, -0x20(%rbp)
jne 0x182d
movl $0x16, -0x1c(%rbp)
cmpl $0x0, -0x1c(%rbp)
jl 0x182b
cmpl $0x14, -0x1c(%rbp)
jl 0x177d
leaq -0x1ab(%rbp), %rdi
addq $0x5, %rdi
movl -0x1c(%rbp), %ecx
subl $0x14, %ecx
movl $0x8, %esi
leaq 0x969(%rip), %rdx       # 0x20da
movb $0x0, %al
callq 0x1090
jmp 0x17fd
cmpl $0xa, -0x1c(%rbp)
jl 0x17a9
leaq -0x1ab(%rbp), %rdi
addq $0x5, %rdi
movl -0x1c(%rbp), %ecx
subl $0xa, %ecx
movl $0x8, %esi
leaq 0x944(%rip), %rdx       # 0x20e4
movb $0x0, %al
callq 0x1090
jmp 0x17fb
cmpl $0x9, -0x1c(%rbp)
jne 0x17cf
leaq -0x1ab(%rbp), %rdi
addq $0x5, %rdi
movl $0x8, %esi
leaq 0x928(%rip), %rdx       # 0x20ee
movb $0x0, %al
callq 0x1090
jmp 0x17f9
leaq -0x1ab(%rbp), %rdi
addq $0x5, %rdi
movl -0x1c(%rbp), %ecx
movl $0x8, %esi
leaq 0x8e9(%rip), %rdx       # 0x20d2
movb $0x0, %al
callq 0x1090
movl -0x1c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x20(%rbp)
jmp 0x17fb
jmp 0x17fd
leaq -0x1ab(%rbp), %rdi
leaq -0x19c(%rbp), %rsi
callq 0x13f0
movl %eax, -0x14(%rbp)
cmpl $0x0, -0x14(%rbp)
jl 0x181b
jmp 0x182b
jmp 0x181d
movl -0x1c(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x1c(%rbp)
jmp 0x1744
jmp 0x182d
cmpl $0x0, -0x14(%rbp)
jge 0x184b
leaq 0x8bc(%rip), %rdi       # 0x20f6
callq 0x1370
movl $0x1, -0x4(%rbp)
jmp 0x1c9d
cmpl $0x0, -0x20(%rbp)
je 0x1872
leaq -0x150(%rbp), %rdi
movl -0x20(%rbp), %edx
leaq -0x1ab(%rbp), %rcx
leaq 0x89f(%rip), %rsi       # 0x2108
movb $0x0, %al
callq 0x1170
jmp 0x188e
leaq -0x150(%rbp), %rdi
leaq -0x1ab(%rbp), %rdx
leaq 0x897(%rip), %rsi       # 0x211e
movb $0x0, %al
callq 0x1170
leaq -0x150(%rbp), %rdi
callq 0x1370
callq 0x15d0
cmpl $0x0, %eax
je 0x18bc
leaq 0x881(%rip), %rdi       # 0x212c
callq 0x1370
movl $0x1, -0x4(%rbp)
jmp 0x1c9d
jmp 0x18be
cmpl $0x0, -0x18(%rbp)
je 0x1c96
cmpl $0x0, -0x20(%rbp)
je 0x18e8
leaq -0x160(%rbp), %rdi
movl -0x20(%rbp), %edx
leaq 0x860(%rip), %rsi       # 0x213f
movb $0x0, %al
callq 0x1170
jmp 0x1904
leaq -0x160(%rbp), %rdi
leaq -0x1ab(%rbp), %rdx
leaq 0x82c(%rip), %rsi       # 0x2129
movb $0x0, %al
callq 0x1170
leaq 0x83a(%rip), %rsi       # 0x2145
xorl %eax, %eax
movb %al, -0x1b9(%rbp)
leaq -0x150(%rbp), %rdi
movq %rdi, -0x1b8(%rbp)
leaq -0x160(%rbp), %rdx
callq 0x1170
movq -0x1b8(%rbp), %rdi
callq 0x1370
leaq 0x857(%rip), %rdi       # 0x2197
callq 0x1370
leaq 0x874(%rip), %rdi       # 0x21c0
callq 0x1370
movq -0x1b8(%rbp), %rdi
callq 0x1060
movq -0x1b8(%rbp), %rdi
movl %eax, %ecx
movb -0x1b9(%rbp), %al
movl %ecx, -0x24(%rbp)
movl -0x24(%rbp), %edx
leaq 0x899(%rip), %rsi       # 0x2212
callq 0x1170
movq -0x1b8(%rbp), %rdi
callq 0x1370
movl -0x24(%rbp), %eax
movl %eax, -0x1b0(%rbp)
testl %eax, %eax
je 0x19c0
jmp 0x1999
movl -0x1b0(%rbp), %eax
subl $0xa00, %eax            # imm = 0xA00
jne 0x19da
jmp 0x19a8
leaq 0x871(%rip), %rdi       # 0x2220
callq 0x1370
movl $0x1, -0x4(%rbp)
jmp 0x1c9d
leaq 0x89b(%rip), %rdi       # 0x2262
callq 0x1370
leaq 0x897(%rip), %rdi       # 0x226a
callq 0x1370
jmp 0x19f2
leaq 0x8ab(%rip), %rdi       # 0x228c
callq 0x1370
movl $0x1, -0x4(%rbp)
jmp 0x1c9d
leaq 0x8c1(%rip), %rdi       # 0x22ba
callq 0x1370
leaq 0x8dd(%rip), %rdi       # 0x22e2
callq 0x1370
leaq -0x1ab(%rbp), %rdi
leaq -0x19c(%rbp), %rsi
callq 0x13f0
movl $0x0, -0x30(%rbp)
movl $0x0, -0x2c(%rbp)
movl $0x0, -0x28(%rbp)
cmpl $0x0, -0x2c(%rbp)
jl 0x1c66
callq 0x12a0
cmpl $0x0, %eax
je 0x1a63
leaq 0x8db(%rip), %rdi       # 0x2328
callq 0x1370
callq 0x15d0
movl $0x1, -0x4(%rbp)
jmp 0x1c9d
callq 0x14d0
movb %al, -0x41(%rbp)
cmpb $0x0, -0x41(%rbp)
je 0x1bed
cmpl $0x3, -0x30(%rbp)
jle 0x1a89
leaq 0x5c8(%rip), %rdi       # 0x204a
movb $0x0, %al
callq 0x1080
movl $0x0, -0x30(%rbp)
callq 0x1180
movq (%rax), %rax
movsbl -0x41(%rbp), %ecx
movslq %ecx, %rcx
movzwl (%rax,%rcx,2), %eax
andl $0x4000, %eax           # imm = 0x4000
cmpl $0x0, %eax
je 0x1abf
movsbl -0x41(%rbp), %esi
leaq 0x881(%rip), %rdi       # 0x2339
movb $0x0, %al
callq 0x1080
movsbl -0x41(%rbp), %eax
cmpl $0xa, %eax
jne 0x1afc
leaq 0x57b(%rip), %rdi       # 0x204a
movb $0x0, %al
callq 0x1080
movsbl -0x41(%rbp), %eax
cmpl $0xa, %eax
jne 0x1af7
cmpl $0x2, -0x2c(%rbp)
jne 0x1af7
movl -0x28(%rbp), %eax
cmpl 0x25f2(%rip), %eax      # 0x40e0
jne 0x1af7
movl $0xffffffff, -0x2c(%rbp) # imm = 0xFFFFFFFF
jmp 0x1beb
callq 0x1180
movq (%rax), %rax
movsbl -0x41(%rbp), %ecx
movslq %ecx, %rcx
movzwl (%rax,%rcx,2), %eax
andl $0x800, %eax            # imm = 0x800
cmpl $0x0, %eax
je 0x1b32
imull $0xa, -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
movsbl -0x41(%rbp), %eax
subl $0x30, %eax
addl -0x28(%rbp), %eax
movl %eax, -0x28(%rbp)
jmp 0x1be9
cmpl $0x0, -0x28(%rbp)
je 0x1b83
movl -0x28(%rbp), %eax
cmpl 0x259f(%rip), %eax      # 0x40e0
je 0x1b83
movsbl -0x41(%rbp), %eax
cmpl $0x2e, %eax
je 0x1b83
leaq 0x4f7(%rip), %rdi       # 0x204a
movb $0x0, %al
callq 0x1080
leaq 0x7db(%rip), %rdi       # 0x233c
callq 0x1370
leaq 0x7e8(%rip), %rdi       # 0x2355
callq 0x1370
callq 0x15d0
movl $0x1, -0x4(%rbp)
jmp 0x1c9d
cmpl $0x0, -0x2c(%rbp)
jne 0x1b9d
movsbl -0x41(%rbp), %eax
cmpl $0x4f, %eax
jne 0x1b9d
movl -0x2c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x2c(%rbp)
jmp 0x1be5
cmpl $0x1, -0x2c(%rbp)
jne 0x1bb7
movsbl -0x41(%rbp), %eax
cmpl $0x4b, %eax
jne 0x1bb7
movl -0x2c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x2c(%rbp)
jmp 0x1be3
cmpl $0x0, -0x2c(%rbp)
je 0x1be1
callq 0x1180
movq (%rax), %rax
movsbl -0x41(%rbp), %ecx
movslq %ecx, %rcx
movzwl (%rax,%rcx,2), %eax
andl $0x4000, %eax           # imm = 0x4000
cmpl $0x0, %eax
je 0x1be1
movl $0x0, -0x2c(%rbp)
jmp 0x1be3
jmp 0x1be5
jmp 0x1be7
jmp 0x1be9
jmp 0x1beb
jmp 0x1bed
leaq -0x38(%rbp), %rdi
callq 0x10f0
movq -0x40(%rbp), %rax
cmpq -0x38(%rbp), %rax
je 0x1c61
movq -0x38(%rbp), %rax
movq %rax, -0x40(%rbp)
movl -0x30(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x30(%rbp)
cmpl $0x1e, -0x30(%rbp)
jle 0x1c4b
leaq 0x42c(%rip), %rdi       # 0x204a
movb $0x0, %al
callq 0x1080
leaq 0x760(%rip), %rdi       # 0x238c
callq 0x1370
leaq 0x770(%rip), %rdi       # 0x23a8
callq 0x1370
callq 0x15d0
movl $0x1, -0x4(%rbp)
jmp 0x1c9d
cmpl $0x3, -0x30(%rbp)
jle 0x1c5f
leaq 0x6fb(%rip), %rdi       # 0x2353
movb $0x0, %al
callq 0x1080
jmp 0x1c61
jmp 0x1a32
callq 0x15d0
cmpl $0x0, %eax
je 0x1c85
leaq 0x4b5(%rip), %rdi       # 0x212c
callq 0x1370
movl $0x1, -0x4(%rbp)
jmp 0x1c9d
leaq 0x747(%rip), %rdi       # 0x23d3
callq 0x1370
jmp 0x18be
movl $0x0, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0x1c0, %rsp            # imm = 0x1C0
popq %rbp
retq