#include <bluesense.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
bsOCOutputDevice_portEnum parsePort(char* s) {
char side = s[0];
uint8_t output = atoi(&s[1]);
switch (side) {
case 'A': {
switch (output) {
case 1: return bsOCOutput_pA_1;
case 2: return bsOCOutput_pA_2;
case 3: return bsOCOutput_pA_3;
case 4: return bsOCOutput_pA_4;
case 5: return bsOCOutput_pA_5;
case 6: return bsOCOutput_pA_6;
case 7: return bsOCOutput_pA_7;
case 8: return bsOCOutput_pA_8;
}
}
case 'B': {
switch (output) {
case 1: return bsOCOutput_pB_1;
case 2: return bsOCOutput_pB_2;
case 3: return bsOCOutput_pB_3;
case 4: return bsOCOutput_pB_4;
case 5: return bsOCOutput_pB_5;
case 6: return bsOCOutput_pB_6;
case 7: return bsOCOutput_pB_7;
case 8: return bsOCOutput_pB_8;
}
}
}
return bsOCOutput_pA_1;
}
int main(int argc, char **argv) {
char *progname = *argv++; argc--;
if(argc < 3) {
fprintf(stderr, "\n");
fprintf(stderr,
"Please re-run this example with:\n");
fprintf(stderr,
" identifier: identifier of the module\n");
fprintf(stderr,
" port: output pin (A1..A6, B1..B6)\n");
fprintf(stderr,
" value: pwmdutycycle (0..255)\n");
fprintf(stderr, "\n");
fprintf(stderr,
"Usage: %s <identifier> <port> <pwm duty cycle 0..255>\n", progname);
fprintf(stderr,
" eg: %s 10 A2 200\n", progname);
fprintf(stderr, "\n");
fprintf(stderr,
"To find out what devices are connected try the 'list_devices' example.\n");
fprintf(stderr, "\n");
return(1);
}
identifier_t id = atoi(argv[0]);
bsOCOutputDevice_portEnum port = parsePort(argv[1]);
uint8_t dutycycle = atoi(argv[2]);
bsDeviceInterface_registeredDeviceInterfaces_t registered =
bsDeviceInterface_allocInterfaceTable();
bsDeviceTable_table_t devices = bsDeviceTable_allocDeviceTable();
bsMaster_device_t master = bsMaster_allocMaster(registered,devices,0);
printf("Detecting device %d...\n", id);
fflush(stdout);
bsDeviceTable_deviceInfo_t dev =
bsMaster_detectDevice(master, id, 5 * 1000 * 1000);
if(!dev) {
fprintf(stderr, "Device %d not found!\n", id);
bsMaster_freeMaster(master);
bsDeviceTable_freeDeviceTable(devices);
bsDeviceInterface_freeInterfaceTable(registered);
return(0);
}
if (bsDeviceTable_getDeviceFirmwareVersion(dev)<2) {
fprintf(stderr,
"PWM only supported on OCOutput module with firmware 2+!\n");
bsMaster_freeMaster(master);
bsDeviceTable_freeDeviceTable(devices);
bsDeviceInterface_freeInterfaceTable(registered);
return(0);
}
bsOCOutputDevice_specifics_t specDev = bsOCOutputDevice_getDeviceSpecifics(dev);
fflush(stdout);
uint8_t i = 0;
uint32_t autoYieldParam =0;
autoYieldParam = bsMaster_autoYield(master,200000,2000,autoYieldParam);
bsOCOutputDevice_requestSetPWMDutyCycle(specDev,port,dutycycle);
autoYieldParam = bsMaster_autoYield(master,200000,2000,autoYieldParam);
printf("Device %d current outputs: %d\n", id,bsOCOutputDevice_getCurrentOutputs(specDev));
for (i=0; i<16; i++) {
printf(" PWM port %d has a duty cycle of %d\n",
i,
bsOCOutputDevice_getCurrentPWMDutyCycle(specDev,i));
}
bsMaster_freeMaster(master);
bsDeviceTable_freeDeviceTable(devices);
bsDeviceInterface_freeInterfaceTable(registered);
return(0);
}