Show Posts
Pages: [1] 2 3 ... 9
1  Using Arduino / Project Guidance / Video level meter. on: February 08, 2014, 05:59:29 pm
Hello chaps.

Looking for some starting guidance on creating a video level meter for use on CCTV video signals.

I'm looking to read the video level and sync level of a video signal then display the results on a LCD as a pk-pk voltage level. A good tool to have for a CCTV engineer.

Can anyone give me some advice on how to read such a signal?

I will be using the UNO for this handheld tool.

Many thanks.
2  Using Arduino / Programming Questions / Re: Structure of arrays. on: December 17, 2013, 12:35:47 am
Thanks for the replies. Hope this helps.

Am looking at using a rotary switch for a way of selecting each protocol and thought i need a way of indexing the protocol global variables. Switch position 1 = PelcoP & switch position 2 = PelcoD. (Will be adding more protocols in the future).

(read joystick -> read protocol switch -> update the selected protocol data packet according to the switch position -> transmit the data packet according to the switch position).

I was thinking maybe a structure would be ok for this.
3  Using Arduino / Programming Questions / Re: Structure of arrays. on: December 16, 2013, 05:11:47 pm
Code:
void protocol_pelcoP() {
  byte i;
  
  newControl = 0;
  pelcoP[1] = address;
  
  for(i = 0; i <= 9; i++) {
    newControl += joystickValues[i];
  }
  
  if(newControl != oldControl) {
    //Pan.
    if(joystickValues[0] > 0) {
      bitWrite(pelcoP[3], 1, 1); //Sets pan right on.
      pelcoP[4] = map(joystickValues[0], 1, 8, 0x01, 0x3F);
    }
    else if(bitRead(pelcoP[3], 1) == 1) {
      bitWrite(pelcoP[3], 1, 0); //Sets pan right off.
    }
    if(joystickValues[1] > 0) {
      bitWrite(pelcoP[3], 2, 1); //Sets pan left on.
      pelcoP[4] = map(joystickValues[1], 1, 8, 0x01, 0x3F);
    }
    else if(bitRead(pelcoP[3], 2) == 1) {
      bitWrite(pelcoP[3], 2, 0); //Sets pan left off.
    }
    if(!joystickValues[0] && !joystickValues[1]) {
      pelcoP[4] = 0x00; //Sets pan speed to 0.
    }
    //Tilt.
    if(joystickValues[2] > 0) {
      bitWrite(pelcoP[3], 3, 1); //Sets tilt up on.
      pelcoP[5] = map(joystickValues[2], 1, 8, 0x01, 0x3F);
    }
    else if(bitRead(pelcoP[3], 3) == 1) {
    bitWrite(pelcoP[3], 3, 0); //Sets tilt up off.
    }
    if(joystickValues[3] > 0) {
      bitWrite(pelcoP[3], 4, 1); //Sets tilt down on.
      pelcoP[5] = map(joystickValues[3], 1, 8, 0x01, 0x3F);
    }
    else if(bitRead(pelcoP[3], 4) == 1) {
      bitWrite(pelcoP[3], 4, 0); //Sets tilt up off.
    }
    if(!joystickValues[2] && !joystickValues[3]) {
      pelcoP[5] = 0x00; //Sets tilt speed to 0.
    }
    //Twist (zoom, focus & iris).
    if(joystickButton == 1) {
      if(joystickValues[4] > 0) {
        bitWrite(pelcoP[3], 5, 1); //Sets zoom in on.
      }
      else if(bitRead(pelcoP[3], 5) == 1) {
        bitWrite(pelcoP[3], 5, 0); //Sets zoom in off.
      }
      if(joystickValues[5] > 0) {
        bitWrite(pelcoP[3], 6, 1); //Sets zoom out on.
      }
      else if(bitRead(pelcoP[3], 6) == 1) {
        bitWrite(pelcoP[3], 6, 0); //Sets zoom out off.
      }
    }
    else if(joystickButton == 2){
      if(joystickValues[6] > 0) {
        bitWrite(pelcoP[2], 0, 1); //Sets focus far on.
      }
      else if(bitRead(pelcoP[2], 0) == 1) {
        bitWrite(pelcoP[2], 0, 0); //Sets focus far off.
      }
      if(joystickValues[7] > 0) {
        bitWrite(pelcoP[2], 1, 1); //Sets focus far on.
      }
      else if(bitRead(pelcoP[2], 1) == 1) {
        bitWrite(pelcoP[2], 1, 0); //Sets focus far off.
      }
    }
    else if(joystickButton == 3){
      if(joystickValues[6] > 0) {
        bitWrite(pelcoP[2], 2, 1); //Sets iris open on.
      }
      else if(bitRead(pelcoP[2], 0) == 1) {
        bitWrite(pelcoP[2], 2, 0); //Sets iris open off.
      }
      if(joystickValues[7] > 0) {
        bitWrite(pelcoP[2], 3, 1); //Sets iris close on.
      }
      else if(bitRead(pelcoP[2], 1) == 1) {
        bitWrite(pelcoP[2], 3, 0); //Sets iris close off.
      }
    }
    
    //Checksum calculation XOR (Last byte is not inculed).
    pelcoP[7] = 0x00; //Clears last calculated checksum byte.
    pelcoP[7] = (pelcoP[0] ^ pelcoP[1] ^ pelcoP[2] ^ pelcoP[3] ^ pelcoP[4] ^ pelcoP[5] ^ pelcoP[6]); //Checksum Calculation.
  
    //Transmit the data out.
    for(i = 0; i <= 7; i++) {
      Serial.print(pelcoD[i], HEX);
      Serial. print(" ");
    }
    oldControl = newControl;
  }
  else {
    oldControl = newControl;
    return;
  }
}

