Página 1 de 1

Ajuda em adaptação C++ para C

MensagemEnviado: 20 Jan 2022 18:54
por vtrx
Vou começar a tentar 'portar' umas rotinas usadas num sketch Arduino para C->Keil.
Comecei com uma rotina simples, para ver a dificuldade, e me deparei com minha limitação.
A rotina original é assim:
Código: Selecionar todos
int32_t Joystick_::ConstantForceCalculator(volatile TEffectState& effect)
{
  float tempforce = (float)effect.magnitude * effect.gain / 255;
  tempforce = map(tempforce, -10000, 10000, -255, 255);
  return (int32_t) tempforce;
}


Não entendo a parte TEffectState& effect
Acima da rotina acrescentei a estrutura,conforme o original:
Código: Selecionar todos
typedef struct {
  volatile uint8_t state;  // see constants <MEffectState_*>
  uint8_t effectType; //
  int16_t offset;
  uint8_t gain;
  int16_t attackLevel, fadeLevel;
  int16_t magnitude;
  uint8_t enableAxis; // bits: 0=X, 1=Y, 2=DirectionEnable
  uint8_t directionX; // angle (0=0 .. 255=360deg)
  uint8_t directionY; // angle (0=0 .. 255=360deg)
  int16_t cpOffset; // -128..127
  int16_t  positiveCoefficient; // -128..127
  int16_t  negativeCoefficient; // -128..127
  uint16_t positiveSaturation;  // -128..127
  uint16_t negativeSaturation;  // -128..127
  uint16_t deadBand;  // 0..255
  uint16_t phase;  // 0..255 (=0..359, exp-2)
  int16_t startMagnitude;
  int16_t  endMagnitude;
  uint16_t  period; // 0..32767 ms
  uint16_t duration, fadeTime, attackTime, elapsedTime;
  uint64_t startTime;

} TEffectState;


Mais um exemplo como é utilizada esta rotina:
Código: Selecionar todos
int32_t Joystick_::ConstantForceCalculator(volatile TEffectState& effect)
{
   return ApplyEnvelope(effect, (int32_t)effect.magnitude);
}


Tentei no Keil assim:
Código: Selecionar todos
int32_t ConstantForceCalculator(volatile TEffectState&  effect) {
  float tempforce = (float)effect.magnitude * effect.gain / 255;
  tempforce = map(tempforce, -10000, 10000, -255, 255);
  return (int32_t) tempforce;
}   

Claro que apresenta erro ..\application\Src\main.c(77): error: #18: expected a ")" onde fica o & e ..\application\Src\main.c(78): error: #20: identifier "effect" is undefined

Qual a alteração preciso fazer?

Re: Ajuda em adaptação C++ para C

MensagemEnviado: 26 Jan 2022 23:04
por vtrx
Ja resolvi a questão acima,mas apareceu uma dúvida.
A estrutura original esta definida assim:
Código: Selecionar todos
typedef struct// FFB: PID Pool Feature Report
{
   uint8_t   reportId;   // =7
   uint16_t   ramPoolSize;   // ?
   uint8_t      maxSimultaneousEffects;   // ?? 40?
   uint8_t      memoryManagement;   // Bits: 0=DeviceManagedPool, 1=SharedParameterBlocks
} USB_FFBReport_PIDPool_Feature_Data_t;


No keil as definições estão assim;
Código: Selecionar todos
struct USB_FFBReport_PIDPool_Feature_Data_t ;   
...
USB_FFBReport_PIDPool_Feature_Data_t ans;
uint8_t *Feature(uint16_t Length)
{
...
 ans.reportId = 7;
 ans.ramPoolSize = 0xffff;
 ans.maxSimultaneousEffects = 14;
 ans.memoryManagement = 3;   
   
 return (uint8_t *) &ans;   
}

Estou tentando manter as definições e nomenclatura o mais perto do original C++ possível.
A rotina acima me retorna:
07
00
FF
FF
0E

O correto é:
07
FF
FF
0E
03

Para ter os valores correto tenho que deixar os campos da estrutura todos com um byte(uint8_t).
Queria deixar o código o mais parecido com o original possível porque é um código longo com muitas estruturas e difícil para testar, oque esta me ajudando é um pouco de bom senso e um circuito gravado com o código original funcional em C++.
Vale a penas alterar a estrutura?
O problema seria a facilidade em carregar valores de dois bytes trocados,pois é muito mais facil carregar x=0xffff que x(high)0xff e x(low)0xff.

Re: Ajuda em adaptação C++ para C

MensagemEnviado: 28 Jan 2022 18:41
por vtrx
Achei a solução no forum ARM Keil,tenho que usar o atributo __attribute__ ((packed))