Subversion Repositories NaviCtrl

Rev

Rev 866 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
728 holgerb 1
#include <stdio.h>
2
#include <string.h>
3
#include "91x_lib.h"
4
#include "CamCtrl.h"
5
#include "i2c.h"
6
#include "timer1.h"
826 holgerb 7
#include "timer2.h"
728 holgerb 8
#include "led.h"
9
#include "main.h"
10
#include "uart1.h"
11
#include "compass.h"
12
#include "spi_slave.h"
13
#include "triggerlog.h"
14
 
15
FromCamCtrl_t FromCamCtrl;
16
ToCamCtrl_t ToCamCtrl;
790 holgerb 17
FromLaserCtrl_t FromLaserCtrl;
18
ToLaserCtrl_t ToLaserCtrl;
826 holgerb 19
FromGimbalCtrl_t FromGimbalCtrl;
20
ToGimbalCtrl_t ToGimbalCtrl;
790 holgerb 21
 
859 holgerb 22
s32 FromMenuGimbalYaw = 0,FromMenuServoNickControl = 0, MenuNickGimbalOffset = 0;
864 holgerb 23
u16 CamCtrlTimeout = 31000;
790 holgerb 24
u16 LaserCtrlTimeout = 5000;
845 holgerb 25
u16 GimbalCtrlTimeout = 8000;
864 holgerb 26
u16 I2C0_Timeout = 0;
845 holgerb 27
u8      ResetNickServoValue = 1;
728 holgerb 28
 
29
void InitCamCtrl(void)
30
{
31
 ToCamCtrl.CamCommand = 0;
32
 ToCamCtrl.ZoomInput = 128; // Middle -> no zoom
33
}
34
 
35
void CamCtrl_UpdateData(u8* pRxBuffer, u8 RxBufferSize)
36
{       // if crc is ok and number of byte are matching
826 holgerb 37
 static u8 speak_rec_on = 1;
38
 static u8 speak_rec_off = 0;
39
 
728 holgerb 40
  memcpy((u8 *)&FromCamCtrl, pRxBuffer, sizeof(FromCamCtrl));
41
//if(FromCamCtrl.CamStatus & CAM_STATE_PIC_CAPTURED) 
42
        if(FromCamCtrl.CamStatus & CAM_STATE_REC_ACTIVE)                CamCtrlCharacter = 'R';
43
        else if(FromCamCtrl.CamStatus & CAM_STATE_PHOTO_MODE)   CamCtrlCharacter = 'P';
732 holgerb 44
        else if(FromCamCtrl.CamStatus & CAM_STATE_CAM_DISCONN)  CamCtrlCharacter = '?';
728 holgerb 45
        else if(FromCamCtrl.CamStatus & CAM_STATE_OFF)                  CamCtrlCharacter = '!';
46
        else if(TrigLogging.CountExternal)                                              CamCtrlCharacter = TrigLogging.CountExternal % 10 + '0';
47
        else if(FromCamCtrl.PhotoCount)                                                 CamCtrlCharacter = FromCamCtrl.PhotoCount % 10 + '0';
48
        else if(FromCamCtrl.CamStatus & CAM_STATE_RDY)                  CamCtrlCharacter = 'c';
49
        else  CamCtrlCharacter = ' ';
50
 
51
// c = camera is ready
52
// R = Record active
53
// P = Cam in Photo mode (LANC Camcorders)
54
// ! = Camera is off but connected
55
// ? = disconnected
56
// 0-9 = Photo releases
57
 
826 holgerb 58
//+++++++++++++++++++++++++++++++++++++++++++++++++++
59
//+ Speak
60
//+++++++++++++++++++++++++++++++++++++++++++++++++++
61
 if(!SpeakHoTT)
62
  {
63
        if(FromCamCtrl.CamStatus & CAM_STATE_REC_ACTIVE)        
64
         {
65
          if(speak_rec_on) SpeakHoTT = SPEAK_REC_START;
66
          speak_rec_on = 0;
67
          speak_rec_off = 1;
68
         }
69
         else
70
         {
71
          if(speak_rec_off)  SpeakHoTT = SPEAK_REC_STOP;
72
          speak_rec_on = 1;
73
          speak_rec_off = 0;
74
         }
75
  }
76
//+++++++++++++++++++++++++++++++++++++++++++++++++++
77
 
864 holgerb 78
  if(FromCamCtrl.CamStatus & CAM_STATE_I2C_OK) CamCtrlTimeout = 19000;
79
  I2C0_Timeout = 31000;
728 holgerb 80
}
81
 
