Issues with receiving Serial (RS232) from Sony Camera

I'm building a VISCA controller to control 24 Sony EVI-D70 cameras.

I have written all the code from scratch thus far up to and including:
-Sending commands with the use of a custom library I made.
-Switching between different cameras with another Arduino mega board via software serial.
-LCD display feedback.
-A few LED 7 segment displays to display some more information.
-A 4D joystick.
A keypad and some other various controls here and there.

All that works flawlessly. Now I'm running in to issues!!! The issues I'm having is that I need to do a checksum to see if the camera I'm selecting is even alive by pinging it with the Power Inquire command and waiting for a reply.

When I first power everything up, it works perfectly. When I exit that camera and go into another one, I get the error code and the program gets stuck on the controller Arduino.

Just a little insight on how things are hooked up. The softserial is just sending a two digit integer to the other Arduino to run on that port (relay), then the controller waits for a reply back from the port Arduino to say "Hi I'm here, relay is on, proceed with checksum!" Works great, then the code goes to the next case to checksum the camera through the hardware serial port itself through the relay port, first time around, all good, now I'm controlling the camera!! Second time through, nothing, error, and freeze.

I will post the part I think is the problem. Let me know if you want the rest of the code from the main Arduino and how to post it because it is closing in on 1682 lines. Now if I do post the whole code, please for the love of god do not criticize me on redundant code, or non over use of arrays or the over use of state machines inside functions LOL as this is still a work in progress to see if I can get everything talking correctly.

//Camera Checksum
void cameraChecksum(byte x)
{
  camFailKey = kp.getKey();
  switch(checksumSwitch)
  {
    case 0:
      if(connectedFlag)
      {
        checksumSwitch = 1;
      }
      break;
    case 1:
      cam.getPower();
      //Serial.write((byte) 0x81);
      //Serial.write((byte) 0x09);
      //Serial.write((byte) 0x04);
      //Serial.write((byte) 0x00);
      //Serial.write((byte) 0xFF);
      delay(17);
      checksumSwitch = 2;
      break;
      
    case 2:
      while(Serial.available() > 0)
      {
        byte b = Serial.read();
        variable[index++] = b;
      }
      if(index == 4)
      {
        checksumSwitch = 3;
      }
      else if(index > 4 || index == 0)
      //else if(Serial.available() <= 0)
      {
        index = 0;
        memset(variable, 0, sizeof(variable));
        checksumSwitch = 4;
      }
      break;
      
    case 3:
        if(variable[1] == 0x50)
        {
          if(variable[3] == 0xFF)
          {
            //Serial.end();
            index = 0;
            memset(variable, 0, sizeof(variable));
          }
          connected();
          lcdWrite(4, 0, F("Connected to    "));
          lcdWrite(4, 1, camString + x + singleSpace + singleSpace + singleSpace + singleSpace + singleSpace + singleSpace + singleSpace + singleSpace);
          vergilCommand(0, 2);
          delay(2500);
          index = 0;
          memset(variable, 0, sizeof(variable));
          states = controlCamera;
        }
      break;
      
    case 4:
      clearVault();
      lcdWrite(4, 0, F("No Data from    "));
      lcdWrite(4, 1, camString + x + deadSpace5 + singleSpace + singleSpace + singleSpace);
      vergilCommand(0, 6);
      conFail();
      delay(2000);
      error(0, 3);
      delay(2500);
      checksumSwitch = 5;
      break;
      
    case 5:
      if(camFailKey == 'P') {returning();}
      noRS232(0);
      blanking(1);
      lcdWrite(4, 0, noConTo + x + singleSpace);
      lcdWrite(3, 1, F(" --------------"));
      specChar(18, 1, 1);
      vergilBlink();
      break;
      
    default:
      checksumSwitch = 0;
      return;
  }
}
//End Camera Checksum

And with all that said, when the connection fails the second time, the 'P' key will not put me in the "returning()" function to go back to the main screen. . . But it works when the camera connects the first time. Please let me know if you require any further information as this is the first time I'm reaching out on this project. Made it pretty far with no help :stuck_out_tongue:

This is where serial.Print(some message) will show you step by step the actual logic of your program code. Then you can see the logic problem.

1 Like

Will do that now. Don't know why I didn't think of this before LOL, TY

With more experience, you will include such debugging in your original code.

1 Like

Things might work better if you try a new keyboard or typist.

The larger [ENTER] key positioned toward the right side (near the letters P and L) will break lines into paragraphs that allow you to separate ideas, and make it easier for the reader to absorb your thoughts.

//Camera Checksum
void cameraChecksum(byte x)
{
  camFailKey = kp.getKey();
  switch(checksumSwitch)
  {
    case 0:
      if(connectedFlag)
      {
        Serial.println("Connected Flag is True");
        checksumSwitch = 1;
      }
      else
      {
        Serial.println("Connected Flag is False");
      }
      break;
    case 1:
      Serial.println("Sending Inquire Command");
      cam.getPower();
      //Serial.write((byte) 0x81);
      //Serial.write((byte) 0x09);
      //Serial.write((byte) 0x04);
      //Serial.write((byte) 0x00);
      //Serial.write((byte) 0xFF);
      delay(17);
      Serial.println("Inquire Sent");
      checksumSwitch = 2;
      break;
      
    case 2:
      while(Serial.available() > 0)
      {
        byte b = Serial.read();
        variable[index++] = b;
        Serial.println("Checking for available");
      }
      if(index == 4)
      {
        Serial.println("Index = 4");
        checksumSwitch = 3;
      }
      else if(index > 4 || index == 0)
      //else if(Serial.available() <= 0)
      {
        Serial.println("Index is > 4 / index == 0");
        index = 0;
        memset(variable, 0, sizeof(variable));
        checksumSwitch = 4;
      }
      break;
      
    case 3:
        if(variable[1] == 0x50)
        {
          Serial.println("Variable 1 = 0x50");
          if(variable[3] == 0xFF)
          {
            Serial.println("variable 3 = 0xFF");
            //Serial.end();
            index = 0;
            memset(variable, 0, sizeof(variable));
          }
          Serial.println("Connected!");
          connected();
          lcdWrite(4, 0, F("Connected to    "));
          lcdWrite(4, 1, camString + x + singleSpace + singleSpace + singleSpace + singleSpace + singleSpace + singleSpace + singleSpace + singleSpace);
          vergilCommand(0, 2);
          delay(2500);
          index = 0;
          memset(variable, 0, sizeof(variable));
          states = controlCamera;
        }
      break;
      
    case 4:
      clearVault();
      lcdWrite(4, 0, F("No Data from    "));
      lcdWrite(4, 1, camString + x + deadSpace5 + singleSpace + singleSpace + singleSpace);
      vergilCommand(0, 6);
      conFail();
      delay(2000);
      error(0, 3);
      delay(2500);
      checksumSwitch = 5;
      break;
      
    case 5:
      if(camFailKey == 'P') {returning();}
      noRS232(0);
      blanking(1);
      lcdWrite(4, 0, noConTo + x + singleSpace);
      lcdWrite(3, 1, F(" --------------"));
      specChar(18, 1, 1);
      vergilBlink();
      break;
      
    default:
      checksumSwitch = 0;
      return;
  }
}
//End Camera Checksum

So I put in the serial.println(some text); commands and now it won't even connect to the camera the first time around :frowning: However I can now exit with the 'P' key. . . This is annoying to say the least. Here is the print out on the serial monitor:

