Указатель на PROGMEM в функцию не работает(IDE 1.6.7)

Proset
Offline
Зарегистрирован: 01.03.2016

Доброго дня

Компилирую проект сделанный для еще более старого 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] );
	}
};

- опять та же ошибка.

В чем может быть дело?

Proset
Offline
Зарегистрирован: 01.03.2016

Описание в классе:

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 - помогло