Ika Shouyu Poppoyaki - LPC82x supported

Dependencies:   MODSERIAL mbed

Fork of ika_shouyu_poppoyaki by Tedd OKANO

Revision:
0:6baefda2e511
Child:
1:54e619428ae6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat Aug 24 06:57:50 2013 +0000
@@ -0,0 +1,223 @@
+#include "mbed.h"
+
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+
+DigitalOut  reset_pin( p26 );
+DigitalOut  isp_pin( p25 );
+
+Serial pc (USBTX,USBRX);
+Serial target (p28,p27);
+
+LocalFileSystem local("local");
+#define        SOURCE_FILE        "/local/bin"
+
+#define     STR_BUFF_SIZE   128
+
+void put_string( char *s );
+void get_string( char *s );
+
+
+int try_and_check( char *command, char *expected_return_str, int mode )
+{
+    char    rtn_str[ STR_BUFF_SIZE ];
+
+    put_string( command );
+    get_string( rtn_str );
+
+    return ( strcmp( expected_return_str, rtn_str ) );
+}
+
+int try_and_check2( char *command, char *expected_return_str, int mode )
+{
+    char    rtn_str[ STR_BUFF_SIZE ];
+
+    put_string( command );
+
+    get_string( rtn_str );  // just readout echoback
+    printf( "          RTN0=%s\r\n", rtn_str );
+    get_string( rtn_str );
+    printf( "          RTN1=%s\r\n", rtn_str );
+
+    return ( strcmp( expected_return_str, rtn_str ) );
+}
+
+char read_byte( void )
+{
+    while ( !target.readable() )
+        ;
+
+    return ( target.getc() );
+}
+char uue_table[ 64 ];
+
+void initialize_uue_table( void )
+{
+    int     i;
+
+    uue_table[0] = 0x60;           // 0x20 is translated to 0x60 !
+
+    for (i = 1; i < 64; i++) {
+        uue_table[i] = (char)(0x20 + i);
+    }
+}
+
+long bin2uue( char *bin, char *str )
+{
+    unsigned long   v;
+    long            check_sum   = 0;
+    int             strpos      = 0;
+
+    *(str + strpos++) = ' ' + 45;
+
+    for ( int i = 0; i < 45; i += 3 ) {
+        check_sum   += *(bin + i + 0) + *(bin + i + 1) + *(bin + i + 2);
+        v   = (*(bin + i + 0) << 16) | (*(bin + i + 1) << 8) | (*(bin + i + 2) << 0);
+        *(str + strpos++) = uue_table[ (v >> 18) & 0x3F ];
+        *(str + strpos++) = uue_table[ (v >> 12) & 0x3F ];
+        *(str + strpos++) = uue_table[ (v >>  6) & 0x3F ];
+        *(str + strpos++) = uue_table[ (v >>  0) & 0x3F ];
+    }
+    *(str + strpos++) = '\n';
+    *(str + strpos++) = '\0';
+
+    return check_sum;
+}
+
+
+#define FLASH_WRITING_SIZE  1024
+#define TRANSFER_SIZE       (24 * 45)
+
+char    b[ TRANSFER_SIZE ];
+
+void sending_data( FILE *fp )
+{
+    char    command_str[ STR_BUFF_SIZE ];
+    long    check_sum   = 0;
+    int     transfer_count  = 0;
+    int     size;
+
+    initialize_uue_table();
+
+    for ( int i = FLASH_WRITING_SIZE; i < TRANSFER_SIZE; i++ )
+        b[ i ]  = 0;
+
+    while ( size    = fread( b, sizeof( char ), FLASH_WRITING_SIZE, fp ) ) {
+
+        sprintf( command_str, "W %ld %ld\r\n", 0x10000300L, 1080 );
+        printf( "\"%s\" %s\r\n", command_str, try_and_check( command_str, "0", 0 ) ? "Fail" : "Pass" );
+
+        for ( int i = 0; i < 24; i++ ) {
+            check_sum   += bin2uue( b + (i * 45), command_str );
+            printf( "%02d %s\r\n", i, command_str );
+            put_string( command_str );
+            if ( (i == 19) || (i == 23) ) {
+                sprintf( command_str, "%ld\n", check_sum );
+                printf( " %ld  %s\r\n", check_sum, command_str );
+                printf( "\"%s\" %s\r\n", command_str, try_and_check( command_str, "OK", 0 ) ? "Fail" : "Pass" );
+
+                check_sum   = 0;
+            }
+        }
+
+        printf( "\"P 0 0\" %s\r\n", try_and_check( "P 0 0\r\n", "0", 0 ) ? "Fail" : "Pass" );
+
+        sprintf( command_str, "C %ld %ld %ld\r\n", FLASH_WRITING_SIZE * transfer_count++, 0x10000300L, FLASH_WRITING_SIZE );
+        printf( "\"%s\" %s\r\n", command_str, try_and_check( command_str, "0", 0 ) ? "Fail" : "Pass" );
+
+
+    }
+    printf( "\"G 0 T\" %s\r\n", try_and_check( "G 0 T\r\n", "0", 0 ) ? "Fail" : "Pass" );
+}
+
+int main()
+{
+    FILE    *fp;
+    char    str_buf0[ STR_BUFF_SIZE ];
+    char    str_buf1[ STR_BUFF_SIZE ];
+
+    pc.baud(9600);
+    target.baud(9600);
+
+    if ( NULL == (fp    = fopen( SOURCE_FILE, "rb" )) ) {
+        error( "couldn't open source file" );
+        return ( 1 );
+    }
+
+    printf( "\r\n\r\ntarget RESET\r\n" );
+
+    reset_pin   = 1;
+    isp_pin = 0;
+    wait_ms( 100 );
+    reset_pin   = 0;
+    wait_ms( 100 );
+    reset_pin   = 1;
+    wait_ms( 100 );
+
+    printf( "\"?\" >> \"Synchronized\" %s\r\n", try_and_check( "?", "Synchronized", 0 ) ? "Fail" : "Pass" );
+    printf( "\"Synchronized\\r\\n\" %s\r\n", try_and_check2( "Synchronized\r\n", "OK", 0 ) ? "Fail" : "Pass" );
+    printf( "\"12000\" %s\r\n", try_and_check2( "12000\r\n", "OK", 0 ) ? "Fail" : "Pass" );
+    printf( "\"U 23130\" %s\r\n", try_and_check2( "U 23130\r\n", "0", 0 ) ? "Fail" : "Pass" );
+    printf( "\"A 0\" %s\r\n", try_and_check2( "A 0\r\n", "0", 0 ) ? "Fail" : "Pass" );
+
+    printf( "\"K\" %s\r\n", try_and_check( "K\r\n", "0", 0 ) ? "Fail" : "Pass" );
+    get_string( str_buf0 );
+    get_string( str_buf1 );
+    printf( "    result of \"K\" = %s %s\r\n", str_buf0, str_buf1 );
+
+    printf( "\"J\" %s\r\n", try_and_check( "J\r\n", "0", 0 ) ? "Fail" : "Pass" );
+    get_string( str_buf0 );
+    printf( "    result of \"J\" = %s\r\n", str_buf0 );
+
+#if 0
+    printf( "\"N\" %s\r\n", try_and_check( "N\r\n", "0", 0 ) ? "Fail" : "Pass" );
+    get_string( str_buf0 );
+    printf( "    result of \"N\" = %s %lX\r\n", str_buf0, atol( str_buf0 ) );
+    get_string( str_buf0 );
+    printf( "    result of \"N\" = %s %lX\r\n", str_buf0, atol( str_buf0 ) );
+    get_string( str_buf0 );
+    printf( "    result of \"N\" = %s %lX\r\n", str_buf0, atol( str_buf0 ) );
+    get_string( str_buf0 );
+    printf( "    result of \"N\" = %s %lX\r\n", str_buf0, atol( str_buf0 ) );
+#endif
+    printf( "\"P 0 0\" %s\r\n", try_and_check( "P 0 0\r\n", "0", 0 ) ? "Fail" : "Pass" );
+    printf( "\"E 0 0\" %s\r\n", try_and_check( "E 0 0\r\n", "0", 0 ) ? "Fail" : "Pass" );
+
+    sending_data( fp );
+    fclose( fp );
+
+    while ( 1 )
+        ;
+}
+
+void put_string( char *s )
+{
+    char    c;
+
+    while ( (c = *s++) )
+        target.putc( c );
+}
+
+void get_string( char *s )
+{
+    int     i   = 0;
+    char    c   = 0;
+
+    do {
+        do {
+            if ( target.readable() ) {
+                c  = target.getc();
+
+                if ( ( c == '\n') || (c == '\r') )
+                    break;
+
+                *s++    = c;
+                i++;
+                led2 = !led2;
+
+            }
+        } while ( 1 );
+    } while ( !i );
+    *s  = '\0';
+}
+