Connected Flag is True
Sending Inquire Command
⸮	
Inquire Sent
Index is > 4 / index == 0

And the second time I try to connnect:

⸮⸮Connected Flag is True
Sending Inquire Command
⸮	⸮Inquire Sent
Checking for available
Checking for available
Checking for available
Checking for available
Checking for available
Checking for available
Checking for available
Checking for available
Checking for available
Checking for available
Checking for available
Index is > 4 / index == 0

Ideas? Because I'm out of em. Been on this problem for about 3 days with only little success. Before I was getting a big ol' nothing out of the camera when sending the inquire commands the I get something just once, now with the debug code I get nothing :frowning:

Real nice, see this is why I don't ask for help because of pompoms asses such as yourself. I will go back and fix the damn OP. I was just getting out the information as quick as possible . . . I'm already frustrated with my project and I come on here and get an insult by the 6th post. . .

If you have nothing nice to say or want to offer any ideas, then don't be a troll and go someplace else. How is that for seperating in to paragraphs for you. See, main thought in paragraph one and closing statement in paragraph 2. Is this what you mean? :stuck_out_tongue:

Got some news. I moved everthing into the while(Serial.available() >0) statement and it is working as before. But I have more data on wtf is going on. Here is the output when it successfully connects:

Connected Flag is True
Sending Inquire Command
⸮	Inquire Sent
Checking for available
90
Checking for available
50
Checking for available
2
Checking for available
FF
Index = 4
Variable 1 = 0x50
variable 3 = 0xFF
Connected!

and here it is on the second attempt that is failed:

Connected Flag is True
Sending Inquire Command
⸮	Inquire Sent
Checking for available
90
Checking for available
41
Checking for available
FF
Checking for available
90
Index = 4
Checking for available
51
Index is > 4 / index == 0
Checking for available
FF
Checking for available
90
Checking for available
41
Checking for available
FF
Index = 4
Checking for available
90
Index is > 4 / index == 0
Checking for available
51
Checking for available
FF
Checking for available
90
Checking for available
61
Index = 4
Checking for available
41
Index is > 4 / index == 0
Checking for available
FF
Checking for available
90
Checking for available
41
Checking for available
FF
Index = 4
Checking for available
90
Index is > 4 / index == 0
Checking for available
51
Checking for available
FF
Checking for available
90
Checking for available
62
Index = 4
Checking for available
41
Index is > 4 / index == 0
Checking for available
FF
Checking for available
90
Checking for available
41
Checking for available
FF
Index = 4
Checking for available
90
Index is > 4 / index == 0
Checking for available
42
Checking for available
FF
Checking for available
90
Checking for available
52
Index = 4
Checking for available
FF
Index is > 4 / index == 0
Checking for available
90
Checking for available
51
Checking for available
FF
Checking for available
90
Index = 4
Checking for available
62
Index is > 4 / index == 0
Checking for available
41
Checking for available
FF
Checking for available
90
Checking for available
41
Index = 4
Checking for available
FF
Index is > 4 / index == 0
Checking for available
90
Checking for available
51
Checking for available
FF
Checking for available
90
Index = 4
Checking for available
41
Index is > 4 / index == 0
Checking for available
FF
Checking for available
90
Checking for available
51
Checking for available
FF
Index = 4
Checking for available
90
Index is > 4 / index == 0
Checking for available
41
Checking for available
FF
Checking for available
90
Checking for available
51
Index = 4
Checking for available
FF
Index is > 4 / index == 0
Checking for available
90
Checking for available
61
Checking for available
41
Checking for available
90
Index = 4
Checking for available
50
Index is > 4 / index == 0

Not sure why the second time around I get so much junk. . .

I think you missed the point.
I was pointing out some tips to help you communicate better.

TBH, I didn’t get pas the first two sentences of the first post because my pompous ass got in the way….

Despite having worked for Sony, and developed a ton of serial applications, I only work with people that are interested in helping themselves grow and improve their skills.
You’ve shown that you’re not really interested in growing as a developer.

<\pompous>

Would you like to see the rest of the code I made to control your equipment? I mean these cameras are not only easy to work on hardware wise, but the documentation is absolutely amazing to say the least. That is the only reason I have made it this far with them. I seem to have the drive to work on this for over 2 months just with the print out of the service manual and make it as far as I did with it.

It was the way you came at me right away instead of asking me nicely to type better straight away, and being a smarta$$ about the enter key. Just really pushed my buttons (so to speak lol) that's all.

uint8_t sorry(byte x, String please)
{
  Willing_to_be_nice_from_here_on_out(x, please);
  return help;
}

:stuck_out_tongue:

Still trying to get this going. I've done a few things and posted the updated code, but still the same issues.

TRUE
There are a LOT of people here that should read the booklet -
“Writing for the reader”

Out of all fairness I wasn't coming on here to ask how to be a better typist or writer, I was coming on here to ask for help with some serial communication between my project and the Sony. So sorry that I offended you so much with my grammar mistakes in the OP, which I have fixed by the way. You brought up good points in your first post, so I took them and fixed the OP.

Now would you be willing to give me a hand with this issue or am I at a loss here, back to doing it on my own?

This is a bit tricky without exactly the same gear sitting in front of us.
The breakout and a scope would help, but there’s a bit of black magic required to implement an interface from scratch.

RS232 can require hardware or software handshaking (pins 4,5,6 &20) to allow traffic. The sex of the connectors and DCE/DTE pinouts are pretty loose nowadays, so they can help or hinder - that’s where the breakout or scope can help. A scope wil be a great help, so you can see the voltages, polarity and bitstream.

One thing worth finding out, are the signals true RS232 voltages or 0/5V

Sadly, my experience with Sony equipment wasn’t with consumer or prosumer gear, so my suggestions are generic - having dealt with literally hundreds of 232 and 422 interfaces.

1 Like

Thank you for the reply :slight_smile:
The manual says that the cameras can use either RS232C from the 8 pin mini DIN or the RS485 from the screw terminal block on the back. The manual also states that handshaking is not supported. I have about 40 something of these Sony EVI-D70 cameras that I got from a hospital liquidation really cheep.

Unfortunately I didn't bother to ask for any of the control gear LOL. Got them quite a while back and found them again when going through one of the warehouses.

The code and library I have written so far can control the camera(s) just fine. So I know at least the Sony can receive data, and as stated in a few posts already, can also send data just fine. I'm really thinking it is my code somewhere. I'm going to post the main program code because I'm pretty sure the other board's code is fine and irrelevant at this point. Give me a few minutes and I'll try to get it on here. Again, it is long and kind of drawn out, but most of it is in functions and the whole lower 5 - 600 lines are for LCD and LED Display stuff, so I'd ignore that bit.

I can say that I was not able to communicate with the Sony without a max232 chip between. I did read somewhere that RS232C is a lower voltage standard and that is what the manual says the Sony uses.

P.S. I would ignore post 19 all together because it is LED display screen data only. I don't think that has anything to do with the serial receive issues I'm having. Furthermore, please let me know if you would like to see the library as well.

#include <SONYEVID70.h>
#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
#include <Keypad.h>
#include <LedControl.h>

#define txPin 52
#define rxPin 53
#define homePos 48
#define aFocus 49
#define aFocusToggle 46
#define powerButton 47
#define programBits 4

