Указатель на PROGMEM в функцию не работает(IDE 1.6.7)
- Войдите на сайт для отправки комментариев
Пт, 19/03/2021 - 19:29
Доброго дня
Компилирую проект сделанный для еще более старого IDE. Проект не компилируется с ошибкой error: invalid conversion from 'const AvcOutMessage*' to 'AvcOutMessage*' [-fpermissive]
Подправил код в библиотеке и в скетче, для начала сделал небольшой тест без библиотеки
код:
typedef enum
{ // No this is not a mistake, broadcast = 0!
AVC_MSG_DIRECT = 1,
AVC_MSG_BROADCAST = 0
} AvcTransmissionMode;
#define ACT_NONE 0 // no action
#define EV_NONE 0 // no event
typedef struct
{
byte actionID; // Action id
byte dataSize; // message size (bytes)
byte data[20]; // message
} AvcInMessageTable;
typedef struct
{
byte actionID; // Action id
byte dataSize; // message size (bytes)
byte data[20]; // message
word mask; // mask, set bit = 1 in not checked position (1<<5 or _BV(5) - datap[5] not checked)
} AvcInMaskedMessageTable;
typedef struct
{
AvcTransmissionMode broadcast; // Transmission mode: normal (1) or broadcast (0).
byte dataSize; // message size (bytes)
byte data[20]; // message
} AvcOutMessage;
AvcOutMessage const CmdPlayOk1_0 PROGMEM = {AVC_MSG_BROADCAST, 0x06, {0x45, 0x12, 0x50, 0x13, 0x04, 0x01}}; // Play begin message 1
AvcOutMessage const CmdStopOk2_0 PROGMEM = {AVC_MSG_BROADCAST, 0x0B, {0x45, 0x12, 0x51, 0x13, 0x04, 0x00}}; // Stop ok message 2
AvcOutMessage const CmdInit_01 PROGMEM = {AVC_MSG_BROADCAST, 0x05, {0x01, 0x11, 0x13, 0x24, 0x45}};
uint8_t message[50];
uint8_t slaveAddress, headAddress, dataSize;
void setup() {
SendMessage(&CmdStopOk2_0);
}
void loop() {
}
byte SendMessage ( const PROGMEM AvcOutMessage *msg){
LoadMessage(msg);
return (0);
}
void LoadMessage(const PROGMEM AvcOutMessage *msg){
byte broadcast = pgm_read_byte_near(&msg->broadcast);
//masterAddress = deviceAddress;
if (broadcast == AVC_MSG_BROADCAST)
slaveAddress = 0x01FF;
else
slaveAddress = headAddress;
dataSize = pgm_read_byte_near( &msg->dataSize );
for (byte i = 0; i < dataSize; i++ ){
message[i] = pgm_read_byte_near( &msg->data[i] );
}
};
Все замечательно откомпилировалось. Аналогично подправил код в библиотеке
byte AVCLanDrv::sendMessage ( const PROGMEM AvcOutMessage *msg){
loadMessage(msg);
return sendMessage();
// Loads message data for given mesage ID.
void AVCLanDrv::loadMessage(const PROGMEM AvcOutMessage *msg){
broadcast = pgm_read_byte_near(&msg->broadcast);
masterAddress = deviceAddress;
if (broadcast == AVC_MSG_BROADCAST)
slaveAddress = 0x01FF;
else
slaveAddress = headAddress;
dataSize = pgm_read_byte_near( &msg->dataSize );
for (byte i = 0; i < dataSize; i++ ){
message[i] = pgm_read_byte_near( &msg->data[i] );
}
};
- опять та же ошибка.
В чем может быть дело?
Описание в классе:
class AVCLanDrv{ public: bool broadcast; word masterAddress; word slaveAddress; word deviceAddress; word BoardDeviceAddress; //адрес магнитолы, где кнопка АМ word headAddress; byte dataSize; byte message[AVC_MAXMSGLEN]; byte event; byte actionID; bool readonly; void begin (); byte readMessage (void); byte sendMessage (void); byte sendMessage (AvcOutMessage*); void printMessage (bool incoming); bool isAvcBusFree (void); byte getActionID (AvcInMessageTable messageTable[], byte mtSize); byte getActionID (AvcInMaskedMessageTable messageTable[], byte mtSize); void loadMessage (AvcOutMessage*);В общем поменял в описаниях добавил const - помогло