久々にC
libpasoriをちょっと変更する必要あり。久々にCと格闘中。
目的:複数台のパソリを一台のPCにつなぐこと
追記(11/07):libusbのusb_interrupt_readがブロッキングしてしまう。timeoutが利いてない感じ。libusbまで触るのか?無理だな。なんか違った方法を考えよう。どうにかしてカードが有無を検知出来ないかな?でも昨日みつけたPasoriKitというOSX専用のライブラリーではあっさり複数台のパソリを認識してた。最後はPasoriKitかなと思いつつ、でもLinuxでも動いた方がいいのでもうちょっとlibpasoriをいじってみる。
追記(11/07午後):出来た。PaSoRi2コマンドというのがあって、その中にカードの有無を確認するコマンド発見。コマンドの発行の仕方にちょっと手間取ったけど動作を確認出来た。
http://wiki.osdev.info/?PaSoRi%2FRC-S320#content_1_11
追記(11/11):
カードの有無を検知するのに追加したコードはこんな感じ
const uint8 PASORI2_DIAG[] = {0x52,0x10,0x0}; //command code, code, data length uint8 pasori_card_polling(pasori* pp){ uint8 recv[256]; uint8 result; pasori_packet_write(pp,(uint8 *)PASORI2_DIAG, sizeof(PASORI2_DIAG)); pasori_recv(pp,recv,255,400); result = recv[7]; //決めうち。0ならカードがパソリの上に有る、それ以外はカードが無い if (result != 0) MyLog("card not found!\n"); else MyLog("card found!\n"); return result; }
pasori_card_pollingの後にfelica_pollingを呼べばほぼ確実に情報を読むことが可能。
これは繋がってる全てのパソリを検出するコード。ほぼpasori_openのままですが、引数はpasori **をとって戻り値はパソリの台数を返すようになってます
int pasori_open_all(pasori **pp) { struct usb_bus *bus; struct usb_device *dev; struct usb_device *devs[5] = {NULL, NULL, NULL, NULL, NULL}; // 決めうち、今のところマックス5台まで int dev_num = 0; pasori *p; int i; usb_init(); usb_set_debug(0); usb_find_busses(); usb_find_devices(); for(bus = usb_get_busses(); bus ; bus = bus->next){ for(dev = bus->devices; dev ; dev = dev->next){ if(dev->descriptor.idVendor == PASORIUSB_VENDOR && dev->descriptor.idProduct== PASORIUSB_PRODUCT){ devs[dev_num++] = dev; } } } if (dev_num == 0) { Log("pasori not found in USB BUS"); return dev_num; } for (i = 0; i < dev_num; i++) { dev = devs[i]; pp[i] = (pasori *)malloc(sizeof(pasori)); p = pp[i]; p->dh = usb_open(dev); p->dev = dev; if(usb_set_configuration(p->dh,1)){ /* error */ pasori_close(p); return 0; } if(usb_claim_interface(p->dh, p->dev->config->interface->altsetting->bInterfaceNumber)){ /* error */ pasori_close(p); return 0; } } return dev_num; }