//Program Commands:
char data[programBits];
char cam01[programBits] = "01";
char cam02[programBits] = "02";
char cam03[programBits] = "03";
char cam04[programBits] = "04";
char cam05[programBits] = "05";
char cam06[programBits] = "06";
char cam07[programBits] = "07";
char cam08[programBits] = "08";
char cam09[programBits] = "09";
char cam10[programBits] = "10";
char cam11[programBits] = "11";
char cam12[programBits] = "12";
char cam13[programBits] = "13";
char cam14[programBits] = "14";
char cam15[programBits] = "15";
char cam16[programBits] = "16";
char cam17[programBits] = "17";
char cam18[programBits] = "18";
char cam19[programBits] = "19";
char cam20[programBits] = "20";
char cam21[programBits] = "21";
char cam22[programBits] = "22";
char cam23[programBits] = "23";
char cam24[programBits] = "24";
byte dataCount = 0;
//End Program Commands

//System Objects:
const int lcdRs = 2, lcdEn = 3, lcdD4 = 4, lcdD5 = 5, lcdD6 = 6, lcdD7 = 7;
LiquidCrystal lcd(lcdRs, lcdEn, lcdD4, lcdD5, lcdD6, lcdD7);
SoftwareSerial ser = SoftwareSerial(rxPin, txPin);
SONYEVID70 cam(Serial);
LedControl led7seg = LedControl(A13, A15, A14, 2);
//End Objects

//Keypad Setup:
const byte ROWS = 5;
const byte COLS = 4;
byte rowPins[ROWS] = {8, 9, 10, 11, 12};
byte colPins[COLS] = {A7, A6, A5, A4};
char keys[ROWS][COLS] =
{
  {'-P', '-N', '-H', '-W'},
  {'7', '8', '9', '-D'},
  {'4', '5', '6', '-D'},
  {'1', '2', '3', '-E'},
  {'0', '0', '-', '-E'}
};
Keypad kp = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
char num;
char eKey;
char vaultChecksumKey;
char camControlKey;
char camFailKey;
//End Keypad Setup

//System Integers:
int xAxis = 0;
int yAxis = 0;
int zAxis = 0;
int fAxis = 0;
int homePosState = 0;
int aFocusState = 0;
int aFocusToggleState = 0;
int powerState = 0;
//End System Integers

//System Cases:
byte camCase = 0;
byte ani = 0;
byte vaultNum = 0;
byte checksumSwitch = 0;
//End System Cases

//System Flags:
boolean blankFlag = true;
boolean powerFlag = false;
boolean noCamFlag = false;
boolean aniFlag = false;
boolean noRS232Flag = false;
boolean connectingFlag = false;
boolean connectedFlag = false;
boolean vaultDataFlag = false;
boolean errorFlag = false;
boolean clearFlag = false;
//End System Flags

//FSM:
enum states {clearAll, enterCamera, vaultConnecting, cameraConnecting, controlCamera, exitCamera} states = enterCamera;
//End FSM

//System Timers:
const long noCamInterval = 2500;
unsigned long noCamPreviousMillis = 0;
const long noRS232Interval = 1000;
unsigned long noRS232PreviousMillis = 0;
unsigned long previousVIdle = 0;
unsigned long previousVBlink = 0;
unsigned long aniInterval = 100;  //Segment Swirl Interval
//End System Timers

//RNG:
long randBlink;
long randNum;
long randNumIdle;
//End RNG

//Strings:
String deadSpace20 = "                    ";  //20 Spaces to clear a line on the LCD.
String deadSpace16 = "                ";  //16 Spaces to clear a line on the LCD.
String deadSpace5 = "     ";  //5 Spaces to clear a spot on the LCD.
String camControl = "Control Cam ";
String noCom = "No Com. Data ";
String noVault = "No Vault Data ";
String goodCon = " Connected to    ";
String vaultCon = "Vault Port # ";
String vaultConFail = " Connection to ";
String vaultConFail2 = " Vault Failed  ";
String camString = "Camera ";
String noConTo = "No Cam. Data ";
const char singleSpace = ' ';
//End Strings

//Ping Flags:
boolean ping01 = false;
boolean ping02 = false;
boolean ping03 = false;
boolean ping04 = false;
boolean ping05 = false;
boolean ping06 = false;
boolean ping07 = false;
boolean ping08 = false;
boolean ping09 = false;
boolean ping10 = false;
boolean ping11 = false;
boolean ping12 = false;
boolean ping13 = false;
boolean ping14 = false;
boolean ping15 = false;
boolean ping16 = false;
boolean ping17 = false;
boolean ping18 = false;
boolean ping19 = false;
boolean ping20 = false;
boolean ping21 = false;
boolean ping22 = false;
boolean ping23 = false;
boolean ping24 = false;
//End Pings

//Vault Serial Variables:
const char startDelimiter = '<';
const char endDelimiter = '>';
byte serialData = 0;
//End Vault Serial Variables

//Camera Ping Variables:
byte variable[16];
byte index = 0;
//End Camera Pings




//Setup
void setup()
{
  analogReference(EXTERNAL);

  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  Serial.begin(9600);
  delay(1000);
  ser.begin(9600);
  delay(1000);

  pinMode(homePos, INPUT_PULLUP);
  pinMode(aFocus, INPUT_PULLUP);
  pinMode(aFocusToggle, INPUT_PULLUP);
  pinMode(powerButton, INPUT_PULLUP);
  
  lcd.begin(20, 2);
  lcd.setCursor(0, 0);

  led7seg.shutdown(0, false);  //Shuts down device (Address of device, Boolean"false" for on, "true" for off)
  led7seg.setIntensity(0, 1);  //Sets Brightness (Address of device, Brightness(0 - 15)
  led7seg.setScanLimit(0, 8);  //Sets number of digits (Address of device, Number of Digits(1 - 8)
  led7seg.clearDisplay(0);  //Clears Display (Address of device)
  led7seg.shutdown(1, false);
  led7seg.setIntensity(1, 1);
  led7seg.setScanLimit(1, 8);
  led7seg.clearDisplay(1);

  randomSeed(analogRead(A13));
}
//End Setup




//VERGIL CONTROL HANDLER FUNCTIONS:
//Vergil Face Control Handler:
void vergilControl(byte col, byte row, long a, long b, long c, long d, long e, long f, long g, long h, long i, long j, long k, long l)
{
  byte image0[8] = {B00000, B00000, B00011, B00100, B01000, B10000, a, b};  //UL
  byte image1[8] = {B00000, B00000, B11111, B00000, B00000, B00000, c, d};  //UM
  byte image2[8] = {B00000, B00000, B11000, B00100, B00010, B00001, e, f};  //UR
  byte image3[8] = {g, h, B10000, B01000, B00100, B00011, B00000, B00000};  //LL
  byte image4[8] = {i, j, B00000, B00000, B00000, B11111, B00000, B00000};  //LM
  byte image5[8] = {k, l, B00001, B00010, B00100, B11000, B00000, B00000};  //LR

  lcd.createChar(1, image0);
  lcd.createChar(2, image1);
  lcd.createChar(3, image2);
  lcd.createChar(4, image3);
  lcd.createChar(5, image4);
  lcd.createChar(6, image5);

  lcd.setCursor(col, row);
  lcd.write(1);
  lcd.setCursor(col + 1, row);
  lcd.write(2);
  lcd.setCursor(col + 2, row);
  lcd.write(3);
  lcd.setCursor(col, row + 1);
  lcd.write(4);
  lcd.setCursor(col + 1, row + 1);
  lcd.write(5);
  lcd.setCursor(col + 2, row + 1);
  lcd.write(6);
}
//End Vergil Face Control Handler




