Browse Source

Fix issue with not being able to pan/tilt at the slowest possible speed.

extract-visca-communication-to-class
Ed Walker 5 years ago
parent
commit
b5fe33377b
2 changed files with 28 additions and 17 deletions
  1. +23
    -15
      visca_controller/src/visca_controller.cpp
  2. +5
    -2
      visca_controller/src/visca_controller.h

+ 23
- 15
visca_controller/src/visca_controller.cpp View File

@ -173,14 +173,22 @@ void sendZoomPacket(byte zoomDir, int zoomSpeed) {
sendViscaPacket(zoomCommand, sizeof(zoomCommand)); sendViscaPacket(zoomCommand, sizeof(zoomCommand));
} }
bool getAnalogActiveStatus(uint8_t input) {
bool getAnalogCurrentStatus(uint8_t input) {
return (bool) bitRead(analogCurrentStatus, input); return (bool) bitRead(analogCurrentStatus, input);
} }
void setAnalogActiveStatus(uint8_t input, bool status) {
void setAnalogCurrentStatus(uint8_t input, bool status) {
bitWrite(analogCurrentStatus, input, (int) status); bitWrite(analogCurrentStatus, input, (int) status);
} }
bool getAnalogPreviousStatus(uint8_t input) {
return (bool) bitRead(analogPreviousStatus, input);
}
void setAnalogPreviousStatus(uint8_t input, bool status) {
bitWrite(analogPreviousStatus, input, (int) status);
}
bool getPreviousButtonStatus(uint8_t input) { bool getPreviousButtonStatus(uint8_t input) {
return (bool) bitRead(buttonPreviousStatus, input); return (bool) bitRead(buttonPreviousStatus, input);
} }
@ -209,18 +217,19 @@ void processZoom(int zoom) {
zoomCommand[4] = zoomDirSpeed; zoomCommand[4] = zoomDirSpeed;
sendViscaPacket(zoomCommand, sizeof(zoomCommand)); sendViscaPacket(zoomCommand, sizeof(zoomCommand));
} }
setAnalogActiveStatus(2, true);
setAnalogCurrentStatus(2, true);
} else { } else {
// Stop Zoom // Stop Zoom
if (getAnalogActiveStatus(2) == true) {
if (getAnalogCurrentStatus(2) == true) {
sendViscaPacket(zoomStop, sizeof(zoomStop)); sendViscaPacket(zoomStop, sizeof(zoomStop));
setAnalogActiveStatus(2, false);
setAnalogCurrentStatus(2, false);
} }
} }
} }
void processPan(int pan) { void processPan(int pan) {
if (pan < panThresholds[0] || panThresholds[1] < pan) { if (pan < panThresholds[0] || panThresholds[1] < pan) {
setAnalogCurrentStatus(0, true);
uint8_t panSpeed; uint8_t panSpeed;
if (pan < panThresholds[0]) { if (pan < panThresholds[0]) {
// Left // Left
@ -232,24 +241,24 @@ void processPan(int pan) {
panTilt[6] = 0x02; panTilt[6] = 0x02;
} }
if (panTilt[4] != panSpeed) {
if (panTilt[4] != panSpeed || getAnalogCurrentStatus(0) != getAnalogPreviousStatus(0)) {
panTilt[4] = panSpeed; panTilt[4] = panSpeed;
sendViscaPacket(panTilt, sizeof(panTilt)); sendViscaPacket(panTilt, sizeof(panTilt));
} }
setAnalogActiveStatus(0, true);
} else { } else {
setAnalogCurrentStatus(0, false);
// Stop Pan // Stop Pan
panTilt[4] = 0x00;
panTilt[6] = 0x03; panTilt[6] = 0x03;
if (getAnalogActiveStatus(0) == true) {
if (getAnalogCurrentStatus(0) == false && getAnalogPreviousStatus(0) == true) {
sendViscaPacket(panTilt, sizeof(panTilt)); sendViscaPacket(panTilt, sizeof(panTilt));
setAnalogActiveStatus(0, false);
} }
} }
setAnalogPreviousStatus(0, getAnalogCurrentStatus(0));
} }
void processTilt(int tilt) { void processTilt(int tilt) {
if (tilt < tiltThresholds[0] || tiltThresholds[1] < tilt) { if (tilt < tiltThresholds[0] || tiltThresholds[1] < tilt) {
setAnalogCurrentStatus(1, true);
uint8_t tiltSpeed; uint8_t tiltSpeed;
if (tilt < tiltThresholds[0]) { if (tilt < tiltThresholds[0]) {
// Down // Down
@ -261,20 +270,19 @@ void processTilt(int tilt) {
panTilt[7] = 0x01; panTilt[7] = 0x01;
} }
if (panTilt[5] != tiltSpeed) {
if (panTilt[5] != tiltSpeed || getAnalogCurrentStatus(1) != getAnalogPreviousStatus(1)) {
panTilt[5] = tiltSpeed; panTilt[5] = tiltSpeed;
sendViscaPacket(panTilt, sizeof(panTilt)); sendViscaPacket(panTilt, sizeof(panTilt));
} }
setAnalogActiveStatus(1, true);
} else { } else {
setAnalogCurrentStatus(1, false);
// Stop Tilt // Stop Tilt
panTilt[5] = 0x00;
panTilt[7] = 0x03; panTilt[7] = 0x03;
if (getAnalogActiveStatus(1) == true) {
if (getAnalogCurrentStatus(1) == false && getAnalogPreviousStatus(1) == true) {
sendViscaPacket(panTilt, sizeof(panTilt)); sendViscaPacket(panTilt, sizeof(panTilt));
setAnalogActiveStatus(1, false);
} }
} }
setAnalogPreviousStatus(1, getAnalogCurrentStatus(1));
} }
void toggleFocusControl() { void toggleFocusControl() {


+ 5
- 2
visca_controller/src/visca_controller.h View File

@ -51,6 +51,7 @@ byte buttonPreviousStatus = 0x00;
byte buttonCurrentStatus = 0x00; byte buttonCurrentStatus = 0x00;
byte analogCurrentStatus = 0x00; byte analogCurrentStatus = 0x00;
byte analogPreviousStatus = 0x00;
const int ptMaxSpeed = 5; const int ptMaxSpeed = 5;
int panThresholds[2] = {0, 0}; int panThresholds[2] = {0, 0};
int tiltThresholds[2] = {0, 0}; int tiltThresholds[2] = {0, 0};
@ -121,8 +122,10 @@ bool buttonPressed(uint8_t button);
bool buttonReleased(uint8_t button); bool buttonReleased(uint8_t button);
bool getCurrentButtonStatus(uint8_t button); bool getCurrentButtonStatus(uint8_t button);
void sendZoomPacket(byte zoomDir, int zoomSpeed); void sendZoomPacket(byte zoomDir, int zoomSpeed);
bool getAnalogActiveStatus(uint8_t input);
void setAnalogActiveStatus(uint8_t input, bool status);
bool getAnalogCurrentStatus(uint8_t input);
void setAnalogCurrentStatus(uint8_t input, bool status);
bool getAnalogPreviousStatus(uint8_t input);
void setAnalogPreviousStatus(uint8_t input, bool status);
bool getPreviousButtonStatus(uint8_t input); bool getPreviousButtonStatus(uint8_t input);
void setButtonStatus(uint8_t input, bool status); void setButtonStatus(uint8_t input, bool status);
void processPan(int pan); void processPan(int pan);


Loading…
Cancel
Save