-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathBoilerBot_Infantry_2022_Leo.ioc
356 lines (356 loc) · 13.1 KB
/
BoilerBot_Infantry_2022_Leo.ioc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
#MicroXplorer Configuration settings - do not modify
CAD.formats=
CAD.pinconfig=
CAD.provider=
CAN1.ABOM=ENABLE
CAN1.AWUM=ENABLE
CAN1.BS1=CAN_BS1_10TQ
CAN1.BS2=CAN_BS2_3TQ
CAN1.CalculateBaudRate=1000000
CAN1.CalculateTimeBit=1000
CAN1.CalculateTimeQuantum=71.42857142857143
CAN1.IPParameters=CalculateTimeQuantum,CalculateTimeBit,CalculateBaudRate,Prescaler,BS1,BS2,ABOM,AWUM,NART
CAN1.NART=ENABLE
CAN1.Prescaler=3
CAN2.ABOM=ENABLE
CAN2.AWUM=ENABLE
CAN2.BS1=CAN_BS1_10TQ
CAN2.BS2=CAN_BS2_3TQ
CAN2.CalculateBaudRate=1000000
CAN2.CalculateTimeBit=1000
CAN2.CalculateTimeQuantum=71.42857142857143
CAN2.IPParameters=CalculateTimeQuantum,CalculateTimeBit,CalculateBaudRate,BS1,BS2,Prescaler,ABOM,AWUM,NART,RFLM
CAN2.NART=ENABLE
CAN2.Prescaler=3
CAN2.RFLM=ENABLE
Dma.Request0=USART1_RX
Dma.Request1=USART6_RX
Dma.Request2=UART7_RX
Dma.Request3=UART7_TX
Dma.RequestsNb=4
Dma.UART7_RX.2.Direction=DMA_PERIPH_TO_MEMORY
Dma.UART7_RX.2.FIFOMode=DMA_FIFOMODE_DISABLE
Dma.UART7_RX.2.Instance=DMA1_Stream3
Dma.UART7_RX.2.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.UART7_RX.2.MemInc=DMA_MINC_ENABLE
Dma.UART7_RX.2.Mode=DMA_CIRCULAR
Dma.UART7_RX.2.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.UART7_RX.2.PeriphInc=DMA_PINC_DISABLE
Dma.UART7_RX.2.Priority=DMA_PRIORITY_HIGH
Dma.UART7_RX.2.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode
Dma.UART7_TX.3.Direction=DMA_MEMORY_TO_PERIPH
Dma.UART7_TX.3.FIFOMode=DMA_FIFOMODE_DISABLE
Dma.UART7_TX.3.Instance=DMA1_Stream1
Dma.UART7_TX.3.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.UART7_TX.3.MemInc=DMA_MINC_ENABLE
Dma.UART7_TX.3.Mode=DMA_CIRCULAR
Dma.UART7_TX.3.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.UART7_TX.3.PeriphInc=DMA_PINC_DISABLE
Dma.UART7_TX.3.Priority=DMA_PRIORITY_HIGH
Dma.UART7_TX.3.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode
Dma.USART1_RX.0.Direction=DMA_PERIPH_TO_MEMORY
Dma.USART1_RX.0.FIFOMode=DMA_FIFOMODE_DISABLE
Dma.USART1_RX.0.Instance=DMA2_Stream2
Dma.USART1_RX.0.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.USART1_RX.0.MemInc=DMA_MINC_ENABLE
Dma.USART1_RX.0.Mode=DMA_CIRCULAR
Dma.USART1_RX.0.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.USART1_RX.0.PeriphInc=DMA_PINC_DISABLE
Dma.USART1_RX.0.Priority=DMA_PRIORITY_LOW
Dma.USART1_RX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode
Dma.USART6_RX.1.Direction=DMA_PERIPH_TO_MEMORY
Dma.USART6_RX.1.FIFOMode=DMA_FIFOMODE_DISABLE
Dma.USART6_RX.1.Instance=DMA2_Stream1
Dma.USART6_RX.1.MemDataAlignment=DMA_MDATAALIGN_BYTE
Dma.USART6_RX.1.MemInc=DMA_MINC_ENABLE
Dma.USART6_RX.1.Mode=DMA_CIRCULAR
Dma.USART6_RX.1.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
Dma.USART6_RX.1.PeriphInc=DMA_PINC_DISABLE
Dma.USART6_RX.1.Priority=DMA_PRIORITY_LOW
Dma.USART6_RX.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode
FREERTOS.FootprintOK=true
FREERTOS.INCLUDE_vTaskDelayUntil=1
FREERTOS.IPParameters=Tasks01,FootprintOK,INCLUDE_vTaskDelayUntil,configUSE_TIMERS,Queues01,configTOTAL_HEAP_SIZE
FREERTOS.Queues01=CAN1_Receive,32,CAN_Export_Data_t,0,Dynamic,NULL,NULL;CAN2_Receive,32,CAN_Export_Data_t,0,Dynamic,NULL,NULL;CAN_Send,32,CAN_Send_Data_t,0,Dynamic,NULL,NULL
FREERTOS.Tasks01=Task_IMU,0,384,StartIMUTask,Default,NULL,Dynamic,NULL,NULL;Task_Init,2,128,General_Init,Default,NULL,Dynamic,NULL,NULL;Task_CAN_Send,2,256,CAN_Send_ALL,Default,NULL,Dynamic,NULL,NULL;Task_CAN1_Rec,2,256,CAN1_Rec,Default,NULL,Dynamic,NULL,NULL;Task_CAN2_Rec,2,256,CAN2_Rec,Default,NULL,Dynamic,NULL,NULL;Task_Robot_Ctrl,3,640,Robot_Control,Default,NULL,Dynamic,NULL,NULL;Task_UI,0,256,UI_Draw,Default,NULL,Dynamic,NULL,NULL
FREERTOS.configTOTAL_HEAP_SIZE=20000
FREERTOS.configUSE_TIMERS=0
File.Version=6
GPIO.groupedBy=Group By Peripherals
I2C2.Analog_Filter=I2C_ANALOGFILTER_DISABLE
I2C2.ClockSpeed=100000
I2C2.I2C_Mode=I2C_Standard
I2C2.IPParameters=I2C_Mode,Analog_Filter,OwnAddress,ClockSpeed
I2C2.OwnAddress=0
KeepUserPlacement=false
Mcu.CPN=STM32F427IIH6
Mcu.Family=STM32F4
Mcu.IP0=CAN1
Mcu.IP1=CAN2
Mcu.IP10=TIM7
Mcu.IP11=TIM12
Mcu.IP12=UART7
Mcu.IP13=UART8
Mcu.IP14=USART1
Mcu.IP15=USART6
Mcu.IP2=DMA
Mcu.IP3=FREERTOS
Mcu.IP4=I2C2
Mcu.IP5=NVIC
Mcu.IP6=RCC
Mcu.IP7=SPI5
Mcu.IP8=SYS
Mcu.IP9=TIM3
Mcu.IPNb=16
Mcu.Name=STM32F427I(G-I)Hx
Mcu.Package=UFBGA176
Mcu.Pin0=PE1
Mcu.Pin1=PE0
Mcu.Pin10=PD1
Mcu.Pin11=PF0
Mcu.Pin12=PH0/OSC_IN
Mcu.Pin13=PH1/OSC_OUT
Mcu.Pin14=PF1
Mcu.Pin15=PF7
Mcu.Pin16=PF6
Mcu.Pin17=PF9
Mcu.Pin18=PF8
Mcu.Pin19=PB2/BOOT1
Mcu.Pin2=PB5
Mcu.Pin20=PH6
Mcu.Pin21=PE8
Mcu.Pin22=PB12
Mcu.Pin23=PB13
Mcu.Pin24=PE7
Mcu.Pin25=VP_FREERTOS_VS_CMSIS_V1
Mcu.Pin26=VP_SYS_VS_tim6
Mcu.Pin27=VP_TIM3_VS_ClockSourceINT
Mcu.Pin28=VP_TIM7_VS_ClockSourceINT
Mcu.Pin29=VP_TIM12_VS_ClockSourceINT
Mcu.Pin3=PG14
Mcu.Pin4=PA14
Mcu.Pin5=PA13
Mcu.Pin6=PB7
Mcu.Pin7=PB6
Mcu.Pin8=PD0
Mcu.Pin9=PG9
Mcu.PinsNb=30
Mcu.ThirdPartyNb=0
Mcu.UserConstants=
Mcu.UserName=STM32F427IIHx
MxCube.Version=6.6.0
MxDb.Version=DB.6.0.60
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
NVIC.CAN1_RX0_IRQn=true\:6\:0\:true\:false\:true\:false\:true\:false\:true
NVIC.CAN2_RX0_IRQn=true\:6\:0\:true\:false\:true\:false\:true\:false\:true
NVIC.DMA1_Stream1_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true
NVIC.DMA1_Stream3_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true
NVIC.DMA2_Stream1_IRQn=true\:5\:0\:false\:false\:true\:false\:false\:false\:true
NVIC.DMA2_Stream2_IRQn=true\:0\:0\:true\:false\:true\:false\:false\:false\:true
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
NVIC.EXTI2_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true
NVIC.ForceEnableDMAVector=true
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
NVIC.MemoryManagement_IRQn=true\:0\:0\:true\:false\:true\:false\:false\:false\:false
NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
NVIC.PendSV_IRQn=true\:15\:0\:false\:false\:false\:true\:false\:false\:false
NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4
NVIC.SVCall_IRQn=true\:0\:0\:true\:false\:false\:false\:false\:false\:false
NVIC.SavedPendsvIrqHandlerGenerated=true
NVIC.SavedSvcallIrqHandlerGenerated=true
NVIC.SavedSystickIrqHandlerGenerated=true
NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:false\:true\:false\:true\:false
NVIC.TIM6_DAC_IRQn=true\:0\:0\:true\:false\:true\:false\:false\:true\:true
NVIC.TimeBase=TIM6_DAC_IRQn
NVIC.TimeBaseIP=TIM6
NVIC.USART1_IRQn=true\:5\:0\:true\:false\:true\:false\:true\:false\:true
NVIC.USART6_IRQn=true\:5\:0\:true\:false\:true\:false\:true\:false\:true
NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
PA13.Mode=Serial_Wire
PA13.Signal=SYS_JTMS-SWDIO
PA14.Mode=Serial_Wire
PA14.Signal=SYS_JTCK-SWCLK
PB12.Locked=true
PB12.Mode=CAN_Activate
PB12.Signal=CAN2_RX
PB13.Locked=true
PB13.Mode=CAN_Activate
PB13.Signal=CAN2_TX
PB2/BOOT1.GPIOParameters=GPIO_PuPd,GPIO_Label
PB2/BOOT1.GPIO_Label=Button
PB2/BOOT1.GPIO_PuPd=GPIO_PULLUP
PB2/BOOT1.Locked=true
PB2/BOOT1.Signal=GPXTI2
PB5.Locked=true
PB5.Signal=S_TIM3_CH2
PB6.GPIOParameters=GPIO_PuPd
PB6.GPIO_PuPd=GPIO_PULLUP
PB6.Locked=true
PB6.Mode=Asynchronous
PB6.Signal=USART1_TX
PB7.GPIOParameters=GPIO_PuPd
PB7.GPIO_PuPd=GPIO_PULLUP
PB7.Locked=true
PB7.Mode=Asynchronous
PB7.Signal=USART1_RX
PD0.Locked=true
PD0.Mode=CAN_Activate
PD0.Signal=CAN1_RX
PD1.Locked=true
PD1.Mode=CAN_Activate
PD1.Signal=CAN1_TX
PE0.Mode=Asynchronous
PE0.Signal=UART8_RX
PE1.Mode=Asynchronous
PE1.Signal=UART8_TX
PE7.Mode=Asynchronous
PE7.Signal=UART7_RX
PE8.Mode=Asynchronous
PE8.Signal=UART7_TX
PF0.GPIOParameters=GPIO_Pu
PF0.GPIO_Pu=GPIO_PULLUP
PF0.Locked=true
PF0.Mode=I2C
PF0.Signal=I2C2_SDA
PF1.GPIOParameters=GPIO_Pu
PF1.GPIO_Pu=GPIO_PULLUP
PF1.Locked=true
PF1.Mode=I2C
PF1.Signal=I2C2_SCL
PF6.GPIOParameters=PinState,GPIO_PuPd,GPIO_Label
PF6.GPIO_Label=SPI5_NSS
PF6.GPIO_PuPd=GPIO_PULLUP
PF6.Locked=true
PF6.PinState=GPIO_PIN_SET
PF6.Signal=GPIO_Output
PF7.Locked=true
PF7.Mode=Full_Duplex_Master
PF7.Signal=SPI5_SCK
PF8.Locked=true
PF8.Mode=Full_Duplex_Master
PF8.Signal=SPI5_MISO
PF9.Locked=true
PF9.Mode=Full_Duplex_Master
PF9.Signal=SPI5_MOSI
PG14.Locked=true
PG14.Mode=Asynchronous
PG14.Signal=USART6_TX
PG9.Locked=true
PG9.Mode=Asynchronous
PG9.Signal=USART6_RX
PH0/OSC_IN.Mode=HSE-External-Oscillator
PH0/OSC_IN.Signal=RCC_OSC_IN
PH1/OSC_OUT.Mode=HSE-External-Oscillator
PH1/OSC_OUT.Signal=RCC_OSC_OUT
PH6.Signal=S_TIM12_CH1
PinOutPanel.CurrentBGAView=Top
PinOutPanel.RotationAngle=0
ProjectManager.AskForMigrate=true
ProjectManager.BackupPrevious=false
ProjectManager.CompilerOptimize=6
ProjectManager.ComputerToolchain=false
ProjectManager.CoupleFile=true
ProjectManager.CustomerFirmwarePackage=
ProjectManager.DefaultFWLocation=true
ProjectManager.DeletePrevious=true
ProjectManager.DeviceId=STM32F427IIHx
ProjectManager.FirmwarePackage=STM32Cube FW_F4 V1.27.0
ProjectManager.FreePins=false
ProjectManager.HalAssertFull=false
ProjectManager.HeapSize=0x200
ProjectManager.KeepUserCode=true
ProjectManager.LastFirmware=true
ProjectManager.LibraryCopy=1
ProjectManager.MainLocation=Core/Src
ProjectManager.NoMain=false
ProjectManager.PreviousToolchain=
ProjectManager.ProjectBuild=false
ProjectManager.ProjectFileName=BoilerBot_Infantry_2022_Leo.ioc
ProjectManager.ProjectName=BoilerBot_Infantry_2022_Leo
ProjectManager.RegisterCallBack=
ProjectManager.StackSize=0x400
ProjectManager.TargetToolchain=MDK-ARM V5.32
ProjectManager.ToolChainLocation=
ProjectManager.UnderRoot=false
ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_TIM12_Init-TIM12-false-HAL-true,5-MX_USART1_UART_Init-USART1-false-HAL-true,6-MX_SPI5_Init-SPI5-false-HAL-true,7-MX_TIM3_Init-TIM3-false-HAL-true,8-MX_CAN1_Init-CAN1-false-HAL-true,9-MX_CAN2_Init-CAN2-false-HAL-true,10-MX_I2C2_Init-I2C2-false-HAL-true,11-MX_USART6_UART_Init-USART6-false-HAL-true,12-MX_UART7_Init-UART7-false-HAL-true,13-MX_TIM7_Init-TIM7-false-HAL-true,14-MX_UART8_Init-UART8-false-HAL-true
RCC.48MHZClocksFreq_Value=48000000
RCC.AHBFreq_Value=168000000
RCC.APB1CLKDivider=RCC_HCLK_DIV4
RCC.APB1Freq_Value=42000000
RCC.APB1TimFreq_Value=84000000
RCC.APB2CLKDivider=RCC_HCLK_DIV2
RCC.APB2Freq_Value=84000000
RCC.APB2TimFreq_Value=168000000
RCC.CortexFreq_Value=168000000
RCC.EthernetFreq_Value=168000000
RCC.FCLKCortexFreq_Value=168000000
RCC.FamilyName=M
RCC.HCLKFreq_Value=168000000
RCC.HSE_VALUE=12000000
RCC.HSI_VALUE=16000000
RCC.I2SClocksFreq_Value=192000000
RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSE_VALUE,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLQ,PLLQCLKFreq_Value,PLLSourceVirtual,RTCFreq_Value,RTCHSEDivFreq_Value,SAI_AClocksFreq_Value,SAI_BClocksFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAIOutputFreq_Value,VCOSAIOutputFreq_ValueQ,VcooutputI2S,VcooutputI2SQ
RCC.LSE_VALUE=32768
RCC.LSI_VALUE=32000
RCC.MCO2PinFreq_Value=168000000
RCC.PLLCLKFreq_Value=168000000
RCC.PLLM=6
RCC.PLLN=168
RCC.PLLQ=7
RCC.PLLQCLKFreq_Value=48000000
RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE
RCC.RTCFreq_Value=32000
RCC.RTCHSEDivFreq_Value=6000000
RCC.SAI_AClocksFreq_Value=24500000
RCC.SAI_BClocksFreq_Value=24500000
RCC.SYSCLKFreq_VALUE=168000000
RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK
RCC.VCOI2SOutputFreq_Value=384000000
RCC.VCOInputFreq_Value=2000000
RCC.VCOOutputFreq_Value=336000000
RCC.VCOSAIOutputFreq_Value=98000000
RCC.VCOSAIOutputFreq_ValueQ=24500000
RCC.VcooutputI2S=192000000
RCC.VcooutputI2SQ=192000000
SH.GPXTI2.0=GPIO_EXTI2
SH.GPXTI2.ConfNb=1
SH.S_TIM12_CH1.0=TIM12_CH1,PWM Generation1 CH1
SH.S_TIM12_CH1.ConfNb=1
SH.S_TIM3_CH2.0=TIM3_CH2,PWM Generation2 CH2
SH.S_TIM3_CH2.ConfNb=1
SPI5.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_128
SPI5.CalculateBaudRate=656.25 KBits/s
SPI5.Direction=SPI_DIRECTION_2LINES
SPI5.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,BaudRatePrescaler
SPI5.Mode=SPI_MODE_MASTER
SPI5.VirtualType=VM_MASTER
TIM12.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1
TIM12.IPParameters=Channel-PWM Generation1 CH1,Period,Prescaler
TIM12.Period=0
TIM12.Prescaler=42
TIM3.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2
TIM3.IPParameters=Channel-PWM Generation2 CH2,Period
TIM3.Period=4999
TIM7.IPParameters=Prescaler,Period
TIM7.Period=50
TIM7.Prescaler=84
UART7.IPParameters=VirtualMode
UART7.VirtualMode=Asynchronous
UART8.IPParameters=VirtualMode
UART8.VirtualMode=Asynchronous
USART1.BaudRate=100000
USART1.IPParameters=VirtualMode,BaudRate
USART1.VirtualMode=VM_ASYNC
USART6.IPParameters=VirtualMode
USART6.VirtualMode=VM_ASYNC
VP_FREERTOS_VS_CMSIS_V1.Mode=CMSIS_V1
VP_FREERTOS_VS_CMSIS_V1.Signal=FREERTOS_VS_CMSIS_V1
VP_SYS_VS_tim6.Mode=TIM6
VP_SYS_VS_tim6.Signal=SYS_VS_tim6
VP_TIM12_VS_ClockSourceINT.Mode=Internal
VP_TIM12_VS_ClockSourceINT.Signal=TIM12_VS_ClockSourceINT
VP_TIM3_VS_ClockSourceINT.Mode=Internal
VP_TIM3_VS_ClockSourceINT.Signal=TIM3_VS_ClockSourceINT
VP_TIM7_VS_ClockSourceINT.Mode=Enable_Timer
VP_TIM7_VS_ClockSourceINT.Signal=TIM7_VS_ClockSourceINT
board=custom