//Vergil Face Select:
void vergilCommand(byte col, byte select)
{
  switch(select)
  {
    case 0:
      //Do Nothing Here
      break;
    case 1:  //Idle
      vergilControl(col, 0, B10001, B10011, B10001, B11011, B10001, B11001, B10011, B10001, B11011, B10001, B11001, B10001);
      break;
    case 2:  //up
      vergilControl(col, 0, B10001, B10011, B10001, B11011, B10001, B11001, B10000, B10000, B00000, B00000, B00001, B00001);
      break;
    case 3:  //Down
      vergilControl(col, 0, B10000, B10000, B00000, B00000, B00001, B00001, B10011, B10001, B11011, B10001, B11001, B10001);
      break;
    case 4:  //Happy
      vergilControl(col, 0, B10001, B10011, B10001, B00000, B10001, B11001, B10010, B10000, B00000, B00000, B01001, B00001);
      break;
    case 5:  //Mad
      vergilControl(col, 0, B10001, B10000, B10001, B11011, B10001, B00001, B10000, B10000, B01010, B00000, B00001, B00001);
      break;
    case 6:  //Sad
      vergilControl(col, 0, B10000, B10000, B00000, B01010, B00001, B00001, B10000, B10001, B11011, B10001, B00001, B10001);
      break;
    case 7:  //Wink Left
      vergilControl(col, 0, B10000, B10000, B00001, B00011, B10001, B11001, B10011, B10001, B11011, B10001, B11001, B10001);
      break;
    case 8:  //Wink Right
      vergilControl(col, 0, B10001, B10011, B10000, B11000, B00001, B00001, B10011, B10001, B11011, B10001, B11001, B10001);
      break;
    default:
      select = 0;
      return;
  }
}
//end Vergil Face Select




//Vergil Blink
void vergilBlink()
{
  unsigned long vBlinkMillis = millis();
  randBlink = random(1000, 50000);

  if(vBlinkMillis - previousVBlink > randBlink)
  {
    previousVBlink = vBlinkMillis;
    if(blankFlag)
    {
      vergilCommand(0, 1);
    }
    else
    {
      vergilCommand(0, 3);
    }
  }
}
//End Vergil Blink




//Vergil Idle Handler:
void vergilIdle()
{
  unsigned long vIdleMillis = millis();
  randNum = random(5000, 100000);
  randNumIdle = random(1, 8);

  if(vIdleMillis - previousVIdle > randNum)
  {
    previousVIdle = vIdleMillis;
    if(blankFlag)
    {
      vergilCommand(0, randNumIdle);
    }
    else
    {
      vergilCommand(0, randNumIdle);
    }
  }
}
//End Vergil Idle Handler




//Special Character Handler:
void specCharHandler(byte col, byte row, long a, long b, long c, long d, long e, long f, long g, long h)
{
  byte image6[8] = {a, b, c, d, e, f, g, h};
  lcd.createChar(7, image6);
  lcd.setCursor(col, row);
  lcd.write(7);
}
//End Special Character Handler




//Special Character Control Handler:
void specChar(byte col, byte row, byte select)
{
  switch(select)
  {
    case 0:
      //Do Nothing Here
      break;
    case 1:  //No Connection
      specCharHandler(col, row, B00000, B01100, B11111, B11100, B11100, B11111, B01100, B00000);
      break;
    default:
      select = 0;
      return;
      break;
  }
}
//End Special Character Control Handler
//END VERGIL CONTROL HANDLER FUNCTIONS




//Process the number data from Vault Program
void processNum(const long n)
{
  ser.println(n);

  //Begin Receive from Main Program Handler
  if(n == 0) { /*Do Nothing*/ }
  else if(n == 10) {ping01 = true;}
  else if(n == 11) {ping02 = true;}
  else if(n == 12) {ping03 = true;}
  else if(n == 13) {ping04 = true;}
  else if(n == 14) {ping05 = true;}
  else if(n == 15) {ping06 = true;}
  else if(n == 16) {ping07 = true;}
  else if(n == 17) {ping08 = true;}
  else if(n == 18) {ping09 = true;}
  else if(n == 19) {ping10 = true;}
  else if(n == 20) {ping11 = true;}
  else if(n == 21) {ping12 = true;}
  else if(n == 22) {ping13 = true;}
  else if(n == 23) {ping14 = true;}
  else if(n == 24) {ping15 = true;}
  else if(n == 25) {ping16 = true;}
  else if(n == 26) {ping17 = true;}
  else if(n == 27) {ping18 = true;}
  else if(n == 28) {ping19 = true;}
  else if(n == 29) {ping20 = true;}
  else if(n == 30) {ping21 = true;}
  else if(n == 31) {ping22 = true;}
  else if(n == 32) {ping23 = true;}
  else if(n == 33) {ping24 = true;}
}
//End Process




//Process the input data from controller
void processInput()
{
  static long receivedNum = 0;
  static boolean negative = false;
  byte serialData = ser.read();
  
  switch(serialData)
  {
    case endDelimiter:
      if(negative)
      {
        processNum(- receivedNum);
      }
      else
      {
        processNum(receivedNum);
      }
      //Fall through on purpose for new number.  No "break;" here
    case startDelimiter:
      receivedNum = 0;
      negative = false;
      break;
      
    case '0' ... '9':
      receivedNum *= 10;
      receivedNum += serialData - '0';
      break;
      
    case '-':
      negative = true;
      break;
  }
}
//End Process




