You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

141 lines
5.5 KiB

#define _IO_C
#include <xc.h>
#include "typedefs.h"
#include "mcu.h"
#include "io.h"
#include "pars.h"
#include "main.h"
#include "PID.h"
#include "isr.h"
#include "iron.h"
#include "usb/usb.h"
#include "usb/usb_driver.h"
#include "usb/usb_function_hid.h"
#define TXP (*((USBPacket *)USBTxBuffer))
#define RXP (*((USBPacket *)USBRxBuffer))
//#define IO_IDLE 0
//#define IO_BUSY 1
static unsigned int IO_TICKS;
static unsigned int IO_BUSY;
static unsigned int BuffPos;
void ProcessIO();
void IOInit(){
IO_TICKS = ISRTicks;
IO_BUSY = 1;
BuffEmpty=1;
USBDriverInit();
RXP.Command = 0;
}
void IOTasks(){
USBDeviceTasks();
if((USBDeviceState < CONFIGURED_STATE)||(USBSuspendControl==1)) return;
ProcessIO(); // This is where all the actual bootloader related data transfer/self programming takes place
}
void ProcessIO(){
static UINT16 _IronID=0;
UINT8 i;
if(!IO_BUSY && !HIDTxHandleBusy(USBInHandle)){
if(_IronID != IronID){
_IronID = IronID;
TXP.Command = 1;
TXP.Data16[0] = IronID;
USBInHandle = HIDTxPacket(HID_EP, (char *)&TXP, 64);
}
else if(IO_TICKS != ADCStep && !HIDTxHandleBusy(USBInHandle)){
IO_TICKS = ADCStep;
if(IO_TICKS & 1){
BuffPos++;
if(BuffPos>127){
BuffPos &= 127;
BuffEmpty=1;
}
TXP.Command=3;
TXP.LiveData.Ticks=IO_TICKS;
TXP.LiveData.CTTemp=CTTemp; //
TXP.LiveData.CTemp=PIDVars[0].CTemp[0]; //
TXP.LiveData.ADCTemp=PIDVars[0].ADCTemp[0]; //
TXP.LiveData.TAvgF=PIDVars[0].TAvgF[0] >> ADCAVG; //
TXP.LiveData.CHRes=PIDVars[0].HRAvg >> ADCAVG;// (PIDVars[0].Delta[0]>>4)+250;//HRAvg>>ADCAVG;
TXP.LiveData.TAvgP=PIDVars[0].TAvgP[0];
TXP.LiveData.Heater=PHEATER;
TXP.LiveData.WSDelta[0] = PIDVars[0].WSDelta[0].val + 2048; //
TXP.LiveData.WSDelta[1] = PIDVars[0].WSDelta[1].val + 2048; //
TXP.LiveData.WSDelta[2] = PIDVars[0].WSDelta[2].val + 2048; //
TXP.LiveData.WSDelta[3] = PIDVars[0].WSDelta[3].val + 2048; //
TXP.LiveData.WSDelta[4] = PIDVars[0].WSDelta[4].val + 2048; //
TXP.LiveData.WSDelta[5] = PIDVars[0].WSDelta[5].val + 2048; //
TXP.LiveData.WSDelta[6] = PIDVars[0].WSDelta[6].val + 2048; //
TXP.LiveData.WSDelta[7] = PIDVars[0].WSDelta[7].val + 2048; //
TXP.LiveData.DestinationReached=PIDVars[0].DestinationReached; //
TXP.LiveData.Duty = (UINT16)(PIDVars[0].PIDDutyFull>>8); //
USBInHandle = HIDTxPacket(HID_EP, (char *)&TXP, 64);
}
}
}
else {
if(!HIDRxHandleBusy(USBOutHandle)){
IO_BUSY = 1;
switch(RXP.Command){
case 0x81: //jump to bootloader
mcuJumpToBootLoader();
break;
case 0x61: //get operating mode
if(!HIDTxHandleBusy(USBInHandle)){
TXP.Command=0x61;
TXP.OpMode=1;
USBInHandle = HIDTxPacket(HID_EP, (char *)&TXP, 64);
IO_BUSY=0;
}
break;
case 2: //Query device
BeepTicks=5;
if(!HIDTxHandleBusy(USBInHandle)){
TXP.Command=2;
TXP.QueryDev.PacketDataFieldSize = 64;
USBInHandle = HIDTxPacket(HID_EP, (char *)&TXP, 64);
BeepTicks=20;
InvertTicks=20;
IO_BUSY=0;
}
break;
case 3: //Set current iron PID parameters
IronPars.Config[0].Gain = RXP.IronPars.Gain;
IronPars.Config[0].PID_KP = RXP.IronPars.PID_KP;
IronPars.Config[0].PID_KI = RXP.IronPars.PID_KI;
IronPars.Config[0].PID_DGain = RXP.IronPars.PID_DGain;
IronPars.Config[0].PID_OVSGain = RXP.IronPars.PID_OVSGain;
IO_BUSY = 0;
break;
case 4: //Get current iron PID parameters
if(!HIDTxHandleBusy(USBInHandle)){
BeepTicks=20;
TXP.Command=4;
TXP.IronPars.Gain = IronPars.Config[0].Gain;
TXP.IronPars.Offset = IronPars.Config[0].Offset;
TXP.IronPars.PID_KP = IronPars.Config[0].PID_KP;
TXP.IronPars.PID_KI = IronPars.Config[0].PID_KI;
TXP.IronPars.PID_DGain = IronPars.Config[0].PID_DGain;
TXP.IronPars.PID_OVSGain = IronPars.Config[0].PID_OVSGain;
USBInHandle = HIDTxPacket(HID_EP, (char *)&TXP, 64);
IO_BUSY = 0;
}
break;
default:
IO_BUSY = 0;
break;
}
if(!IO_BUSY) USBOutHandle = HIDRxPacket(HID_EP, (char *)&RXP, 64);
}
}
}
#undef _IO_C