1
0
mirror of https://github.com/peterantypas/maiana.git synced 2025-05-18 00:10:08 -07:00
This commit is contained in:
Peter Antypas 2016-05-30 16:50:44 -07:00
parent 4e00dfa159
commit 693874feef
9 changed files with 124 additions and 96 deletions

View File

@ -19,15 +19,30 @@
AISMessage::AISMessage ()
{
mmsi = STATION_MMSI;
repeatIndicator = 0;
messageType = 0;
mMMSI = 0;
mRI = 0;
mType = 0;
}
AISMessage::~AISMessage ()
{
}
uint8_t AISMessage::type() const
{
return mType;
}
uint8_t AISMessage::repeatIndicator() const
{
return mRI;
}
uint32_t AISMessage::mmsi() const
{
return mMMSI;
}
bool AISMessage::decode(RXPacket &)
{
// The base class method should never be called
@ -37,10 +52,9 @@ bool AISMessage::decode(RXPacket &)
return false;
}
void AISMessage::encode(TXPacket &)
void AISMessage::encode(const StationData &station, TXPacket &)
{
// The base class method should never be called
ASSERT(false);
mMMSI = station.mmsi;
}
void AISMessage::addBits(uint8_t *bitVector, uint16_t &size, uint32_t value, uint8_t numBits)
@ -199,9 +213,9 @@ AISMessage123::AISMessage123()
bool AISMessage123::decode(RXPacket &packet)
{
messageType = packet.messageType();
repeatIndicator = packet.repeatIndicator();
mmsi = packet.mmsi();
mType = packet.messageType();
mRI = packet.repeatIndicator();
mMMSI = packet.mmsi();
sog = packet.bits(50, 10) / 10.0f;
longitude = Utils::coordinateFromUINT32(packet.bits(61, 28), 28);
latitude = Utils::coordinateFromUINT32(packet.bits(89, 27), 27);
@ -216,23 +230,25 @@ bool AISMessage123::decode(RXPacket &packet)
AISMessage18::AISMessage18()
{
messageType = 18;
mType = 18;
}
void AISMessage18::encode(TXPacket &packet)
void AISMessage18::encode(const StationData &station, TXPacket &packet)
{
AISMessage::encode(station, packet);
// TODO: Perhaps this shouldn't live on the stack?
uint8_t payload[MAX_AIS_TX_PACKET_SIZE];
uint16_t size = 0;
uint32_t value;
value = messageType;
value = mType;
addBits(payload, size, value, 6); // Message type
value = repeatIndicator;
value = mRI;
addBits(payload, size, value, 2); // Repeat Indicator
value = mmsi;
value = mMMSI;
addBits(payload, size, value, 30); // MMSI
value = 0;
@ -298,9 +314,9 @@ void AISMessage18::encode(TXPacket &packet)
bool AISMessage18::decode(RXPacket &packet)
{
messageType = packet.messageType();
repeatIndicator = packet.repeatIndicator();
mmsi = packet.mmsi();
mType = packet.messageType();
mRI = packet.repeatIndicator();
mMMSI = packet.mmsi();
sog = packet.bits(46, 10) / 10.0f;
longitude = Utils::coordinateFromUINT32(packet.bits(57, 28), 28);
@ -315,28 +331,29 @@ bool AISMessage18::decode(RXPacket &packet)
///////////////////////////////////////////////////////////////////////////////
AISMessage24A::AISMessage24A()
{
messageType = 24;
name = STATION_NAME;
mType = 24;
}
void AISMessage24A::encode(TXPacket &packet)
void AISMessage24A::encode(const StationData &station, TXPacket &packet)
{
AISMessage::encode(station, packet);
uint8_t payload[MAX_AIS_TX_PACKET_SIZE];
uint16_t size = 0;
uint32_t value;
value = messageType;
value = mType;
addBits(payload, size, value, 6); // Message type
value = repeatIndicator;
value = mRI;
addBits(payload, size, value, 2); // Repeat Indicator
value = mmsi;
value = mMMSI;
addBits(payload, size, value, 30); // MMSI
value = 0;
addBits(payload, size, value, 2); // Part number (0 for 24A)
addString(payload, size, name, 20); // Station name
addString(payload, size, station.name, 20); // Station name
finalize(payload, size, packet);
}
@ -348,24 +365,24 @@ void AISMessage24A::encode(TXPacket &packet)
///////////////////////////////////////////////////////////////////////////////
AISMessage24B::AISMessage24B()
{
messageType = 24;
vendorId = "";
callSign = "";
mType = 24;
}
void AISMessage24B::encode(TXPacket &packet)
void AISMessage24B::encode(const StationData &station, TXPacket &packet)
{
AISMessage::encode(station, packet);
uint8_t payload[MAX_AIS_TX_PACKET_SIZE];
uint16_t size = 0;
uint32_t value;
value = messageType;
value = mType;
addBits(payload, size, value, 6); // Message type
value = repeatIndicator;
value = mRI;
addBits(payload, size, value, 2); // Repeat Indicator
value = mmsi;
value = mMMSI;
addBits(payload, size, value, 30); // MMSI
value = 1;
@ -374,8 +391,8 @@ void AISMessage24B::encode(TXPacket &packet)
value = 0;
addBits(payload, size, value, 8); // Type of ship unknown
addString(payload, size, vendorId, 7);
addString(payload, size, callSign, 7);
addString(payload, size, "", 7);
addString(payload, size, station.callsign, 7);
value = 0;
addBits(payload, size, value, 30); // No dimension information

View File

@ -12,7 +12,8 @@
#include "RXPacket.hpp"
#include <time.h>
#include <string>
#include "globals.h"
#include "StationData.h"
using namespace std;
@ -29,12 +30,18 @@ public:
virtual ~AISMessage ();
virtual bool decode(RXPacket &packet);
virtual void encode(TXPacket &packet);
virtual void encode(const StationData &station, TXPacket &packet);
uint8_t messageType;
uint8_t repeatIndicator;
uint32_t mmsi;
uint8_t type() const;
uint8_t repeatIndicator() const;
uint32_t mmsi() const;
protected:
// Every AIS message has these attributes at a minimum
uint8_t mType;
uint8_t mRI;
uint32_t mMMSI;
protected:
void appendCRC(uint8_t *buff, uint16_t &size);
void addBits(uint8_t *buff, uint16_t &size, uint32_t value, uint8_t numBits);
void putBits(uint8_t *buff, uint32_t value, uint8_t numBits);
@ -73,16 +80,16 @@ public:
AISMessage18();
bool decode(RXPacket &packet);
void encode(TXPacket &packet);
void encode(const StationData &data, TXPacket &packet);
};
class AISMessage24A : public AISMessage
{
public:
string name;
//string name;
AISMessage24A();
void encode(TXPacket &packet);
void encode(const StationData &data, TXPacket &packet);
};
class AISMessage24B : public AISMessage
@ -90,10 +97,10 @@ class AISMessage24B : public AISMessage
public:
AISMessage24B();
string vendorId;
string callSign;
//string vendorId;
//string callSign;
void encode(TXPacket &packet);
void encode(const StationData &data, TXPacket &packet);
};

View File

@ -147,13 +147,14 @@ void DataTerminal::showScreen(MenuScreen screen)
_write(buff);
sprintf(buff, "Software revision: %s\r\n", REVISION);
_write(buff);
#if 0
sprintf(buff, "MMSI: %d\r\n", STATION_MMSI);
_write(buff);
sprintf(buff, "Name: %s\r\n", STATION_NAME);
_write(buff);
sprintf(buff, "Call sign: %s\r\n", STATION_CALLSIGN);
_write(buff);
#endif
_write("\r\n");
_write("****************************** AIS Transponder Menu ******************************\r\n\r\n");
_write("\t\033[1mP\033[0m\tProgram MMSI, station name and call sign \r\n");

View File

@ -10,6 +10,11 @@
#include <stm32f30x_i2c.h>
#include "Utils.hpp"
#define EEPROM_STATION_ADDR 0x00 // A StationData structure starts here
#define EEPROM_REGION_CNT_ADDR 0x24 // Number of active special regions goes here (single byte)
#define EEPROM_REGION_ADDR 0x25 // Special region data array starts here
/*
* The Microchip EEPROM doesn't really expect to share the I2C bus with any other EEPROM.
* So the four high bits of the address are 1010 (same for most EEPROMs) and the lower 3 don't matter.

View File

@ -8,48 +8,9 @@
#ifndef EEPROM_HPP_
#define EEPROM_HPP_
#include <inttypes.h>
#include <time.h>
#include "AISChannels.h"
#include "StationData.h"
struct StationData {
uint32_t mmsi; // Vessel MMSI (should be 30 bit)
char name[21]; // Vessel name (all caps)
char callsign[8]; // Radio station call sign assigned with MMSI
uint8_t len; // Length in meters (default: 0)
uint8_t beam; // Beam in meters (default: 0)
uint8_t flags; // Reserved - 0 for now
};
/*
static struct StationData __default_station_data = {
987654321UL,
"TEST STATION 01",
"0N0000",
0,
0,
0
};
*/
typedef struct {
float swLat;
float swLng;
float neLat;
float neLng;
VHFChannel channA;
VHFChannel channB;
time_t expiration;
} SpecialRegion;
#define EEPROM_STATION_ADDR 0x00 // A StationData structure starts here
#define EEPROM_REGION_CNT_ADDR 0x24 // Number of active special regions goes here (single byte)
#define EEPROM_REGION_ADDR 0x25 // Special region data array starts here
//static SpecialRegion* __special_regions = new SpecialRegion[3];
class EEPROM
{
public:

View File

@ -84,7 +84,7 @@ void RXPacketProcessor::processEvent(Event *e)
"RSSI: %.2x, Ch: %c, Type: %d, MMSI: %d, Speed: %.1f kts, Pos: %.5f,%.5f, Dist: %.1f NM\r\n",
pe->mPacket->rssi (),
AIS_CHANNELS[pe->mPacket->channel ()].designation,
msg.messageType, msg.mmsi, msg.sog,
msg.type(), msg.mmsi(), msg.sog,
msg.latitude, msg.longitude, miles);
}
@ -97,11 +97,10 @@ void RXPacketProcessor::processEvent(Event *e)
mLat, mLng, msg.latitude, msg.longitude);
double miles = distance / METERS_PER_NAUTICAL_MILE;
printf2 (
"RSSI: %.2x, Ch: %c, Type: %d, MMSI: %d, Speed: %.1f kts, Pos: %.5f,%.5f, Dist: %.1f NM\r\n",
printf2 ("RSSI: %.2x, Ch: %c, Type: %d, MMSI: %d, Speed: %.1f kts, Pos: %.5f,%.5f, Dist: %.1f NM\r\n",
pe->mPacket->rssi (),
AIS_CHANNELS[pe->mPacket->channel ()].designation,
msg.messageType, msg.mmsi, msg.sog,
msg.type(), msg.mmsi(), msg.sog,
msg.latitude, msg.longitude, miles);
}

