#include "hotdec_sock.h"
#define CLIENT_MODE 1
#define SERVER_MODE 2

int main (int argc, char *argv[])
{
  int sock1, sock2;
  int s_local_bt;
  int opt, len, mode;
  int i;
  int s_hci;
  struct sockaddr_l2 *sa_bt,rem_addr;
  char buf[256];


  if(argc != 2)
  {
    printf("usage: ./run --server/--client\n");
    exit(0);
  }
  if(strcmp(argv[1], "--client") == 0)
    mode = CLIENT_MODE;
  else if(strcmp(argv[1], "--server") == 0)
    mode = SERVER_MODE;

  s_hci = hci_socket();
  //hci_reset(s_hci);
  //hci_init(s_hci);
  hci_scan_enable(s_hci); 
  //hci_read_page_timeout(s_hci);
  //hci_set_page_timeout(s_hci, 63000);
  //hci_read_page_timeout(s_hci);
  //hci_read_connection_accept_timeout(s_hci);
  //hci_set_connection_accept_timeout(s_hci, 6200);
  //hci_read_connection_accept_timeout(s_hci);
  close(s_hci); 

  if(mode == SERVER_MODE) 
  { 
    printf("tale:\n");
    s_local_bt = bind_sock_local(0, TYPE_BT);
    printf("local socket is no %d\n", s_local_bt);
    len = listen_sock(s_local_bt, TYPE_BT);
    printf("listen returns %d\n", len);
    opt = sizeof(rem_addr);

    /* i = getsockopt(s_local_bt, SOL_L2CAP, L2CAP_LM, &opt, &len);
    printf("getsockopt = %d options are %d\n", i, opt);
    opt |= L2CAP_LM_MASTER;
    setsockopt(s_local_bt, SOL_L2CAP, L2CAP_LM, &opt, sizeof(opt));
    printf("setsockopt = %d\n", i);
    i = getsockopt(s_local_bt, SOL_L2CAP, L2CAP_LM, &opt, &len);
    printf("getsockopt = %d options are %d\n", i, opt); */

    sock1 = accept(s_local_bt, (struct sockaddr *)&rem_addr, &opt);
    printf("1 in\n");
    getsockopt(sock1, SOL_L2CAP, L2CAP_LM, &opt, &len);
    opt |= L2CAP_LM_MASTER;
    setsockopt(sock1, SOL_L2CAP, L2CAP_LM, &opt, sizeof(opt));
    
    sock2 = accept(s_local_bt, (struct sockaddr *)&rem_addr, &opt);
    printf("2 in\n");
    getsockopt(sock2, SOL_L2CAP, L2CAP_LM, &opt, &len);
    opt |= L2CAP_LM_MASTER;
    setsockopt(sock2, SOL_L2CAP, L2CAP_LM, &opt, sizeof(opt));

    printf("socket no's = %d, %d\n", sock1, sock2);

    while(1) {
      write(sock1, "Hello", sizeof("Hello"));
      write(sock2, "Hello", sizeof("Hello"));
      printf("len = %d\n", len);
      usleep(10000);
    }

  }


  else if(mode == CLIENT_MODE) 
  { 
    s_local_bt = bind_sock_local(0, TYPE_BT);
    sa_bt = addr_by_name("00:40:05:C1:7A:20", 0, TYPE_BT);
    printf("s_local_bt = %d, addr=%s\n",
           s_local_bt, batostr(&(sa_bt->l2_bdaddr)));
    i = connect(s_local_bt, (struct sockaddr *)sa_bt, sizeof(*sa_bt));
    printf("connected sock = %d\n", i);
    if (i < 0)
      perror("bt connect");
    while (i>=0) {
       len = read(s_local_bt, buf, 256);
      if (len > 0)
      printf("Received \"%s\"\n", buf);
    }
    close(s_local_bt);
  }
}