void protocol_pelcoD() {
  byte i;
  
  newControl = 0;
  pelcoD[1] = address;
  
  for(i = 0; i <= 9; i++) {
    newControl += joystickValues[i];
  }
  
  if(newControl != oldControl) {
    //Pan.
    if(joystickValues[0] > 0) {
      bitWrite(pelcoD[3], 1, 1); //Sets pan right on.
      pelcoD[4] = map(joystickValues[0], 1, 8, 0x01, 0x3F);
    }
    else if(bitRead(pelcoD[3], 1) == 1) {
      bitWrite(pelcoD[3], 1, 0); //Sets pan right off.
    }
    if(joystickValues[1] > 0) {
      bitWrite(pelcoD[3], 2, 1); //Sets pan left on.
      pelcoD[4] = map(joystickValues[1], 1, 8, 0x01, 0x3F);
    }
    else if(bitRead(pelcoD[3], 2) == 1) {
      bitWrite(pelcoD[3], 2, 0); //Sets pan left off.
    }
    if(!joystickValues[0] && !joystickValues[1]) {
      pelcoD[4] = 0x00; //Sets pan speed to 0.
    }
    //Tilt.
    if(joystickValues[2] > 0) {
      bitWrite(pelcoD[3], 3, 1); //Sets tilt up on.
      pelcoD[5] = map(joystickValues[2], 1, 8, 0x01, 0x3F);
    }
    else if(bitRead(pelcoD[3], 3) == 1) {
    bitWrite(pelcoD[3], 3, 0); //Sets tilt up off.
    }
    if(joystickValues[3] > 0) {
      bitWrite(pelcoD[3], 4, 1); //Sets tilt down on.
      pelcoD[5] = map(joystickValues[3], 1, 8, 0x01, 0x3F);
    }
    else if(bitRead(pelcoD[3], 4) == 1) {
      bitWrite(pelcoD[3], 4, 0); //Sets tilt up off.
    }
    if(!joystickValues[2] && !joystickValues[3]) {
      pelcoD[5] = 0x00; //Sets tilt speed to 0.
    }
    //Twist (zoom, focus & iris).
    if(joystickButton == 1) {
      if(joystickValues[4] > 0) {
        bitWrite(pelcoD[3], 5, 1); //Sets zoom in on.
      }
      else if(bitRead(pelcoD[3], 5) == 1) {
        bitWrite(pelcoD[3], 5, 0); //Sets zoom in off.
      }
      if(joystickValues[5] > 0) {
        bitWrite(pelcoD[3], 6, 1); //Sets zoom out on.
      }
      else if(bitRead(pelcoD[3], 6) == 1) {
        bitWrite(pelcoD[3], 6, 0); //Sets zoom out off.
      }
    }
    else if(joystickButton == 2){
      if(joystickValues[6] > 0) {
        bitWrite(pelcoD[3], 7, 1); //Sets focus far on.
      }
      else if(bitRead(pelcoD[3], 7) == 1) {
        bitWrite(pelcoD[3], 7, 0); //Sets focus far off.
      }
      if(joystickValues[7] > 0) {
        bitWrite(pelcoD[2], 0, 1); //Sets focus far on.
      }
      else if(bitRead(pelcoD[2], 0) == 1) {
        bitWrite(pelcoD[2], 0, 0); //Sets focus far off.
      }
    }
    else if(joystickButton == 3){
      if(joystickValues[8] > 0) {
        bitWrite(pelcoD[2], 1, 1); //Sets iris open on.
      }
      else if(bitRead(pelcoD[2], 1) == 1) {
        bitWrite(pelcoD[2], 1, 0); //Sets iris open off.
      }
      if(joystickValues[9] > 0) {
        bitWrite(pelcoD[2], 2, 1); //Sets iris close on.
      }
      else if(bitRead(pelcoD[2], 2) == 1) {
        bitWrite(pelcoD[2], 2, 0); //Sets iris close off.
      }
    }
    
    //Checksum calculation modulo 256 (first byte and last byte is not inculed).
    pelcoD[6] = 0x00; //Clears last calculated checksum byte.
    pelcoD[6] = (pelcoD[1] + pelcoD[2] + pelcoD[3] + pelcoD[4] + pelcoD[5]); //Checksum calculation.
  
    //Transmit the data out.
    for(i = 0; i <= 6; i++) {
      Serial.print(pelcoD[i], HEX);
      Serial. print(" ");
    }
    oldControl = newControl;
  }
  else {
    oldControl = newControl;
    return;
  }
}
4  Using Arduino / Programming Questions / Structure of arrays. on: December 16, 2013, 05:11:20 pm
 Hello all.