//Loop
void loop()
{

  //Process Incoming Data from Vault
  if(ser.available())
  {
    processInput();
  }
  //End Process
  
  xAxis = analogRead(A0);
  xAxis = (xAxis -512) /2;
  
  yAxis = analogRead(A1);
  yAxis = (yAxis -512) /2;

  zAxis = analogRead(A2);
  zAxis = (zAxis -512) /2;

  fAxis = analogRead(A3);
  fAxis = (fAxis -512) /2;

  switch(states)
  {
    case clearAll:
      cam.IF_Clear();
      delay(20);
      index = 0;
      if(connectingFlag) {connectingFlag = false;}
      if(vaultDataFlag) {vaultDataFlag = false;}
      if(connectedFlag) {connectedFlag = false;}
      if(errorFlag) {errorFlag = false;}
      if(clearFlag) {clearFlag = false;}
      checksumSwitch = 0;
      clearData();
      clearVault();
      states = enterCamera;
      break;
      
    case enterCamera:
      enterCamNum();
      break;
      
    case vaultConnecting:
      switch(vaultNum)
      {
        case 0:
          //Do Nothing Here
          break;
        case 1:
          vaultChecksum(0, 1, 10, ping01);
          break;
        case 2:
          vaultChecksum(0, 2, 11, ping02);
          break;
        case 3:
          vaultChecksum(0, 3, 12, ping03);
          break;
        case 4:
          vaultChecksum(0, 4, 13, ping04);
          break;
        case 5:
          vaultChecksum(0, 5, 14, ping05);
          break;
        case 6:
          vaultChecksum(0, 6, 15, ping06);
          break;
        case 7:
          vaultChecksum(0, 7, 16, ping07);
          break;
        case 8:
          vaultChecksum(0, 8, 17, ping08);
          break;
        case 9:
          vaultChecksum(0, 9, 18, ping09);
          break;
        case 10:
          vaultChecksum(1, 0, 19, ping10);
          break;
        case 11:
          vaultChecksum(1, 1, 20, ping11);
          break;
        case 12:
          vaultChecksum(1, 2, 21, ping12);
          break;
        case 13:
          vaultChecksum(1, 3, 22, ping13);
          break;
        case 14:
          vaultChecksum(1, 4, 23, ping14);
          break;
        case 15:
          vaultChecksum(1, 5, 24, ping15);
          break;
        case 16:
          vaultChecksum(1, 6, 25, ping16);
          break;
        case 17:
          vaultChecksum(1, 7, 26, ping17);
          break;
        case 18:
          vaultChecksum(1, 8, 27, ping18);
          break;
        case 19:
          vaultChecksum(1, 9, 28, ping19);
          break;
        case 20:
          vaultChecksum(2, 0, 29, ping20);
          break;
        case 21:
          vaultChecksum(2, 1, 30, ping21);
          break;
        case 22:
          vaultChecksum(2, 2, 31, ping22);
          break;
        case 23:
          vaultChecksum(2, 3, 32, ping23);
          break;
        case 24:
          vaultChecksum(2, 4, 33, ping24);
          break;
        default:
          vaultNum = 0;
          return;
      }
      break;

    case cameraConnecting:
      cameraChecksum(vaultNum);
      break;

    case controlCamera:
      controlCam();
      break;

    case exitCamera:
      break;
  }
}
//End Loop
//Enter Camera Number:
void enterCamNum()
{
  num = kp.getKey();
  
  if(dataCount == 0)
  {
    noCam();
  }
  
  //mainFunction
  if(num == 'D')
  {
    if(dataCount + 16 > 16)
    {
      lcdWrite(16, 0, F("   "));
      clearData();
    }
  }

  if(!clearFlag)
  {
    lcdWrite(15, 0, deadSpace5);
    clearFlag = true;
  }
  
  lcdWrite(4, 0, F("Cam Select: "));
  lcdWrite(18, 0, F("  "));
  lcdWrite(4, 1, deadSpace16);
  vergilIdle();

  if(num == '1' || num == '2' || num == '3' || num == '4' || num == '5' || num == '6' || num == '7' || num == '8' || num == '9' || num == '0')
  {
    data[dataCount] = num;
    lcd.setCursor(dataCount + 16, 0);
    lcd.print(data[dataCount]);
    dataCount++;
    while(dataCount == 2)
    {
      eKey = kp.getKey();
      if(eKey == 'E')
      {
        dataCount++;
      }
      else if(eKey == 'D')
      {
        lcdWrite(16, 0, F("   "));
        while(dataCount != 0)
        {
          data[dataCount--] = 0;
        }
      }
    }
  }
 
  if(dataCount == programBits - 1)
  {
    if(!strcmp(data, cam01))
    {
      vaultNum = 1;
      states = vaultConnecting;
    }
    else if(!strcmp(data, cam02))
    {
      vaultNum = 2;
      states = vaultConnecting;
    }
    else if(!strcmp(data, cam03))
    {
      vaultNum = 3;
      states = vaultConnecting;
    }
    else if(!strcmp(data, cam04))
    {
      vaultNum = 4;
      states = vaultConnecting;
    }
    else if(!strcmp(data, cam05))
    {
      vaultNum = 5;
      states = vaultConnecting;
    }
    else if(!strcmp(data, cam06))
    {
      vaultNum = 6;
      states = vaultConnecting;
    }
    else if(!strcmp(data, cam07))
    {
      vaultNum = 7;
      states = vaultConnecting;
    }
    else if(!strcmp(data, cam08))
    {
      vaultNum = 8;
      states = vaultConnecting;
    }
    else if(!strcmp(data, cam09))
    {
      vaultNum = 9;
      states = vaultConnecting;
    }
    else if(!strcmp(data, cam10))
    {
      vaultNum = 10;
      states = vaultConnecting;
    }
    else if(!strcmp(data, cam11))
    {
      vaultNum = 11;
      states = vaultConnecting;
    }
    else if(!strcmp(data, cam12))
    {
      vaultNum = 12;
      states = vaultConnecting;
    }
    else if(!strcmp(data, cam13))
    {
      vaultNum = 13;
      states = vaultConnecting;
    }
    else if(!strcmp(data, cam14))
    {
      vaultNum = 14;
      states = vaultConnecting;
    }
    else if(!strcmp(data, cam15))
    {
      vaultNum = 15;
      states = vaultConnecting;
    }
    else if(!strcmp(data, cam16))
    {
      vaultNum = 16;
      states = vaultConnecting;
    }
    else if(!strcmp(data, cam17))
    {
      vaultNum = 17;
      states = vaultConnecting;
    }
    else if(!strcmp(data, cam18))
    {
      vaultNum = 18;
      states = vaultConnecting;
    }
    else if(!strcmp(data, cam19))
    {
      vaultNum = 19;
      states = vaultConnecting;
    }
    else if(!strcmp(data, cam20))
    {
      vaultNum = 20;
      states = vaultConnecting;
    }
    else if(!strcmp(data, cam21))
    {
      vaultNum = 21;
      states = vaultConnecting;
    }
    else if(!strcmp(data, cam22))
    {
      vaultNum = 22;
      states = vaultConnecting;
    }
    else if(!strcmp(data, cam23))
    {
      vaultNum = 23;
      states = vaultConnecting;
    }
    else if(!strcmp(data, cam24))
    {
      vaultNum = 24;
      states = vaultConnecting;
    }

    else
    {
      lcdWrite(4, 0, F("No Such Port    "));
      lcdWrite(4, 1, F("Only 01 - 24     "));
      vergilCommand(0, 3);
      noPort();
      delay(3000);
      lcd.clear();
      clearData();
    }
  }
}
//End Select Camera Number



//Clear Data Handler:
void clearData()
{
  while(dataCount != 0)
  {
    data[dataCount--] = 0;
  }
  return;
}
//End Clear Data Handler



//VAULT CONNECTION CHECKSUM FUNCTIONS:
//Vault Checksum:
void vaultChecksum(byte c1, byte c2, byte v, boolean pingVault)
{
  vaultChecksumKey = kp.getKey();
  if(!connectingFlag)
  {
    connecting(c1, c2);
    lcdWrite(0, 0, deadSpace20);
    lcdWrite(0, 1, deadSpace20);
    vergilCommand(8, 7);
    delay(500);
    vergilCommand(8, 8);
    delay(500);
    vergilCommand(8, 7);
    sendVault(v);
    delay(10);
    ping();
    delay(500);
    vergilCommand(8, 8);
    delay(500);
    if(ser.available())
    {
      vaultDataFlag = true;
    }
    connectingFlag = true;
  }
  if(vaultDataFlag)
  {
    if(!connectedFlag)
    {
      //connected();
      vergilCommand(0, 2);
      lcdWrite(4, 0, goodCon);
      lcdWrite(4, 1, vaultCon + c1 + c2 + singleSpace);
      delay(2500);
      states = cameraConnecting;
      connectedFlag = true;
    }
  }
  else if(!vaultDataFlag)
  {
    if(!errorFlag)
    {
      lcdWrite(4, 0, vaultConFail);
      lcdWrite(4, 1, vaultConFail2);
      vergilCommand(0, 3);
      error(0, 2);
      delay(1500);
      conFail();
      delay(1500);
      errorFlag = true;
    }   
    else if(vaultChecksumKey == 'P') {returning();}
    clearVault();
    noVaultData();
    lcdWrite(4, 0, noVault + c1 + c2);
    lcdWrite(3, 1, F(" --------------"));
    specChar(18, 1, 1);
    vergilBlink();
  }
}
//End Vault Checksum




