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

View File

@ -12,7 +12,8 @@
#include "RXPacket.hpp" #include "RXPacket.hpp"
#include <time.h> #include <time.h>
#include <string> #include <string>
#include "globals.h" #include "StationData.h"
using namespace std; using namespace std;
@ -29,12 +30,18 @@ public:
virtual ~AISMessage (); virtual ~AISMessage ();
virtual bool decode(RXPacket &packet); virtual bool decode(RXPacket &packet);
virtual void encode(TXPacket &packet); virtual void encode(const StationData &station, TXPacket &packet);
uint8_t messageType; uint8_t type() const;
uint8_t repeatIndicator; uint8_t repeatIndicator() const;
uint32_t mmsi; uint32_t mmsi() const;
protected: 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 appendCRC(uint8_t *buff, uint16_t &size);
void addBits(uint8_t *buff, uint16_t &size, uint32_t value, uint8_t numBits); 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); void putBits(uint8_t *buff, uint32_t value, uint8_t numBits);
@ -73,16 +80,16 @@ public:
AISMessage18(); AISMessage18();
bool decode(RXPacket &packet); bool decode(RXPacket &packet);
void encode(TXPacket &packet); void encode(const StationData &data, TXPacket &packet);
}; };
class AISMessage24A : public AISMessage class AISMessage24A : public AISMessage
{ {
public: public:
string name; //string name;
AISMessage24A(); AISMessage24A();
void encode(TXPacket &packet); void encode(const StationData &data, TXPacket &packet);
}; };
class AISMessage24B : public AISMessage class AISMessage24B : public AISMessage
@ -90,10 +97,10 @@ class AISMessage24B : public AISMessage
public: public:
AISMessage24B(); AISMessage24B();
string vendorId; //string vendorId;
string callSign; //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); _write(buff);
sprintf(buff, "Software revision: %s\r\n", REVISION); sprintf(buff, "Software revision: %s\r\n", REVISION);
_write(buff); _write(buff);
#if 0
sprintf(buff, "MMSI: %d\r\n", STATION_MMSI); sprintf(buff, "MMSI: %d\r\n", STATION_MMSI);
_write(buff); _write(buff);
sprintf(buff, "Name: %s\r\n", STATION_NAME); sprintf(buff, "Name: %s\r\n", STATION_NAME);
_write(buff); _write(buff);
sprintf(buff, "Call sign: %s\r\n", STATION_CALLSIGN); sprintf(buff, "Call sign: %s\r\n", STATION_CALLSIGN);
_write(buff); _write(buff);
#endif
_write("\r\n"); _write("\r\n");
_write("****************************** AIS Transponder Menu ******************************\r\n\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"); _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 <stm32f30x_i2c.h>
#include "Utils.hpp" #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. * 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. * 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_ #ifndef EEPROM_HPP_
#define EEPROM_HPP_ #define EEPROM_HPP_
#include <inttypes.h> #include "StationData.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
};
/*
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 class EEPROM
{ {
public: 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", "RSSI: %.2x, Ch: %c, Type: %d, MMSI: %d, Speed: %.1f kts, Pos: %.5f,%.5f, Dist: %.1f NM\r\n",
pe->mPacket->rssi (), pe->mPacket->rssi (),
AIS_CHANNELS[pe->mPacket->channel ()].designation, AIS_CHANNELS[pe->mPacket->channel ()].designation,
msg.messageType, msg.mmsi, msg.sog, msg.type(), msg.mmsi(), msg.sog,
msg.latitude, msg.longitude, miles); msg.latitude, msg.longitude, miles);
} }
@ -97,11 +97,10 @@ void RXPacketProcessor::processEvent(Event *e)
mLat, mLng, msg.latitude, msg.longitude); mLat, mLng, msg.latitude, msg.longitude);
double miles = distance / METERS_PER_NAUTICAL_MILE; double miles = distance / METERS_PER_NAUTICAL_MILE;
printf2 ( printf2 ("RSSI: %.2x, Ch: %c, Type: %d, MMSI: %d, Speed: %.1f kts, Pos: %.5f,%.5f, Dist: %.1f NM\r\n",
"RSSI: %.2x, Ch: %c, Type: %d, MMSI: %d, Speed: %.1f kts, Pos: %.5f,%.5f, Dist: %.1f NM\r\n",
pe->mPacket->rssi (), pe->mPacket->rssi (),
AIS_CHANNELS[pe->mPacket->channel ()].designation, AIS_CHANNELS[pe->mPacket->channel ()].designation,
msg.messageType, msg.mmsi, msg.sog, msg.type(), msg.mmsi(), msg.sog,
msg.latitude, msg.longitude, miles); 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 <vector>
#include <string> #include <string>
#include <sstream> #include <sstream>
//#include <diag/Trace.h>
#include <stdlib.h> #include <stdlib.h>
#include "RadioManager.hpp" #include "RadioManager.hpp"
#include "ChannelManager.hpp" #include "ChannelManager.hpp"
@ -85,7 +84,7 @@ void TXScheduler::processEvent(Event *event)
msg.cog = gfe->mCOG; msg.cog = gfe->mCOG;
msg.utc = gfe->mUTC; msg.utc = gfe->mUTC;
msg.encode (*p1); msg.encode (mStationData, *p1);
RadioManager::instance ().scheduleTransmission (p1); RadioManager::instance ().scheduleTransmission (p1);
// Our next position report should be on the other channel // Our next position report should be on the other channel
@ -100,7 +99,7 @@ void TXScheduler::processEvent(Event *event)
break; break;
} }
AISMessage24A msg2; AISMessage24A msg2;
msg2.encode(*p2); msg2.encode(mStationData, *p2);
RadioManager::instance().scheduleTransmission(p2); RadioManager::instance().scheduleTransmission(p2);
TXPacket *p3 = TXPacketPool::instance().newTXPacket(mStaticDataChannel, mUTC+7); TXPacket *p3 = TXPacketPool::instance().newTXPacket(mStaticDataChannel, mUTC+7);
@ -110,7 +109,7 @@ void TXScheduler::processEvent(Event *event)
} }
AISMessage24B msg3; AISMessage24B msg3;
msg3.encode(*p3); msg3.encode(mStationData, *p3);
RadioManager::instance().scheduleTransmission(p3); RadioManager::instance().scheduleTransmission(p3);
// Our next static data report should be on the other channel // 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. * an open-source fashion, so they are (as usual) at least a decade behind the technology curve.
*/ */
#define STATION_MMSI 987654321 //#define STATION_MMSI 987654321
#define STATION_NAME "TEST STATION 01" //#define STATION_NAME "TEST STATION 01"
#define STATION_CALLSIGN "N0NNNN" //#define STATION_CALLSIGN "N0NNNN"
#endif /* GLOBALS_H_ */ #endif /* GLOBALS_H_ */