Code:
//Protocol global variables.
byte pelcoD[7] = {0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; //Synch Byte, Address, Command 1, Command 2, Data 1, Data 2, Checksum.
byte pelcoP[8] = {0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAF, 0x00}; //STX, Address, Data 1, Data 2, Data 3, Data 4, ETX, Checksum.

I am creating a sketch to control dome cameras with Pelco telemetry of P & D types and the code above is how i am creating my data packets for each protocol. Is it possible to place byte pelcoD and pelcoP into the same structure even tho the arrays are of different sizes? And if so how would i write it?

Thanks.

This code below is far from complete but it's my start on trying to create a multi protocol controller.
Code:
/*------------------------------------------------------------
Created by - Andrew Hughes
------------------------------------------------------------*/
//Define pin names.
#define pin_joystickButton 2 //Joystick button connected to this pin.
#define pin_xAxis A0 //Joystick connected to this pin, pan.
#define pin_yAxis A1 //Joystick connected to this pin, tilt.
#define pin_zAxis A2 //Joystick connected to this pin, twist.

//Joystick global variables.
byte joystickButton = 1; //Button on top of the joystick to be used for switching between zoom & focus.
unsigned int xyzAxis;
unsigned int xCenter;
unsigned int yCenter;
unsigned int zCenter;
unsigned int xAxisMin; //Pan rigt.
unsigned int xAxisMax; //Pan left.
unsigned int yAxisMin; //Tilt up.
unsigned int yAxisMax; //Tilt down.
unsigned int zAxisMin; //Anitclockwise.
unsigned int zAxisMax; //Clockwise.
unsigned int threshold; //Used for increasing the center area(dead zone).

byte joystickValues[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; //Pan right, pan left, tilt up, tilt down, zoom in, zoom out, focus far, focus near, iris open, iris close.

//Protocol global variables.
byte pelcoD[7] = {0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; //Synch Byte, Address, Command 1, Command 2, Data 1, Data 2, Checksum.
byte pelcoP[8] = {0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAF, 0x00}; //STX, Address, Data 1, Data 2, Data 3, Data 4, ETX, Checksum.

//Other global variables.
byte address = 0x01; //Stores address selection number from a switch. To be impilmented.
byte newControl; //Used to determin control state.
byte oldControl; //Used to determin control state.

void setup() {
  //Initialise the hardware serial port.
  Serial.begin(9600);
  while (!Serial)
  {
    ; // Wait for serial port to connect. Needed for Leonardo only.
  }
  joystickCalabration();
}

void loop() {
  //joystickButton = digitalRead(pin_joystickButton); //Not connected yet.
  
  xyzAxis = analogRead(pin_xAxis);
  //Pan right.
  threshold = xCenter - 25;
  if(xyzAxis < threshold) {
    xyzAxis = map(xyzAxis, threshold, xAxisMin, 1, 8);
    Serial.print(F("PR"));
    Serial.println(xyzAxis);
    joystickValues[0] = xyzAxis;
  }
  else {
    joystickValues[0] = 0; //Clears the last stored value.
  }
  //Pan left.
  threshold = xCenter + 25;
  if(xyzAxis > threshold) {
    xyzAxis = map(xyzAxis, threshold, xAxisMax, 1, 8);
    Serial.print(F("PL"));
    Serial.println(xyzAxis);
    joystickValues[1] = xyzAxis;
  }
  else {
    joystickValues[1] = 0; //Clears the last stored value.
  }
  xyzAxis = analogRead(pin_yAxis);
  //Tilt up.
  threshold = yCenter - 25;
  if(xyzAxis < threshold) {
    xyzAxis = map(xyzAxis, threshold, yAxisMin, 1, 8);
    Serial.print(F("TU"));
    Serial.println(xyzAxis);
    joystickValues[2] = xyzAxis;
  }
  else {
    joystickValues[2] = 0; //Clears the last stored value.
  }
  //Tilt down.
  threshold = yCenter + 25;
  if(xyzAxis > threshold) {
    xyzAxis = map(xyzAxis, threshold, yAxisMax, 1, 8);
    Serial.print(F("TD"));
    Serial.println(xyzAxis);
    joystickValues[3] = xyzAxis;
  }
  else {
    joystickValues[3] = 0; //Clears the last stored value.
  }
  xyzAxis = analogRead(pin_zAxis);
  //Anticlockwise.
  threshold = zCenter - 25;
  if(xyzAxis < threshold) {
    xyzAxis = map(xyzAxis, threshold, zAxisMin, 1, 8);
    if(joystickButton == 1) {
      joystickValues[4] = 1; //Zoom mode.
      Serial.print(F("ZI"));
      Serial.println(1);
    }
    else if(joystickButton == 2){
      joystickValues[6] = 1; //Focus mode.
      Serial.print(F("FF"));
      Serial.println(1);
    }
    else if(joystickButton == 3){
      joystickValues[8] = 1; //Iris mode.
      Serial.print(F("IO"));
      Serial.println(1);
    }
  }
  else {
    joystickValues[4] = 0; //Clears the last stored value.
    joystickValues[6] = 0; //Clears the last stored value.
    joystickValues[8] = 0; //Clears the last stored value.
  }
  //Clockwise.
  threshold = yCenter + 25;
  if(xyzAxis > threshold) {
    xyzAxis = map(xyzAxis, threshold, zAxisMax, 1, 8);
    if(joystickButton == 1) {
      joystickValues[5] = 1; //Zoom mode.
      Serial.print(F("ZO"));
      Serial.println(1);
    }
    else if(joystickButton == 2){
      joystickValues[7] = 1; //Focus mode.
      Serial.print(F("FN"));
      Serial.println(1);
    }
  }
  else if(joystickButton == 3){
      joystickValues[9] = 1; //Iris mode.
      Serial.print(F("IC"));
      Serial.println(1);
    }
  else {
    joystickValues[5] = 0; //Clears the last stored value.
    joystickValues[7] = 0; //Clears the last stored value.
    joystickValues[9] = 0; //Clears the last stored value.
  }
  delay(1000);
  protocol_pelcoD();
}

// Reads the min, max and center values of the joystick.
void joystickCalabration() {
  delay(3000);
  Serial.println(F("Calabrate Joystick"));
  Serial.print(F("Pan Right      "));
  delay(3000);
  xAxisMin = analogRead(pin_xAxis);
  Serial.println(xAxisMin);
  Serial.print(F("Pan Left       "));
  delay(3000);
  xAxisMax = analogRead(pin_xAxis);
  Serial.println(xAxisMax);
  Serial.print(F("Tilt Up        "));
  delay(3000);
  yAxisMin = analogRead(pin_yAxis);
  Serial.println(yAxisMin);
  Serial.print(F("Tilt Down      "));
  delay(3000);
  yAxisMax = analogRead(pin_yAxis);
  Serial.println(yAxisMax);
  Serial.print(F("Anticlockwise  "));
  delay(3000);
  zAxisMin = analogRead(pin_zAxis);
  Serial.println(zAxisMin);
  Serial.print(F("Clockwise      "));
  delay(3000);
  zAxisMax = analogRead(pin_zAxis);
  Serial.println(zAxisMax);
  Serial.println(F(".Release Joystick."));
  delay(3000);
  Serial.print(F("xCenter        "));
  xCenter = analogRead(pin_xAxis);
  Serial.println(xCenter);
  Serial.print(F("yCenter        "));
  yCenter = analogRead(pin_yAxis);
  Serial.println(yCenter);
  Serial.print(F("zCenter        "));
  zCenter = analogRead(pin_zAxis);
  Serial.println(zCenter);
  Serial.println(F("Calabrate Complete"));
}
5  Using Arduino / Programming Questions / Resistive joystick readings. on: September 04, 2013, 10:07:09 am
Hello all, just after some advice.

Am reading a 3 axes joystick with 5K pots on it. Am trying to calibrate the joystick readings to a speed value from 0 - 8 for all directions ie pan left/right and tilt up/down that I have working and got serial prints saying pan right 1 to 8 but my issue is my min joystick value is 377 and my max joystick value is around 644 with a centre point of around 511. My pan right has a bigger scale then pan left so I get an uneven spread of speeds from left to right. Any ideas on how I can get more even spread of speeds from left to right? Would lowering my aref voltage give me a bigger range to work with since my joystick don't use full I - 1023 range?

Thank you.

Ps. I can't post my code because for some reason I can't access the forum from my laptop so post from my phone.
6  Using Arduino / Programming Questions / Re: progmem help on: November 16, 2012, 08:47:55 am
I have worked it out now with the code below.
Code:
#include <avr/pgmspace.h>

prog_char hello[3][7] PROGMEM =
{
  "HELLO1",
  "HELLO2",
  "HELLO3"
};

void setup()
{
  Serial.begin(9600);
  while (!Serial)
  {
    ;
  }
}

void loop()
{
  char str1[16];
 
  sprintf_P(str1, hello[2]);
 
  Serial.print(str1);
 
  delay(5000);
}
7  Using Arduino / Programming Questions / Re: progmem help on: November 16, 2012, 08:39:57 am
I have just noticed AWOL that my strings are not separate lol and thats what i want so i gues my code needs to be something like below
Code:
prog_char hello[] PROGMEM =
{
  "HELLO1",
  "HELLO2",
  "HELLO3"
};

so how would i read the second string?
8  Using Arduino / Programming Questions / Re: progmem help on: November 16, 2012, 08:21:54 am
I don't get any errors apart from the line that says
Code:
sprintf_P(str1, hello[2]);
my full code below.
Code:
#include <avr/pgmspace.h>

prog_char hello[] PROGMEM =
{
  "HELLO1"
  "HELLO2"
  "HELLO3"
};
void setup()
{
 //Initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial)
  {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
}

void loop()
{
  char str1;
 
  sprintf_P(str1, hello[2]);
 
  Serial.print(str1);
 
  delay(5000);
}

Am wanting to have an array of strings and read them when i want. Just trying to learn about progmem.
9  Using Arduino / Programming Questions / progmem help on: November 16, 2012, 08:12:36 am
Hi all, hope you can help. What is the correct way to read "HELLO2" from the code below?
Code:
prog_char hello[] PROGMEM =
{
  "HELLO1"
  "HELLO2"
  "HELLO3"
};

Many thanks.
10  Using Arduino / Displays / Re: I2C LCD - Setup instructions for 16x2 on: October 29, 2012, 02:09:33 pm
blackscience. No problem, happy to help.
11  Using Arduino / Displays / Re: I2C LCD - Setup instructions for 16x2 on: October 28, 2012, 06:25:27 am
blackscience, have a look at this topic http://arduino.cc/forum/index.php/topic,94633.msg710615.html#msg710615%20%28http://arduino.cc/forum/index.php/topic,94633.msg710615.html#msg710615. May help you.
12  Using Arduino / Programming Questions / Re: int and unsigned int on: October 09, 2012, 01:58:41 am
Ok thanks Nick. No it wont. What am doing is getting the data over the OBD port on the vehicle and storing the value in a unsigned int as a DEC number between 0 and 8000 and that works great. So what am trying to do here is take that number and turn on some LED's (depending on what the RPM value is) over the SPI port to a 16bit shift register. Sorry if i have not really explaind myself properly here but i will try and explain as best as i can again.

I will have 16 LED's in a row (1 = LED on and 0 = LED off).
For example my RPM value is 5000. Out of 16 LED's i want to turn on 5 LED's on the left and 5 LED's on the right. So the efect i want on my LED's is below
1111100000011111 <- (binary number)/(63519, dec number) 5000RPM
1111110000111111 <- (binary number)/(64575, dec number) 6000RPM, turn on 6 LED's either side
1111111001111111 <- (binary number)/(65151, dec number) 7000RPM, turn on 7 LED's either side

So i hope you can see what effect am trying to create (LED's light up from the left and right at the same time and meet up in the middle at max RPM).

Thats why am using binary (bitshift)
Code:
Display_RPM = ~((1 << (16 - temp))-1) | ((1 << temp)-1);
to create that efect everytime i read a new RPM value then send the effect out to the shift register. I was going to use a lookup table for patterns but i was told a better way would be to use bitshift and if only 1 line of code.

Hope that makes sense, if not then slap me with a fish lol. I will post my project on here when i think it's ready to share.
13  Using Arduino / Programming Questions / Re: int and unsigned int on: October 08, 2012, 03:47:42 am
That's how I want to show the rpm value on a row of LEDs as part of a digital dash for my track car. A good example would be the f1 steering wheel then you might get the idea. I think the original question has been missed here now.
14  Using Arduino / Programming Questions / Re: int and unsigned int on: October 08, 2012, 02:18:55 am
Ok thanks AWOL but can you understand what am trying to achieve here. I will try and get a shift register this week and then see how wrong my code is when it don't display the results i was hoping for because my code is bound to be wrong.
15  Using Arduino / Programming Questions / Re: int and unsigned int on: October 08, 2012, 02:07:42 am
Quote
Why are you looking at it in binary in the first place?

Who wants to see RPM in binary?

Because i don't have a shift register at the moment so i was using the serial monitor to to show me what the output / effect would look like if i did send the information to a shift register. 1 = LED on and 0 = LED off and i will have 16 LED's.

Quote
[And how did you manage to get negative RPM?
It's not clear to me what the "correct" method of displaying a negative number in binary would be, or whether it would be worth the special case code to limit the binary display to 16bits for an "int."

It's not a negative number because my variable is a unsigned int / word and they don't hold negative numbers according to the reference section. If i set my variable Display_RPM to an int and display the created value in the serial monitor, then i get a negative number. If i set my variable to unsigned int/word then i get a positive number and that is what i want.

Code:
#define pin A0 //Pot connected for testing.

byte temp;
unsigned int Display_RPM;
unsigned int result;

void setup() {
  Serial.begin(9600);
}

void loop()
{
  result = map(analogRead(pin), 0, 1024, 0, 8000); //Maps the pot value to simulate RPM value.

  temp = result/1000;
  Display_RPM = ~((1 << (16 - temp))-1) | ((1 << temp)-1);
  Serial.println(Display_RPM, BIN);
  Serial.println(Display_RPM);
  delay(900);
}

1 = LED on, 0 + LED off
below is what i think i would see on a 16bit shift register when i buy one.

1000rpm = 1000000000000001
2000rpm = 1100000000000011
3000rpm = 1110000000000111
4000rpm = 1111000000001111
5000rpm = 1111100000011111
6000rpm = 1111110000111111
7000rpm = 1111111001111111
8000rpm = 1111111111111111

Does that explain everything now.
Pages: [1] 2 3 ... 9