//Send to Vault:
void sendVault(byte n)
{
  serialData = n;
  ser.print(startDelimiter);
  ser.print(serialData);
  ser.print(endDelimiter);
  ser.println();
  return;
}
//End Send to Vault




//Clear Vault:
void clearVault(void)
{
  serialData = 99;
  ser.print(startDelimiter);
  ser.print(serialData);
  ser.print(endDelimiter);
  ser.println();
  delay(1);
  serialData = 0;
  return;
}
//End Clear Vault




//Ping Vault
void ping()
{
  serialData = 98;
  ser.print(startDelimiter);
  ser.print(serialData);
  ser.print(endDelimiter);
  ser.println();
  return;
}
//End Ping
//END VAULT CONNECTION CHECKSUM FUNCTIONS




//Camera Checksum
void cameraChecksum(byte x)
{
  camFailKey = kp.getKey();
  switch(checksumSwitch)
  {
    case 0:
      if(connectedFlag)
      {
        Serial.println("Connected Flag is True");
        checksumSwitch = 1;
      }
      else
      {
        Serial.println("Connected Flag is False");
      }
      break;
    case 1:
      Serial.println("Sending Inquire Command");
      cam.getPower();
      //Serial.write((byte) 0x81);
      //Serial.write((byte) 0x09);
      //Serial.write((byte) 0x04);
      //Serial.write((byte) 0x00);
      //Serial.write((byte) 0xFF);
      delay(20);
      Serial.println("Inquire Sent");
      checksumSwitch = 2;
      break;
      
    case 2:
      while(Serial.available() > 0)
      {
        byte b = Serial.read();
        variable[index++] = b;
        Serial.println("Checking for available");
        Serial.println(b, HEX);
        if(index == 4)
        {
          Serial.println("Index = 4");
          checksumSwitch = 3;
        }
        else if(index > 4 || index == 0)
        //else if(Serial.available() <= 0)
       {
          Serial.println("Index is > 4 / index == 0");
          index = 0;
          memset(variable, 0, sizeof(variable));
          checksumSwitch = 4;
        }
      } 
      break;
      
    case 3:
        if(variable[1] == 0x50)
        {
          Serial.println("Variable 1 = 0x50");
          if(variable[3] == 0xFF)
          {
            Serial.println("variable 3 = 0xFF");
            //Serial.end();
            index = 0;
            memset(variable, 0, sizeof(variable));
          }
          Serial.println("Connected!");
          connected();
          lcdWrite(4, 0, F("Connected to    "));
          lcdWrite(4, 1, camString + x + singleSpace + singleSpace + singleSpace + singleSpace + singleSpace + singleSpace + singleSpace + singleSpace);
          vergilCommand(0, 2);
          delay(2500);
          index = 0;
          memset(variable, 0, sizeof(variable));
          states = controlCamera;
        }
      break;
      
    case 4:
      Serial.println("No Camera Data (RS232)");
      clearVault();
      lcdWrite(4, 0, F("No Data from    "));
      lcdWrite(4, 1, camString + x + deadSpace5 + singleSpace + singleSpace + singleSpace);
      vergilCommand(0, 6);
      conFail();
      delay(2000);
      error(0, 3);
      delay(2500);
      checksumSwitch = 5;
      break;
      
    case 5:
      Serial.println("Fail Screen Case");
      if(camFailKey == 'P') {returning();}
      noRS232(0);
      blanking(1);
      lcdWrite(4, 0, noConTo + x + singleSpace);
      lcdWrite(3, 1, F(" --------------"));
      specChar(18, 1, 1);
      vergilBlink();
      break;
      
    default:
      checksumSwitch = 0;
      return;
  }
}
//End Camera Checksum




//Control Camera Function:
void controlCam()
{
  //Serial.begin(9600);
  camControlKey = kp.getKey();
  if(camControlKey == 'P') {returning();}
  numCam(vaultNum);
  lcdWrite(4, 0, camControl + vaultNum + singleSpace + singleSpace);
  lcdWrite(4, 1, deadSpace16);
  vergilBlink();
  camPanTilt();
  camZoom();
  camFocus();
  softPower();
}
//End Control Camera Function




//Returning
void returning()
{
  lcdWrite(4, 0, F("Returning to    "));
  lcdWrite(4, 1, F("Main Screen     "));
  vergilCommand(0, 7);
  delay(500);
  vergilCommand(0, 8);
  delay(500);
  vergilCommand(0, 7);
  delay(500);
  vergilCommand(0, 8);
  delay(500);
  states = clearAll;
  return;
}




//CAMERA FUNCTIONS:
//Pan & Tilt Drive:
void camPanTilt()
{
  int xPosLeft = map(xAxis, -255, 0, 17, 0);
  int xPosRight = map(xAxis, 0, 255, 0, 17);
  int yPosUp = map(yAxis, 0, 255, 0, 17);
  int yPosDown = map(yAxis, -255, 0, 17, 0);
  homePosState = digitalRead(homePos);

  //Pan & Tilt Commands:
  if(xAxis < -40)
  {
    cam.panLeft(xPosLeft);
  }
  else if(xAxis > 40)
  {
    cam.panRight(xPosRight);
  }
  else if(yAxis > 40)
  {
    cam.tiltUp(yPosUp);
  }
  else if(yAxis < -40)
  {
    cam.tiltDown(yPosDown);
  }

  //Pan & Tilt Drive Stop Command:
  else if((xAxis > -235) && (xAxis < 235) && (yAxis > -235) && (yAxis < 235))
  {
    cam.panTiltStop(0, 0);
  }

  //Home Button:
  if(homePosState == LOW)
  {
    cam.panTiltHome();
  }
}
//End Pan & Tilt Drive




//Zoom:
void camZoom()
{
  if(zAxis < -230)
  {
    cam.zoomWide();
  }
  else if(zAxis > 230)
  {
    cam.zoomTele();
  }
  else if((zAxis > -235) && (zAxis < 235))
  {
    cam.zoomStop();
  }
}
//End Zoom




//Focus
void camFocus()
{
  aFocusState = digitalRead(aFocus);
  aFocusToggleState = digitalRead(aFocusToggle);
  
  if(fAxis > -235)
  {
    if(fAxis < 235)
    {
      cam.focusStop();
    }
  }
  if(fAxis < -230)
  {
    cam.focusNear();
  }
  else if(fAxis > 230)
  {
    cam.focusFar();
  }
  if(aFocusState == LOW)
  {
    cam.focusAutoTrigger();
  }
  if(aFocusToggleState == LOW)
  {
    cam.focusAutoToggle();
  }
}
//End Focus




