int pigpio_start(char *addrStr, char *portStr) { if (!gPigStarted) { gPigCommand = pigpioOpenSocket(addrStr, portStr); if (gPigCommand >= 0) { gPigNotify = pigpioOpenSocket(addrStr, portStr); if (gPigNotify >= 0) { gPigHandle = pigpio_command(gPigNotify, PI_CMD_NOIB, 0, 0, 1); if (gPigHandle < 0) return pigif_bad_noib; else { gLastLevel = read_bank_1(); pthNotify = start_thread(pthNotifyThread, 0); if (pthNotify) { gPigStarted = 1; return 0; } else return pigif_notify_failed; } } else return gPigNotify; } else return gPigCommand; } return 0; }
void t8() { int v, t, i; printf("Bank read/write tests.\n"); gpio_write(GPIO, 0); v = read_bank_1() & (1<<GPIO); CHECK(8, 1, v, 0, 0, "read bank 1"); gpio_write(GPIO, 1); v = read_bank_1() & (1<<GPIO); CHECK(8, 2, v, (1<<GPIO), 0, "read bank 1"); clear_bank_1(1<<GPIO); v = gpio_read(GPIO); CHECK(8, 3, v, 0, 0, "clear bank 1"); set_bank_1(1<<GPIO); v = gpio_read(GPIO); CHECK(8, 4, v, 1, 0, "set bank 1"); t = 0; v = (1<<16); for (i=0; i<100; i++) { if (read_bank_2() & v) t++; }; CHECK(8, 5, t, 60, 75, "read bank 2"); v = clear_bank_2(0); CHECK(8, 6, v, 0, 0, "clear bank 2"); v = clear_bank_2(0xffffff); CHECK(8, 7, v, PI_SOME_PERMITTED, 0, "clear bank 2"); v = set_bank_2(0); CHECK(8, 8, v, 0, 0, "set bank 2"); v = set_bank_2(0xffffff); CHECK(8, 9, v, PI_SOME_PERMITTED, 0, "set bank 2"); }
void t8(int pi) { int v; printf("Bank read/write tests.\n"); gpio_write(pi, GPIO, 0); v = read_bank_1(pi) & (1<<GPIO); CHECK(8, 1, v, 0, 0, "read bank 1"); gpio_write(pi, GPIO, 1); v = read_bank_1(pi) & (1<<GPIO); CHECK(8, 2, v, (1<<GPIO), 0, "read bank 1"); clear_bank_1(pi, 1<<GPIO); v = gpio_read(pi, GPIO); CHECK(8, 3, v, 0, 0, "clear bank 1"); set_bank_1(pi, 1<<GPIO); v = gpio_read(pi, GPIO); CHECK(8, 4, v, 1, 0, "set bank 1"); v = read_bank_2(pi); if (v) v = 0; else v = 1; CHECK(8, 5, v, 0, 0, "read bank 2"); v = clear_bank_2(pi, 0); CHECK(8, 6, v, 0, 0, "clear bank 2"); v = clear_bank_2(pi, 0xffffff); CHECK(8, 7, v, PI_SOME_PERMITTED, 0, "clear bank 2"); v = set_bank_2(pi, 0); CHECK(8, 8, v, 0, 0, "set bank 2"); v = set_bank_2(pi, 0xffffff); CHECK(8, 9, v, PI_SOME_PERMITTED, 0, "set bank 2"); }
int pigpio_start(char *addrStr, char *portStr) { int pi; int *userdata; for (pi=0; pi<MAX_PI; pi++) { if (!gPiInUse[pi]) break; } if (pi >= MAX_PI) return pigif_too_many_pis; gPiInUse[pi] = 1; pthread_mutex_init(&gCmdMutex[pi], NULL); gPigCommand[pi] = pigpioOpenSocket(addrStr, portStr); if (gPigCommand[pi] >= 0) { gPigNotify[pi] = pigpioOpenSocket(addrStr, portStr); if (gPigNotify[pi] >= 0) { gPigHandle[pi] = pigpio_notify(pi); if (gPigHandle[pi] < 0) return pigif_bad_noib; else { gLastLevel[pi] = read_bank_1(pi); /* must be freed by pthNotifyThread */ userdata = malloc(sizeof(*userdata)); *userdata = pi; gPthNotify[pi] = start_thread(pthNotifyThread, userdata); if (gPthNotify[pi]) return pi; else return pigif_notify_failed; } } else return gPigNotify[pi]; } else return gPigCommand[pi]; }