82
void CamCtrl_GetData(u8 timeout)
83
{
730 holgerb 84
 static u8 timing = 250, p63 = 0;
732 holgerb 85
 static u8 force1photo = 0, delay ;             // makes one photo when switching from Off to Photo
728 holgerb 86
 
87
 if(timing)
88
   {
89
    timing--;
90
   }
91
   else
92
        // try to catch the I2C buffer within timeout ms
93
   if(I2CBus_LockBuffer(I2C0, timeout))
94
        {
733 holgerb 95
                u8 RxBytes = sizeof(FromCamCtrl);
728 holgerb 96
                // initiate transmission
97
                ToCamCtrl.ZoomInput = 128 + PPM_In[EE_Parameter.CamCtrlZoomChannel];
98
                if(EE_Parameter.CamCtrlModeChannel)
99
                 {
100
                        if(PPM_In[EE_Parameter.CamCtrlModeChannel] > 50)        // max
101
                           {
102
                        ToCamCtrl.CamCommand &= ~CAM_CMD_REC_OFF;
103
                            ToCamCtrl.CamCommand |= CAM_CMD_REC_ON;
732 holgerb 104
                                force1photo = 0;
728 holgerb 105
                           }
106
                        else
107
                        if(PPM_In[EE_Parameter.CamCtrlModeChannel] < -50)        // min
108
                           {
109
                        ToCamCtrl.CamCommand &= ~CAM_CMD_REC_ON;
110
                            ToCamCtrl.CamCommand |= CAM_CMD_REC_OFF;
732 holgerb 111
                                force1photo = 1;
112
                                p63 = 0;
113
                                delay = 5;
728 holgerb 114
                                }
115
                    else         // Middle
732 holgerb 116
                          {
117
                           if(delay) delay--;
118
                                else
728 holgerb 119
                           {
732 holgerb 120
                        if(force1photo || ((UART_VersionInfo.HWMajor >= 30) && TRIGGER_PP_INTERN) || ((UART_VersionInfo.HWMajor < 30) && (FC.StatusFlags2 & FC_STATUS2_OUT1_ACTIVE))) // internal Portpin or Flag
728 holgerb 121
                                 {
122
                                  if(!p63) ToCamCtrl.CamCommand |= CAM_CMD_SHUTTER; // combined with the FC trigger output
123
                                  p63 = 1;
732 holgerb 124
                                  force1photo = 0;
728 holgerb 125
                                 }
126
                                 else p63 = 0;
127
                           }
732 holgerb 128
                          }
728 holgerb 129
                }
130
 
826 holgerb 131
        I2CBus_Transmission(I2C0, CAM_SLAVE_ADDRESS, &ToCamCtrl, sizeof(ToCamCtrl)+1, &CamCtrl_UpdateData, RxBytes);
728 holgerb 132
 
133
        if(!EE_Parameter.CamCtrlModeChannel) ToCamCtrl.CamCommand = 0; // delete REC_OFF
134
        ToCamCtrl.CamCommand = CAM_CMD_SWITCH_ON | (ToCamCtrl.CamCommand & (CAM_CMD_REC_ON | CAM_CMD_REC_OFF));
135
        timing = 66; // 66ms = 15Hz
136
   }
730 holgerb 137
   else timing = 11; // try again in 11ms
728 holgerb 138
}
790 holgerb 139
 
826 holgerb 140
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
141
//+ Laser
142
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
790 holgerb 143
void LaserCtrl_UpdateData(u8* pRxBuffer, u8 RxBufferSize)
144
{       // if crc is ok and number of byte are matching
145
  memcpy((u8 *)&FromLaserCtrl, pRxBuffer, sizeof(FromLaserCtrl));
146
  DebugOut.Analog[13] = FromLaserCtrl.Distance;
147
  if((FromLaserCtrl.LaserStatus & LASER_DATA_OK) && (FromLaserCtrl.Distance == 0)) FromLaserCtrl.Distance = 1; // just to mark that the value is active (0 -> not connected)
863 holgerb 148
  LaserCtrlTimeout = 30000;
864 holgerb 149
  I2C0_Timeout = 31000;
790 holgerb 150
}
151
 
152
 