//Soft Power Switch:
void softPower()
{
  powerState = digitalRead(powerButton);
  
  if(powerFlag)
  {
    if(powerState == LOW)
    {
      cam.camPowerOn();
      powerFlag = false;
    }
  }
  else if(!powerFlag)
  {
    if(powerState == LOW)
    {
      cam.camPowerOff();
      powerFlag = true;
    }
  }
}
//End Soft Power Switch.
//END CAMERA FUNCTIONS




//Applet for printing to the LCD:
void lcdWrite(const int col, const boolean line, const String & text)
{
  lcd.setCursor(col, line);
  lcd.print(text);
}
//End LCD Printing Applet
//LED 7 SEGMENT DISPLAY FUNCTIONS:
//Segment:
void segment(byte dev, byte digit)
{
  static unsigned long aniMillis = millis();
  
  if(millis() - aniMillis > aniInterval)
  {
    if(ani == 7)
    {
      ani = 1;
    }
    ani++;
    aniMillis = millis();
  }
  
  switch(ani)
  {
    case 0:
      //do nothing here;
      break;
    case 1:
      led7seg.setRow(dev, digit, B01000000);
      break;
    case 2:
      led7seg.setRow(dev, digit, B00100000);
      break;
    case 3:
      led7seg.setRow(dev, digit, B00010000);
      break;
    case 4:
      led7seg.setRow(dev, digit, B00001000);
      break;
    case 5:
      led7seg.setRow(dev, digit, B00000100);
      break;
    case 6:
      led7seg.setRow(dev, digit, B00000010);
      break;
    default:
      ani = 1;
      return;
  }
}
//End Segment




//No Vault Data:
void noVaultData()
{
  led7segWrite(0, 7, 'N', false);
  led7segWrite(0, 6, '0', false);
  led7segWrite(0, 5, ' ', false);
  led7segWrite(0, 4, 'U', false);
  led7segWrite(0, 3, 'A', false);
  led7segWrite(0, 2, 'u', false);
  led7segWrite(0, 1, 'L', false);
  led7segWrite(0, 0, 't', false);

  led7segWrite(1, 7, ' ', false);
  led7segWrite(1, 6, ' ', false);
  led7segWrite(1, 5, 'd', false);
  led7segWrite(1, 4, 'A', false);
  led7segWrite(1, 3, 't', false);
  led7segWrite(1, 2, 'A', true);
  led7segWrite(1, 1, ' ', true);
  led7segWrite(1, 0, ' ', true);
}
//End No Vault Data




//No Camera Selected Display Function:
void noCam()
{
  unsigned long noCamCurrentMillis = millis();

  if(noCamCurrentMillis - noCamPreviousMillis >= noCamInterval)
  {
    noCamPreviousMillis = noCamCurrentMillis;

    if(!noCamFlag)
    {
      led7segWrite(0, 7, ' ', false);
      led7segWrite(0, 6, 'N', false);
      led7segWrite(0, 5, '0', false);
      led7segWrite(0, 4, ' ', false);
      led7segWrite(0, 3, 'C', false);
      led7segWrite(0, 2, 'A', false);
      led7segWrite(0, 1, 'N', false);
      led7segWrite(0, 0, ' ', false);

      led7segWrite(1, 7, 5, false);
      led7segWrite(1, 6, 'E', false);
      led7segWrite(1, 5, 'L', false);
      led7segWrite(1, 4, 'E', false);
      led7segWrite(1, 3, 'C', false);
      led7segWrite(1, 2, 't', false);
      led7segWrite(1, 1, 'E', false);
      led7segWrite(1, 0, 'd', true);
      noCamFlag = true;
    }
    else
    {
      led7segWrite(0, 7, ' ', false);
      led7segWrite(0, 6, 'P', false);
      led7segWrite(0, 5, 'L', false);
      led7segWrite(0, 4, 'E', false);
      led7segWrite(0, 3, 'A', false);
      led7segWrite(0, 2, '5', false);
      led7segWrite(0, 1, 'E', false);
      led7segWrite(0, 0, ' ', false);

      led7segWrite(1, 7, '5', false);
      led7segWrite(1, 6, 'E', false);
      led7segWrite(1, 5, 'L', true);
      led7segWrite(1, 4, ' ', false);
      led7segWrite(1, 3, 'C', false);
      led7segWrite(1, 2, 'A', false);
      led7segWrite(1, 1, 'N', true);
      led7segWrite(1, 0, ' ', false);
      noCamFlag = false;
    }
  }
}
//End No Camera Selected Display Function




//Camera Selection Number Function:
void numCam(byte num)
{
  byte num1;
  byte num2;
  if(num == 1) {num1 = 0; num2 = 1;}
  else if(num == 2) {num1 = 0; num2 = 2;}
  else if(num == 3) {num1 = 0; num2 = 3;}
  else if(num == 4) {num1 = 0; num2 = 4;}
  else if(num == 5) {num1 = 0; num2 = 5;}
  else if(num == 6) {num1 = 0; num2 = 6;}
  else if(num == 7) {num1 = 0; num2 = 7;}
  else if(num == 8) {num1 = 0; num2 = 8;}
  else if(num == 9) {num1 = 0; num2 = 9;}
  else if(num == 10) {num1 = 1; num2 = 0;}
  else if(num == 11) {num1 = 1; num2 = 1;}
  else if(num == 12) {num1 = 1; num2 = 2;}
  else if(num == 13) {num1 = 1; num2 = 3;}
  else if(num == 14) {num1 = 1; num2 = 4;}
  else if(num == 15) {num1 = 1; num2 = 5;}
  else if(num == 16) {num1 = 1; num2 = 6;}
  else if(num == 17) {num1 = 1; num2 = 7;}
  else if(num == 18) {num1 = 1; num2 = 8;}
  else if(num == 19) {num1 = 1; num2 = 9;}
  else if(num == 20) {num1 = 2; num2 = 0;}
  else if(num == 21) {num1 = 2; num2 = 1;}
  else if(num == 22) {num1 = 2; num2 = 2;}
  else if(num == 23) {num1 = 2; num2 = 3;}
  else if(num == 24) {num1 = 2; num2 = 4;}
  
  led7segWrite(0, 7, 'C', false);
  led7segWrite(0, 6, 't', false);
  led7segWrite(0, 5, 'R', false);
  led7segWrite(0, 4, 'L', false);
  led7segWrite(0, 3, '1', false);
  led7segWrite(0, 2, 'N', false);
  led7segWrite(0, 1, '9', false);
  led7segWrite(0, 0, ' ', false);
  
  led7segWrite(1, 7, 'C', false);
  led7segWrite(1, 6, 'A', false);
  led7segWrite(1, 5, 'N', true);
  led7segWrite(1, 4, ' ', false);
  led7segWrite(1, 3, num1, false);
  led7segWrite(1, 2, num2, false);
  led7segWrite(1, 1, ' ', false);

  segment(1, 0);
}
//End Camera Selection Number Function




//Error:
void error(byte num1, byte num2)
{
  led7segWrite(0, 7, 'E', false);
  led7segWrite(0, 6, 'R', false);
  led7segWrite(0, 5, 'R', false);
  led7segWrite(0, 4, '0', false);
  led7segWrite(0, 3, 'R', true);
  led7segWrite(0, 2, ' ', false);
  led7segWrite(0, 1, num1, false);
  led7segWrite(0, 0, num2, false);
  blanking(1);
}
//End Error




