/*----------------------------*/
/* USBIO                      */
/*----------------------------*/

#include <stdio.h>
#include <string.h>
#include <usb.h>
#include "musbiobase.h"

void printUsageAndExit()
{
    char **pp;
    static char *usage[] = {
       "Usage:",
       " usbio -h|-l|-i -p0|-p1 [-bn]",
       "  -h : Set Hi",
       "  -l : Set Lo",
       "  -i : Get Status",
       "  -p0 : Select Port0",
       "  -p1 : Select Port1",
       "  -bn : Select Bit No",
       "    n= 0..7 (If select -p1 then n= 0..3)",
       "    If not set -bn then All Data in Select Port",
       NULL,
     };

    for(pp = usage; *pp!=NULL;pp++)
      fprintf(stderr,"%s\n",*pp);
    exit(1);
};

int main(int argc,char *argv[])
{
    int i;
    int ret;
    int dat;
    int modsw;
    int portno;
    int bitno;
    int msk;

    struct usb_bus    *bus;
    struct usb_device *dev;
    usb_dev_handle    *udev;

    unsigned char ctl[8];
    ctl[0]=ctl[1]=ctl[2]=ctl[3]=ctl[4]=ctl[5]=ctl[6]=ctl[7]=0;

    modsw = -1;
    portno = 0;
    bitno = -1;
    msk = 0;

    if(argc < 2) printUsageAndExit();
    for(i=1;i<argc;i++){
      if(strcmp("-h",argv[i])==0)
        modsw = 1;
      else if(strcmp("-l",argv[i])==0)
        modsw = 0;
      else if(strcmp("-i",argv[i])==0)
        modsw = -1;
      else if(strcmp("-p0",argv[i])==0)
        portno = 0;
      else if(strcmp("-p1",argv[i])==0)
        portno = 1;
      else if(strcmp("-b0",argv[i])==0) {
        bitno = 0;
        msk = 1;
    } else if(strcmp("-b1",argv[i])==0) {
        bitno = 1;
        msk = 2;
    } else if(strcmp("-b2",argv[i])==0) {
        bitno = 2;
        msk = 4;
    } else if(strcmp("-b3",argv[i])==0) {
        bitno = 3;
        msk = 8;
    } else if(strcmp("-b4",argv[i])==0) {
        bitno = 4;
        msk = 16;
    } else if(strcmp("-b5",argv[i])==0) {
        bitno = 5;
        msk = 32;
    } else if(strcmp("-b6",argv[i])==0) {
        bitno = 6;
        msk = 64;
    } else if(strcmp("-b7",argv[i])==0) {
        bitno = 7;
        msk = 128;
    } else {
        fprintf(stderr,"undefined cmd \"%s\"\n",argv[i]);
        printUsageAndExit();
       }
     }
//    printf("Mode   = %d\n",modsw);
//    printf("PortNo = %d\n",portno);
//    printf("BitNo  = %d\n",bitno); 
//    printf("Data   = %d\n",msk);

    /*-------------*/
    /* Device Open */
    /*-------------*/
    bus=morphy_init();
    dev=morphy_find(bus,dev);
    if( dev==NULL ){ exit(1); }
    udev=morphy_open(dev);
    if( udev==NULL ){ exit(2); }

    if( modsw == -1){
    
    } else {

       if( bitno == -1){
          /* Set All */
          if(modsw == 0){
             dat = 0x00;
          } else {
             dat = 0xFF;
          }
       } else {
          /* data in */
          dat=uio_in(udev,portno);
          /* Edit dat */
          if(modsw == 1){
             dat = dat | msk;
          } else {
             dat = dat & (255- msk);
          }
       }
       uio_out(udev,portno,dat);
    }
    /* Get Section */
    if (bitno == -1){
       /* data in      */
       dat=uio_in(udev,portno);
       printf("Port%d : %d\n",portno,dat);
       
    } else {
       /* data in      */
       dat=uio_in(udev,portno);
       if ((dat & msk) == 0){
          printf("Port%d%d : l\n",portno,bitno);
       } else{ 
          printf("Port%d%d : h\n",portno,bitno);
       }

    }

    /*---------------------*/
    /* Device Close & Exit */
    /*---------------------*/
    morphy_close(udev);
    exit(0);
}