39
src/StationData.h Normal file
View File

@ -0,0 +1,39 @@
/*
* StationData.h
*
* Created on: May 30, 2016
* Author: peter
*/
#ifndef STATIONDATA_H_
#define STATIONDATA_H_
#include <inttypes.h>
#include <time.h>
#include "AISChannels.h"
struct StationData {
uint32_t mmsi; // Vessel MMSI (should be 30 bit)
char name[21]; // Vessel name (all caps)
char callsign[8]; // Radio station call sign assigned with MMSI
uint8_t len; // Length in meters (default: 0)
uint8_t beam; // Beam in meters (default: 0)
uint8_t flags; // Reserved - 0 for now
};
typedef struct {
float swLat;
float swLng;
float neLat;
float neLng;
VHFChannel channA;
VHFChannel channB;
time_t expiration;
} SpecialRegion;
#endif /* STATIONDATA_H_ */

View File

@ -12,7 +12,6 @@
#include <vector>
#include <string>
#include <sstream>
//#include <diag/Trace.h>
#include <stdlib.h>
#include "RadioManager.hpp"
#include "ChannelManager.hpp"
@ -85,7 +84,7 @@ void TXScheduler::processEvent(Event *event)
msg.cog = gfe->mCOG;
msg.utc = gfe->mUTC;
msg.encode (*p1);
msg.encode (mStationData, *p1);
RadioManager::instance ().scheduleTransmission (p1);
// Our next position report should be on the other channel
@ -100,7 +99,7 @@ void TXScheduler::processEvent(Event *event)
break;
}
AISMessage24A msg2;
msg2.encode(*p2);
msg2.encode(mStationData, *p2);
RadioManager::instance().scheduleTransmission(p2);
TXPacket *p3 = TXPacketPool::instance().newTXPacket(mStaticDataChannel, mUTC+7);
@ -110,7 +109,7 @@ void TXScheduler::processEvent(Event *event)
}
AISMessage24B msg3;
msg3.encode(*p3);
msg3.encode(mStationData, *p3);
RadioManager::instance().scheduleTransmission(p3);
// Our next static data report should be on the other channel

View File

@ -92,9 +92,9 @@
* an open-source fashion, so they are (as usual) at least a decade behind the technology curve.
*/
#define STATION_MMSI 987654321
#define STATION_NAME "TEST STATION 01"
#define STATION_CALLSIGN "N0NNNN"
//#define STATION_MMSI 987654321
//#define STATION_NAME "TEST STATION 01"
//#define STATION_CALLSIGN "N0NNNN"
#endif /* GLOBALS_H_ */