//No Port:
void noPort()
{
  led7segWrite(0, 7, 'N', false);
  led7segWrite(0, 6, '0', false);
  led7segWrite(0, 5, ' ', false);
  led7segWrite(0, 4, '5', false);
  led7segWrite(0, 3, 'U', false);
  led7segWrite(0, 2, 'C', false);
  led7segWrite(0, 1, 'h', false);
  led7segWrite(0, 0, ' ', false);

  led7segWrite(1, 7, ' ', true);
  led7segWrite(1, 6, ' ', true);
  led7segWrite(1, 5, 'P', false);
  led7segWrite(1, 4, '0', false);
  led7segWrite(1, 3, 'R', false);
  led7segWrite(1, 2, 't', false);
  led7segWrite(1, 1, ' ', true);
  led7segWrite(1, 0, ' ', true);
}
//End No Port




//Connection Failed:
void conFail()
{
  led7segWrite(0, 7, 'C', false);
  led7segWrite(0, 6, '0', false);
  led7segWrite(0, 5, 'N', false);
  led7segWrite(0, 4, 'E', false);
  led7segWrite(0, 3, 'C', false);
  led7segWrite(0, 2, 't', false);
  led7segWrite(0, 1, '0', false);
  led7segWrite(0, 0, 'N', false);

  led7segWrite(1, 7, ' ', false);
  led7segWrite(1, 6, 'F', false);
  led7segWrite(1, 5, 'A', false);
  led7segWrite(1, 4, '1', false);
  led7segWrite(1, 3, 'L', false);
  led7segWrite(1, 2, 'E', false);
  led7segWrite(1, 1, 'd', false);
  led7segWrite(1, 0, ' ', false);
}
//End Connection Failed




//Connecting:
void connecting(byte num1, byte num2)
{
  led7segWrite(0, 7, 'C', false);
  led7segWrite(0, 6, '0', false);
  led7segWrite(0, 5, 'N', false);
  led7segWrite(0, 4, 'N', false);
  led7segWrite(0, 3, 't', false);
  led7segWrite(0, 2, '1', false);
  led7segWrite(0, 1, 'N', false);
  led7segWrite(0, 0, '9', false); 

  led7segWrite(1, 7, 't', false);
  led7segWrite(1, 6, 'o', false);
  led7segWrite(1, 5, ' ', false);
  led7segWrite(1, 4, 'C', false);
  led7segWrite(1, 3, 'A', false);
  led7segWrite(1, 2, 'N', true);
  led7segWrite(1, 1, num1, false);
  led7segWrite(1, 0, num2, false);
}
//End Connecting




//Connected!
void connected()
{
  led7segWrite(0, 7, 'C', false);
  led7segWrite(0, 6, '0', false);
  led7segWrite(0, 5, 'N', false);
  led7segWrite(0, 4, 'N', false);
  led7segWrite(0, 3, 't', false);
  led7segWrite(0, 2, 'E', false);
  led7segWrite(0, 1, 'd', false);
  led7segWrite(0, 0, ' ', false); 
  blanking(1);
}
//End Connected!




//No RS232:
void noRS232(byte dev)
{
  unsigned long noRS232CurrentMillis = millis();
  
  led7segWrite(dev, 7, 'N', false);
  led7segWrite(dev, 6, '0', false);
  led7segWrite(dev, 5, ' ', false);

  if(noRS232CurrentMillis - noRS232PreviousMillis >= noRS232Interval)
  {
    noRS232PreviousMillis = noRS232CurrentMillis;

    if(!noRS232Flag)
    {
      led7segWrite(dev, 4, 'R', false);
      led7segWrite(dev, 3, '5', true);
      led7segWrite(dev, 2, '2', false);
      led7segWrite(dev, 1, '3', false);
      led7segWrite(dev, 0, '2', false);
      noRS232Flag = true;
    }
    else
    {
      led7segWrite(dev, 4, ' ', false);
      led7segWrite(dev, 3, ' ', false);
      led7segWrite(dev, 2, ' ', false);
      led7segWrite(dev, 1, ' ', false);
      led7segWrite(dev, 0, ' ', false);
      noRS232Flag = false;
    }
  }
}
//End No RS232




//Blanking
void blanking(byte dev)
{
  led7segWrite(dev, 7, ' ', false);
  led7segWrite(dev, 6, ' ', false);
  led7segWrite(dev, 5, ' ', false);
  led7segWrite(dev, 4, ' ', false);
  led7segWrite(dev, 3, ' ', false);
  led7segWrite(dev, 2, ' ', false);
  led7segWrite(dev, 1, ' ', false);
  led7segWrite(dev, 0, ' ', false);
}
//End Blanking




//Applet for writing to LED 7 Segment Display:
void led7segWrite(byte dev, byte digit, int character, boolean dp)
{
  if(character == 'n')
  {
    if(dp)
    {
      led7seg.setRow(dev, digit, B10010101);  //Segment Map(B0abcdefg)
    }
    else if(!dp)
    {
      led7seg.setRow(dev, digit, B00010101);
    }
  }
  else if(character == 'N')
  {
    if(dp)
    {
      led7seg.setRow(dev, digit, B11110110);
    }
    else if(!dp)
    {
      led7seg.setRow(dev, digit, B01110110);
    }
  }
  else if(character == 'C')
  {
    if(dp)
    {
      led7seg.setRow(dev, digit, B11001110);
    }
    else if(!dp)
    {
      led7seg.setRow(dev, digit, B01001110);
    }
  }
  else if(character == 'o')
  {
    if(dp)
    {
      led7seg.setRow(dev, digit, B10011101);
    }
    else if(!dp)
    {
      led7seg.setRow(dev, digit, B00011101);
    }
  }
  else if(character == 'r')
  {
    if(dp)
    {
      led7seg.setRow(dev, digit, B10000101);
    }
    else if(!dp)
    {
      led7seg.setRow(dev, digit, B00000101);
    }
  }
  else if(character == 'R')
  {
    if(dp)
    {
      led7seg.setRow(dev, digit, B11100110);
    }
    else if(!dp)
    {
      led7seg.setRow(dev, digit, B01100110);
    }
  }
  else if(character == 't')
  {
    if(dp)
    {
      led7seg.setRow(dev, digit, B10001111);
    }
    else if(!dp)
    {
      led7seg.setRow(dev, digit, B00001111);
    }
  }
  else if(character == 'u')
  {
    if(dp)
    {
      led7seg.setRow(dev, digit, B10011100);
    }
    else if(!dp)
    {
      led7seg.setRow(dev, digit, B00011100);
    }
  }
  else if(character == 'U')
  {
    if(dp)
    {
      led7seg.setRow(dev, digit, B10111110);
    }
    else if(!dp)
    {
      led7seg.setRow(dev, digit, B00111110);
    }
  }
  else if(character == 'y')
  {
    if(dp)
    {
      led7seg.setRow(dev, digit, B10111011);
    }
    else if(!dp)
    {
      led7seg.setRow(dev, digit, B00111011);
    }
  }
  else if(character == ' ')
  {
    if(dp)
    {
      led7seg.setRow(dev, digit, B10000000);
    }
    else if(!dp)
    {
      led7seg.setRow(dev, digit, B00000000);
    }
  }
  else
  {
    led7seg.setChar(dev, digit, character, dp);
  }
}
//End 7 Segment Write
//END LED 7 SEGMENT DISPLAY FUNCTIONS

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.