# virtual_wire_transmitter

Virtual Wire transmitter only version

Author | Rob Jansen, Copyright © 2018..2019, all rights reserved.
Adapted-by |
Compiler | 2.5r2

Description

    This is the transmit only version of Virtual_Wire, see the file
                 virtual_wire.jal for all changes compared to the original
                 Virtual_Wire library and more information.

Sources

    http://www.airspayce.com/mikem/arduino/VirtualWire.pdf

Notes

    -

Dependencies

No dependency found

## Summary

### Global variables/contants

- `const byte VW_HEADER_LEN = 8`
- `var byte vw_tx_sample`
- `const byte VW_RAMP_TRANSITION = VW_RX_RAMP_LEN/2`
- `var byte vw_tx_len`
- `const byte VW_RAMP_INC = (VW_RX_RAMP_LEN/VW_RX_SAMPLES_PER_BIT)`
- `const byte VW_RAMP_INC_ADVANCE = (VW_RAMP_INC + VW_RAMP_ADJUST)`
- `const byte VW_RX_SAMPLES_PER_BIT = 8`
- `const byte VW_MAX_PAYLOAD = VW_MAX_MESSAGE_LEN - 3`
- `var byte vw_tx_rx_buf[VW_MAX_MESSAGE_LEN * 2]`
- `var bit vw_tx_header`
- `const byte VW_RX_RAMP_LEN = 160`
- `const byte symbols_c[] =`
- `const byte vw_tx_header_buf[VW_HEADER_LEN]`
- `const byte VW_RAMP_INC_RETARD = (VW_RAMP_INC - VW_RAMP_ADJUST)`
- `const byte VW_RAMP_ADJUST = 9`
- `var word data_2`
- `var bit vw_tx_enabled`
- `var byte vw_tx_index`
- `var byte vw_tx_bit`

### Procedures

- `vw_service()`
- `vw_init()`
- `vw_tx_stop()`
- `vw_wait_tx()`

### Functions

- `vw_send(byte in buf[], byte in len) return bit`
- `vw_tx_active() return bit`

Private

- `_vw_calc_crc(word in crc, byte in data) return word`

## API details

### Global variables/contants

- `const byte VW_HEADER_LEN = 8`

      Outgoing message bits grouped as 6-bit words
      36 alternating 1/0 bits, followed by 12 bits of start symbol
      Followed immediately by the 4-6 bit encoded byte count,
      message buffer and 2 byte FCS
      Each byte from the byte count on is translated into 2x6-bit words
      Caution, each symbol is transmitted LSBit first,
      but each byte is transmitted high nybble first

- `var byte vw_tx_sample`

      Sample number for the transmitter. Runs 0 to 7 during one bit interval.

- `const byte VW_RAMP_TRANSITION = VW_RX_RAMP_LEN/2`

      Internal ramp adjustment parameter

- `var byte vw_tx_len`

      Number of symbols in VW_Tx_Buf to be sent

- `const byte VW_RAMP_INC = (VW_RX_RAMP_LEN/VW_RX_SAMPLES_PER_BIT)`

      Ramp adjustment parameters
      Standard is if a transition occurs before VW_RAMP_TRANSITION (80) in the ramp,
      the ramp is retarded by adding VW_RAMP_INC_RETARD (11)
      else by adding VW_RAMP_INC_ADVANCE (29)
      If there is no transition it is adjusted by VW_RAMP_INC (20)
      Internal ramp adjustment parameter

- `const byte VW_RAMP_INC_ADVANCE = (VW_RAMP_INC + VW_RAMP_ADJUST)`

      Internal ramp adjustment parameter

- `const byte VW_RX_SAMPLES_PER_BIT = 8`

      Number of samples per bit.

- `const byte VW_MAX_PAYLOAD = VW_MAX_MESSAGE_LEN - 3`

      The maximum payload length, count (1) and FCS (2) must be subtracted.

- `var byte vw_tx_rx_buf[VW_MAX_MESSAGE_LEN * 2]`

      Transmit and receive buffer. The symbol buffer for transmission is combined
      with the data buffer for reception.

- `var bit vw_tx_header`

      Indicates that the header must be transmitted first.

- `const byte VW_RX_RAMP_LEN = 160`

      The size of the receiver ramp. Ramp wraps modulo this number

- `const byte symbols_c[] =`

      4 bit to 6 bit symbol converter table for coding
      Used to convert the high and low nibbles of the transmitted data
      into 6 bit symbols for transmission. Each 6-bit symbol has 3 1s and 3 0s
      with at most 3 consecutive identical bits

- `const byte vw_tx_header_buf[VW_HEADER_LEN]`

      Transmit header to synchronize the receiver.

- `const byte VW_RAMP_INC_RETARD = (VW_RAMP_INC - VW_RAMP_ADJUST)`

      Internal ramp adjustment parameter

- `const byte VW_RAMP_ADJUST = 9`

      Internal ramp adjustment parameter

- `var word data_2`

  No documentation found

- `var bit vw_tx_enabled`

      Indicates if the transmitter is active.

- `var byte vw_tx_index`

      Index of he next symbot to send. Ranges from 0 to VW_Tx_Len

- `var byte vw_tx_bit`

      Bit number of next bot to send

### Procedures

- `vw_service()`

      This is the service routine that must be called by the main program when the
      timer overflows. Its job is to output the next bit from the transmitter
      (every 8 calls).

- `vw_init()`

      Initialize the virtual wire driver.

- `vw_tx_stop()`

      Stop the transmitter, call when all bits are sent

- `vw_wait_tx()`

      Wait for the transmitter to become available
      Busy-wait loop until the ISR says the message has been sent

### Functions

- `vw_send(byte in buf[], byte in len) return bit`

      Wait until transmitter is available and encode and queue the message
      into vw_tx_buf
      The message is raw bytes, with no packet structure imposed
      It is transmitted preceded a byte count and followed by 2 FCS bytes

- `vw_tx_active() return bit`

      Return true if the transmitter is active

Private

- `_vw_calc_crc(word in crc, byte in data) return word`

      Calculate new crc over given data. Formula is:
      Xexp16 + Xexp12 + Xexp5 + 1

## Related samples

Here are the list of samples which use this library:

12f617 | 12f617_virtual_wire_transmitter.jal