153
void LaserCtrl_GetData(u8 timeout)
154
{
155
 static u8 timing = 250;
156
 
157
 if(timing)
158
   {
159
    timing--;
160
   }
161
   else
162
        // try to catch the I2C buffer within timeout ms
163
   if(I2CBus_LockBuffer(I2C0, timeout))
164
        {
165
                u8 RxBytes = 3;//sizeof(FromLaserCtrl);
166
                // initiate transmission
826 holgerb 167
        I2CBus_Transmission(I2C0, LASER_SLAVE_ADDRESS, &ToLaserCtrl, sizeof(ToLaserCtrl)+1, &LaserCtrl_UpdateData, RxBytes);
790 holgerb 168
        timing = 66; // 66ms = 15Hz
169
   }
170
   else timing = 11; // try again in 11ms
171
}
172
 
826 holgerb 173
 
174
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
175
//+ Gimbal
176
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
177
 
178
void GimbalCtrl_UpdateData(u8* pRxBuffer, u8 RxBufferSize)
179
{       // if crc is ok and number of byte are matching
180
  memcpy((u8 *)&FromGimbalCtrl, pRxBuffer, sizeof(FromGimbalCtrl));
863 holgerb 181
  GimbalCtrlTimeout = 30000;
864 holgerb 182
  I2C0_Timeout = 31000;
826 holgerb 183
}
184
 
185
 
186
void GimbalCtrl_GetData(u8 timeout)
187
{
865 holgerb 188
 static u32 timing = 500, start_idle = 4000;
826 holgerb 189
 static s16 old_nick;
190
 s16 tmp, NickGimbal;
191
#define GIMBAL_DATARATE  66       // 66ms = 15Hz bzw. 30Hz 
192
 
193
 tmp = ((signed int)NickServoValue - 8192) / 7;
194
 if(EE_Parameter.ServoCompInvert & SERVO_NICK_INV) NickGimbal = -tmp; else NickGimbal = tmp;
195
 NickGimbal += CAM_Orientation.Elevation; // Add Poi Nick
859 holgerb 196
 NickGimbal += MenuNickGimbalOffset / 50;
826 holgerb 197
 if((old_nick != NickGimbal) && (timing < GIMBAL_DATARATE/2)) timing = 0;  // Schneller, wenn sich die Daten ändern
198
 
199
 if(timing)
200
   {
201
    timing--;
865 holgerb 202
    if(start_idle) start_idle--;// nach dem Start einige Sekunden warten
826 holgerb 203
   }
204
  else
205
  {
206
        // try to catch the I2C buffer within timeout ms
863 holgerb 207
//DebugOut.Analog[]++;
826 holgerb 208
   if(I2CBus_LockBuffer(I2C0, timeout))
209
        {
845 holgerb 210
                u8 i, RxBytes = 1+6; // Status + 3 * Angle
211
                u8 *dat;
212
                s32 min_n, max_n, min_r, max_r;
826 holgerb 213
                // initiate transmission
845 holgerb 214
                tmp = (s16) (FromFC_ServoRollControl - 128) * 4;
863 holgerb 215
                if(EE_Parameter.ServoCompInvert & SERVO_ROLL_INV) ToGimbalCtrl.Roll = tmp; else ToGimbalCtrl.Roll = -tmp;
853 holgerb 216
//              ToGimbalCtrl.Yaw = (s32) SerialChannel.Ch[0] * 3;
863 holgerb 217
                ToGimbalCtrl.Yaw = (s32) (PPM_In[EE_Parameter.GimbalYawChannel]) * -2;
866 holgerb 218
 
219
// ++++++++++++++++++++++++++++++++++++++++++++++
220
// digital switching outputs 
221
            if(PPM_In[EE_Parameter.GimbalOut1Channel] > 10) ToGimbalCtrl.BitCmd |= GIMBAL_CMD_OUT1;
222
        if(PPM_In[EE_Parameter.GimbalOut2Channel] > 10) ToGimbalCtrl.BitCmd |= GIMBAL_CMD_OUT2;                
223
// flags will be reset after transmitting
224
// ++++++++++++++++++++++++++++++++++++++++++++++
225
 
859 holgerb 226
                if(FromMenuGimbalYaw) ToGimbalCtrl.Yaw = FromMenuGimbalYaw;
826 holgerb 227
                ToGimbalCtrl.NRY_Speed = 100;
228
                ToGimbalCtrl.Filter = 5;
229
                ToGimbalCtrl.Nick = NickGimbal;
845 holgerb 230
// ++++++++++++++++++++++++++++++++++++++++++++++
231
// + limit angles (0 = -128°  255 = +127°)
232
// ++++++++++++++++++++++++++++++++++++++++++++++
859 holgerb 233
                if(FC.RC_Quality < 50) // Failsafe-Positions
845 holgerb 234
                 {
865 holgerb 235
                  if(EE_Parameter.ServoFS_Pos[0]) (s32)((u32)EE_Parameter.ServoFS_Pos[0] * 10) - 1280; //else ToGimbalCtrl.Nick = 0;
236
                  if(EE_Parameter.ServoFS_Pos[1]) (s32)((u32)EE_Parameter.ServoFS_Pos[1] * 10) - 1280; //else ToGimbalCtrl.Roll = 0;
845 holgerb 237
                 }
865 holgerb 238
 
845 holgerb 239
                min_n = (s32)((u32)EE_Parameter.ServoNickMin * 10) - 1280;
240
                max_n = (s32)((u32)EE_Parameter.ServoNickMax * 10) - 1280;
241
        if(ToGimbalCtrl.Nick > max_n) ToGimbalCtrl.Nick = max_n;
242
        if(ToGimbalCtrl.Nick < min_n) ToGimbalCtrl.Nick = min_n;
243
                min_r = (s32)((u32)EE_Parameter.ServoRollMin * 10) - 1280;
244
                max_r = (s32)((u32)EE_Parameter.ServoRollMax * 10) - 1280;
245
        if(ToGimbalCtrl.Roll > max_r) ToGimbalCtrl.Roll = max_r;
246
        if(ToGimbalCtrl.Roll < min_r) ToGimbalCtrl.Roll = min_r;
247
// ++++++++++++++++++++++++++++++++++++++++++++++
865 holgerb 248
        if(start_idle) // nach dem Start einige Sekunden warten
249
          {
250
           ToGimbalCtrl.Nick = 0;
251
           ToGimbalCtrl.Roll = 0;
252
           ToGimbalCtrl.Yaw = 0;
253
          }
254
// ++++++++++++++++++++++++++++++++++++++++++++++
845 holgerb 255
// + Crc
256
// ++++++++++++++++++++++++++++++++++++++++++++++
257
                ToGimbalCtrl.Crc = 0x55; // initialize 
258
                dat = &ToGimbalCtrl; // pointer 
259
                for(i=0; i< sizeof(ToGimbalCtrl) - 1; i++) ToGimbalCtrl.Crc += dat[i];
260
// ++++++++++++++++++++++++++++++++++++++++++++++
261
RxBytes = sizeof(FromGimbalCtrl);
826 holgerb 262
 
263
                I2CBus_Transmission(I2C0, GIMBAL_SLAVE_ADDRESS, &ToGimbalCtrl, sizeof(ToGimbalCtrl)+1, &GimbalCtrl_UpdateData, RxBytes);
264
                timing = GIMBAL_DATARATE;
853 holgerb 265
                ToGimbalCtrl.BitCmd = GIMBAL_CMD_SPEED; // reset the Flags
826 holgerb 266
                old_nick = NickGimbal;
853 holgerb 267
 
826 holgerb 268
   }
863 holgerb 269
   else  timing = 11; // try again in 11ms 
826 holgerb 270
  }
271
}
272
 
273
void CalcNickServoValue(void)
274
{
275
 signed int max, min;
276
#define MULTIPLYER 4
277
 if(EE_Parameter.ServoCompInvert & SERVO_RELATIVE) // relative moving of the servo value
278
  {
279
        max = ((unsigned int) EE_Parameter.ServoNickMax * MULTIPLYER * 15);
280
        min = ((unsigned int) EE_Parameter.ServoNickMin * MULTIPLYER * 20);
281
        NickServoValue -= ((signed char) (FromFC_ServoNickControl - 128) / 4) * 2; // * 6
845 holgerb 282
        if(ResetNickServoValue) NickServoValue = 8192; //  middle Position
283
        ResetNickServoValue = 0;
826 holgerb 284
        LIMIT_MIN_MAX(NickServoValue,min, max);
285
  }
286
  else NickServoValue = (int16_t)FromFC_ServoNickControl * (MULTIPLYER*16);  // direct poti control
859 holgerb 287
  MenuNickGimbalOffset += FromMenuServoNickControl;
288
  LIMIT_MIN_MAX(MenuNickGimbalOffset,-50000,50000);
826 holgerb 289
}
290
 
291
 
292
 
293
 
294
 
295