From adcf95d19af1821bce9adbeb56163958efcb7a56 Mon Sep 17 00:00:00 2001 From: Alexandre Bobkov Date: Sat, 5 Jul 2025 17:19:28 -0400 Subject: [PATCH] . --- .../tutorial/docs/build/doctrees/data.doctree | Bin 9232 -> 10194 bytes .../docs/build/doctrees/environment.pickle | Bin 24136 -> 24136 bytes .../docs/build/html/_sources/data.rst.txt | 4 ++++ .../tutorial/docs/build/html/data.html | 3 +++ .../tutorial/docs/build/html/searchindex.js | 2 +- .../tutorial/docs/build/simplepdf/.buildinfo | 2 +- .../tutorial/docs/build/simplepdf/index.html | 15 +++++++++++++++ ESP-IDF_Robot/tutorial/docs/source/data.rst | 4 ++++ 8 files changed, 28 insertions(+), 2 deletions(-) diff --git a/ESP-IDF_Robot/tutorial/docs/build/doctrees/data.doctree b/ESP-IDF_Robot/tutorial/docs/build/doctrees/data.doctree index 45235b781ee32cf30fa0c80ebfe1663d889fba61..13a25202f50c5e7a327091848b54220756e777f0 100644 GIT binary patch delta 1466 zcmb_c-%Aux6!xx7mg}$0ACtQ3^#}e~-2$PPpeQm30u2HUqs?*m=ACVKW|^H)e9$dQ zaAk?&Zht^XuYoLtr1n@4K8O+Y5JA25pbbqs`{UM@4|eBXDz`<>Z+cxiJ; zxuZOO-L<4_l%|3`ce69uZmwjuMmRI5lVlM(rQ4i_&3N1~^sr{@ra=>yX`5j)mZUNL zHlr7>UI`8kjr38Q>q(llEhlVKcnSoV5jG<%5(rS;uuZDb@oAeOf@yJtGov&Rur19< z#&z3HNu*{|i%mE&%|a5hCN-F2;tSN13DZb23R>U|YYE5hqnZ(+w{$~`#il_o!ghy( zRhR*^Fw-Y>V}ddO0yk_Lwq?dB*R05tX0a1lUUDPbo#M5bf&X#w>|8bdp$;owkRto;UN z3sWmy!DH^bgS~}yu!u|M(at@@vfA$QaE|`tx?Cd;atiqrRw`Ypn9okh#b3mH&hOmpTl zT6{QGF4oj$MFPc_vN3{nRcPg1DkEX@Xx)50u!|DimDj9vyeDWs)iv>p8@poiZ zVuMg#Mr@r+9gBG^6JIOp#r=9;)xG`0Q^={B*xmS(P zJ)TZaZnpVz@#rrgMStLN9gk~xe8XcK4kvTe(BjOVPOv2Y<3&R7UCK(}H`LGERXd zk4@eu)WMW-3@j@PlHJ@S9L30#@eCv_{-`u5L$rrQp(I~nO6!!yDYa8HfNCCr?Q|A3 zV#@ddHs#UeHKOmBfZ`xKUJ6S?HoG~7(1L(%AXmlMQLAZ`5(pMSFz-l#t!bKpp!bqlr1VL&i&l8lH>?SKH zV2f(AB}jvSIjW$<=2^0~jEpnD#%cpikeDnaU&^SwxkG*%6Vn66%??VBn4>lWHDzr8 z5uzYM2t=#~5i5X1X%A;!Vs2_lWkG5&D6F$Usyo3dJHe_tOEVNe;vfSuxWT$JO2Jxz KAy=ao#s~m4)uyNb diff --git a/ESP-IDF_Robot/tutorial/docs/build/doctrees/environment.pickle b/ESP-IDF_Robot/tutorial/docs/build/doctrees/environment.pickle index 00de8cbb87a325c72a75044a3e77c4dfd8e6b77d..f9a55c507987c720ce6e0f87745d3e772163bc2d 100644 GIT binary patch delta 381 zcmW;Fze_?<6bJC0S!#xnLqWZQ;62C}xHvXNO+`ZuMK#1tZ~8>vmHS?1(CYT6=v*2? z8Vd3U1<@lAk}zuUPibgr$%caNartoIe81;(T1uy-JS;{>{CkY$gc~3^Gi|YbAW=0w z>|{74sofk)61fYRd6G6Q!jEJw$?}C9EeSVhF;1NWZh4hxWppW6;4IClZ3}n6v>eW4 zf)yz*n)Fb(VTTjT&YO-yxp4g{;t;v#G)YaF=~Ys+1jpL;Lpi0G`T delta 410 zcmW;Gze|Ea7zglPQ`9UWhla9R-WPh`KnnkXpaz!~hrk--(o0`?eNXPatf1BHrKCF= zN*W6C2MW=<1W6P%IQAdZ*wE6Fjost&Ik@|NpXUaBWzbjd)?=90} __attribute__((packed)) sensors_data_t; +

When used with communication protocols like ESP-NOW, this struct is encoded into a byte stream, then +transmitted at regular intervals or in response to user input, and finally +decoded on the receiving end to control hardware.

Struct Walkthrough

x_axis and y_axis fields capture analog input from a joystick, determining direction and speed. diff --git a/ESP-IDF_Robot/tutorial/docs/build/html/searchindex.js b/ESP-IDF_Robot/tutorial/docs/build/html/searchindex.js index bf2f14f83..8f9b785ff 100644 --- a/ESP-IDF_Robot/tutorial/docs/build/html/searchindex.js +++ b/ESP-IDF_Robot/tutorial/docs/build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"alltitles":{"ByteRider documentation":[[1,null]],"Chassis":[[4,"chassis"]],"DATA STRUCT":[[0,null]],"Data Encapsulation":[[6,"data-encapsulation"]],"Direction and Speed":[[3,"direction-and-speed"]],"Finished Work":[[4,"finished-work"]],"Fusion of Software with Hardware":[[3,"fusion-of-software-with-hardware"]],"HOW DOES IT WORK?":[[3,null]],"INTRODUCTION":[[2,null]],"Motor Wires Harness":[[4,"motor-wires-harness"]],"RECEIVER":[[5,null]],"Reserved Pins & GPIOs":[[3,"reserved-pins-gpios"]],"Schematic":[[3,"schematic"]],"Struct Walkthrough":[[0,"struct-walkthrough"]],"TRANSMITTER":[[6,null]],"WORK-IN-PROGRESS WALK THROUGH":[[4,null]],"Why Use __attribute((packed))?":[[0,"why-use-attribute-packed"]],"Wiring":[[4,"wiring"]],"x- and y- axis":[[3,"x-and-y-axis"]]},"docnames":["data","index","intro","overview","progress","receiver","transmitter"],"envversion":{"sphinx":65,"sphinx.domains.c":3,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":9,"sphinx.domains.index":1,"sphinx.domains.javascript":3,"sphinx.domains.math":2,"sphinx.domains.python":4,"sphinx.domains.rst":2,"sphinx.domains.std":2},"filenames":["data.rst","index.rst","intro.rst","overview.rst","progress.rst","receiver.rst","transmitter.rst"],"indexentries":{},"objects":{},"objnames":{},"objtypes":{},"terms":{"":0,"0":3,"04x":3,"0x":3,"1":3,"100":3,"15":3,"16":3,"2":3,"3":3,"4":[0,3],"47":3,"48":3,"5":3,"50":[],"6":3,"7":3,"8":3,"90":3,"91":3,"95":[],"A":3,"IN":1,"IT":1,"If":3,"In":[0,3],"It":0,"NOT":3,"ON":0,"The":[0,3],"__attribut":1,"__attribute__":0,"__gpio6__":[],"_static":[],"across":0,"adapt":3,"adc1_ch0":3,"adc1_ch1":3,"add":0,"addit":0,"address":3,"all":0,"alloc":3,"allow":0,"an":0,"analog":0,"ani":[0,3],"ar":3,"arg":3,"assign":3,"attribut":0,"axi":[],"back":3,"bacl":3,"bandwidth":0,"base":3,"batteri":0,"being":3,"below":[],"between":0,"bitbyterid":3,"board":3,"bool":0,"breadboard":3,"brief":3,"buf":3,"buffer":3,"button":[0,3],"byte":0,"c3":3,"call":3,"can":3,"captur":0,"car":3,"chang":3,"channel":3,"chassi":1,"clockwis":3,"code":3,"column":[],"command":0,"compact":0,"compat":0,"compil":0,"complet":4,"configur":0,"consequ":3,"constraint":3,"contain":0,"content":[],"contin":3,"control":[0,3,4],"correspond":3,"counter":3,"crc":3,"cycl":3,"data":[1,3],"data_len":3,"dc":[0,3,4],"declar":3,"dedic":3,"defin":3,"deletep":3,"design":0,"detail":[],"determin":[0,3],"devboard":3,"develop":3,"developmemt":3,"devic":0,"diagon":3,"differenti":0,"direct":0,"displai":3,"doe":1,"drive":0,"duti":3,"e":[0,3],"each":3,"els":3,"embed":0,"enabl":0,"encapsul":[0,1],"ensur":0,"error":3,"esp":[0,3],"esp32":3,"esp_log":3,"esp_logi":3,"esp_logw":3,"esp_now_is_peer_exist":3,"esp_now_send":3,"esp_now_send_status_t":3,"etc":0,"even":0,"event":3,"everi":3,"evok":3,"exact":0,"exist":[],"expect":0,"field":0,"fine":0,"finish":1,"follow":3,"four":[0,3],"from":0,"front":3,"function":3,"fusion":1,"g":0,"get":3,"gpio":1,"gpio0":3,"gpio1":3,"gpio4":3,"gpio5":3,"gpio6":3,"gpio7":3,"grain":0,"group":3,"har":1,"hardwar":1,"harn":4,"hexadecim":3,"hold":3,"how":1,"i":[0,3],"ideal":0,"idf_robot_schemat":[],"illustr":3,"imag":3,"indic":0,"individu":0,"input":0,"insid":4,"instal":4,"int":[0,3],"intend":0,"interpret":0,"introduct":1,"joystick":[0,3],"lastli":3,"latenc":0,"layout":0,"led":0,"ledc_channel_0":3,"ledc_channel_1":3,"ledc_channel_2":3,"ledc_channel_3":3,"left":3,"length":3,"like":0,"low":0,"mac":3,"mac_addr":3,"mai":0,"make":0,"maneuv":0,"master":0,"maxim":0,"mean":3,"measur":3,"memori":[0,3],"messag":3,"microcontrol":[0,3],"minim":0,"motor":[0,1,3],"motor1_rpm_pcm":[],"motor1_rpm_pwm":[0,3],"motor2_rpm_pcm":[],"motor2_rpm_pwm":[0,3],"motor3_rpm_pcm":[],"motor3_rpm_pwm":[0,3],"motor4_rpm_pcm":[],"motor4_rpm_pwm":[0,3],"motors_rpm":3,"move":3,"movement":3,"multi":0,"nav_bttn":[0,3],"note":3,"now":[0,3],"number":3,"off":0,"ok":3,"omni":0,"onboard":0,"ondatareceiv":3,"ondatas":3,"onli":[3,4],"oper":[0,3],"oscilloscop":3,"other":3,"over":0,"pack":1,"packet":3,"pad":0,"pair":[0,3],"particular":3,"payload":0,"period":3,"pin":1,"platform":0,"png":[],"pointer":3,"porttick_period_m":3,"posit":[0,3],"possibl":3,"power":3,"predict":0,"progress":1,"protocol":0,"provid":[0,3],"purpos":3,"push":[0,3],"pwm":[0,3],"rc":3,"rc_send_data_task":3,"receiv":[0,1,3],"receiver_mac":3,"record":[],"regist":3,"relev":0,"remot":0,"repres":0,"requir":3,"reserv":1,"resp":3,"respons":3,"restructuredtext":[],"result":3,"right":3,"robot":0,"rotat":3,"row":[],"run":3,"same":[],"schemat":1,"second":3,"secur":4,"see":[],"send":[0,3],"senddata":3,"sensor":0,"sensors_data_t":[0,3],"sent":[0,3],"serial":0,"side":3,"sidewai":3,"signal":0,"similarli":3,"sizeof":3,"softwar":1,"speed":0,"state":0,"static":3,"statu":[0,3],"store":3,"struct":[1,3],"suffici":3,"summar":3,"summari":3,"support":0,"syntax":[],"system":0,"tabl":3,"tag":3,"task":3,"telemetri":0,"tell":0,"thi":[0,3],"those":3,"through":1,"toggl":0,"transmiss":0,"transmit":[0,3],"transmitt":[0,1],"true":3,"turn":3,"two":3,"typedef":0,"uart":0,"uint8_t":[0,3],"updat":3,"us":1,"valu":3,"variou":3,"vehicl":0,"void":3,"voltag":3,"vtaskdelai":3,"wa":3,"walk":1,"walkthrough":1,"warn":0,"well":[],"wheel":0,"when":3,"while":3,"why":1,"wire":[1,3],"work":1,"wroom":3,"x":0,"x_axi":[0,3],"y":0,"y_axi":[0,3],"you":0,"your":[]},"titles":["DATA STRUCT","ByteRider documentation","INTRODUCTION","HOW DOES IT WORK?","WORK-IN-PROGRESS WALK THROUGH","RECEIVER","TRANSMITTER"],"titleterms":{"IN":4,"IT":3,"__attribut":0,"axi":3,"byterid":1,"chassi":4,"data":[0,6],"direct":3,"document":1,"doe":3,"encapsul":6,"finish":4,"fusion":3,"gpio":3,"har":4,"hardwar":3,"how":3,"introduct":2,"motor":4,"pack":0,"pin":3,"progress":4,"receiv":5,"reserv":3,"schemat":3,"softwar":3,"speed":3,"struct":0,"through":4,"transmitt":6,"us":0,"walk":4,"walkthrough":0,"why":0,"wire":4,"work":[3,4],"x":3,"y":3}}) \ No newline at end of file +Search.setIndex({"alltitles":{"ByteRider documentation":[[1,null]],"Chassis":[[4,"chassis"]],"DATA STRUCT":[[0,null]],"Data Encapsulation":[[6,"data-encapsulation"]],"Direction and Speed":[[3,"direction-and-speed"]],"Finished Work":[[4,"finished-work"]],"Fusion of Software with Hardware":[[3,"fusion-of-software-with-hardware"]],"HOW DOES IT WORK?":[[3,null]],"INTRODUCTION":[[2,null]],"Motor Wires Harness":[[4,"motor-wires-harness"]],"RECEIVER":[[5,null]],"Reserved Pins & GPIOs":[[3,"reserved-pins-gpios"]],"Schematic":[[3,"schematic"]],"Struct Walkthrough":[[0,"struct-walkthrough"]],"TRANSMITTER":[[6,null]],"WORK-IN-PROGRESS WALK THROUGH":[[4,null]],"Why Use __attribute((packed))?":[[0,"why-use-attribute-packed"]],"Wiring":[[4,"wiring"]],"x- and y- axis":[[3,"x-and-y-axis"]]},"docnames":["data","index","intro","overview","progress","receiver","transmitter"],"envversion":{"sphinx":65,"sphinx.domains.c":3,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":9,"sphinx.domains.index":1,"sphinx.domains.javascript":3,"sphinx.domains.math":2,"sphinx.domains.python":4,"sphinx.domains.rst":2,"sphinx.domains.std":2},"filenames":["data.rst","index.rst","intro.rst","overview.rst","progress.rst","receiver.rst","transmitter.rst"],"indexentries":{},"objects":{},"objnames":{},"objtypes":{},"terms":{"":0,"0":3,"04x":3,"0x":3,"1":3,"100":3,"15":3,"16":3,"2":3,"3":3,"4":[0,3],"47":3,"48":3,"5":3,"50":[],"6":3,"7":3,"8":3,"90":3,"91":3,"95":[],"A":3,"IN":1,"IT":1,"If":3,"In":[0,3],"It":0,"NOT":3,"ON":0,"The":[0,3],"__attribut":1,"__attribute__":0,"__gpio6__":[],"_static":[],"across":0,"adapt":3,"adc1_ch0":3,"adc1_ch1":3,"add":0,"addit":0,"address":3,"all":0,"alloc":3,"allow":0,"an":0,"analog":0,"ani":[0,3],"ar":3,"arg":3,"assign":3,"attribut":0,"axi":[],"back":3,"bacl":3,"bandwidth":0,"base":3,"batteri":0,"being":3,"below":[],"between":0,"bitbyterid":3,"board":3,"bool":0,"breadboard":3,"brief":3,"buf":3,"buffer":3,"button":[0,3],"byte":0,"c3":3,"call":3,"can":3,"captur":0,"car":3,"chang":3,"channel":3,"chassi":1,"clockwis":3,"code":3,"column":[],"command":0,"commun":0,"compact":0,"compat":0,"compil":0,"complet":4,"configur":0,"consequ":3,"constraint":3,"contain":0,"content":[],"contin":3,"control":[0,3,4],"correspond":3,"counter":3,"crc":3,"cycl":3,"data":[1,3],"data_len":3,"dc":[0,3,4],"declar":3,"decod":0,"dedic":3,"defin":3,"deletep":3,"design":0,"detail":[],"determin":[0,3],"devboard":3,"develop":3,"developmemt":3,"devic":0,"diagon":3,"differenti":0,"direct":0,"displai":3,"doe":1,"drive":0,"duti":3,"e":[0,3],"each":3,"els":3,"embed":0,"enabl":0,"encapsul":[0,1],"encod":0,"end":0,"ensur":0,"error":3,"esp":[0,3],"esp32":3,"esp_log":3,"esp_logi":3,"esp_logw":3,"esp_now_is_peer_exist":3,"esp_now_send":3,"esp_now_send_status_t":3,"etc":0,"even":0,"event":3,"everi":3,"evok":3,"exact":0,"exist":[],"expect":0,"field":0,"final":0,"fine":0,"finish":1,"follow":3,"four":[0,3],"from":0,"front":3,"function":3,"fusion":1,"g":0,"get":3,"gpio":1,"gpio0":3,"gpio1":3,"gpio4":3,"gpio5":3,"gpio6":3,"gpio7":3,"grain":0,"group":3,"har":1,"hardwar":[0,1],"harn":4,"hexadecim":3,"hold":3,"how":1,"i":[0,3],"ideal":0,"idf_robot_schemat":[],"illustr":3,"imag":3,"indic":0,"individu":0,"input":0,"insid":4,"instal":4,"int":[0,3],"intend":0,"interpret":0,"interv":0,"introduct":1,"joystick":[0,3],"lastli":3,"latenc":0,"layout":0,"led":0,"ledc_channel_0":3,"ledc_channel_1":3,"ledc_channel_2":3,"ledc_channel_3":3,"left":3,"length":3,"like":0,"low":0,"mac":3,"mac_addr":3,"mai":0,"make":0,"maneuv":0,"master":0,"maxim":0,"mean":3,"measur":3,"memori":[0,3],"messag":3,"microcontrol":[0,3],"minim":0,"motor":[0,1,3],"motor1_rpm_pcm":[],"motor1_rpm_pwm":[0,3],"motor2_rpm_pcm":[],"motor2_rpm_pwm":[0,3],"motor3_rpm_pcm":[],"motor3_rpm_pwm":[0,3],"motor4_rpm_pcm":[],"motor4_rpm_pwm":[0,3],"motors_rpm":3,"move":3,"movement":3,"multi":0,"nav_bttn":[0,3],"note":3,"now":[0,3],"number":3,"off":0,"ok":3,"omni":0,"onboard":0,"ondatareceiv":3,"ondatas":3,"onli":[3,4],"oper":[0,3],"oscilloscop":3,"other":3,"over":0,"pack":1,"packet":3,"pad":0,"pair":[0,3],"particular":3,"payload":0,"period":3,"pin":1,"platform":0,"png":[],"pointer":3,"porttick_period_m":3,"posit":[0,3],"possibl":3,"power":3,"predict":0,"progress":1,"protocol":0,"provid":[0,3],"purpos":3,"push":[0,3],"pwm":[0,3],"rc":3,"rc_send_data_task":3,"receiv":[0,1,3],"receiver_mac":3,"record":[],"regist":3,"regular":0,"relev":0,"remot":0,"repres":0,"requir":3,"reserv":1,"resp":3,"respons":[0,3],"restructuredtext":[],"result":3,"right":3,"robot":0,"rotat":3,"row":[],"run":3,"same":[],"schemat":1,"second":3,"secur":4,"see":[],"send":[0,3],"senddata":3,"sensor":0,"sensors_data_t":[0,3],"sent":[0,3],"serial":0,"side":3,"sidewai":3,"signal":0,"similarli":3,"sizeof":3,"softwar":1,"speed":0,"state":0,"static":3,"statu":[0,3],"store":3,"stream":0,"struct":[1,3],"suffici":3,"summar":3,"summari":3,"support":0,"syntax":[],"system":0,"tabl":3,"tag":3,"task":3,"telemetri":0,"tell":0,"thi":[0,3],"those":3,"through":1,"toggl":0,"transmiss":0,"transmit":[0,3],"transmitt":[0,1],"true":3,"turn":3,"two":3,"typedef":0,"uart":0,"uint8_t":[0,3],"updat":3,"us":1,"user":0,"valu":3,"variou":3,"vehicl":0,"void":3,"voltag":3,"vtaskdelai":3,"wa":3,"walk":1,"walkthrough":1,"warn":0,"well":[],"wheel":0,"when":[0,3],"while":3,"why":1,"wire":[1,3],"work":1,"wroom":3,"x":0,"x_axi":[0,3],"y":0,"y_axi":[0,3],"you":0,"your":[]},"titles":["DATA STRUCT","ByteRider documentation","INTRODUCTION","HOW DOES IT WORK?","WORK-IN-PROGRESS WALK THROUGH","RECEIVER","TRANSMITTER"],"titleterms":{"IN":4,"IT":3,"__attribut":0,"axi":3,"byterid":1,"chassi":4,"data":[0,6],"direct":3,"document":1,"doe":3,"encapsul":6,"finish":4,"fusion":3,"gpio":3,"har":4,"hardwar":3,"how":3,"introduct":2,"motor":4,"pack":0,"pin":3,"progress":4,"receiv":5,"reserv":3,"schemat":3,"softwar":3,"speed":3,"struct":0,"through":4,"transmitt":6,"us":0,"walk":4,"walkthrough":0,"why":0,"wire":4,"work":[3,4],"x":3,"y":3}}) \ No newline at end of file diff --git a/ESP-IDF_Robot/tutorial/docs/build/simplepdf/.buildinfo b/ESP-IDF_Robot/tutorial/docs/build/simplepdf/.buildinfo index a04b96a53..2596a212e 100644 --- a/ESP-IDF_Robot/tutorial/docs/build/simplepdf/.buildinfo +++ b/ESP-IDF_Robot/tutorial/docs/build/simplepdf/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file records the configuration used when building these files. When it is not found, a full rebuild will be done. -config: b38705e9208fae3c4e0e02be9136bc77 +config: 68e99aaebec40afde1c4d6ea4d6cf9f8 tags: 62a1e7829a13fc7881b6498c52484ec0 diff --git a/ESP-IDF_Robot/tutorial/docs/build/simplepdf/index.html b/ESP-IDF_Robot/tutorial/docs/build/simplepdf/index.html index a7009be61..be4435694 100644 --- a/ESP-IDF_Robot/tutorial/docs/build/simplepdf/index.html +++ b/ESP-IDF_Robot/tutorial/docs/build/simplepdf/index.html @@ -640,6 +640,21 @@ It’s intended to be sent from a transmitting device (like a remote control +

+ When used with communication protocols like ESP-NOW, this struct is + + encoded + + into a byte stream, then + + transmitted + + at regular intervals or in response to user input, and finally + + decoded + + on the receiving end to control hardware. +

Struct Walkthrough diff --git a/ESP-IDF_Robot/tutorial/docs/source/data.rst b/ESP-IDF_Robot/tutorial/docs/source/data.rst index e62d910e2..0529a068f 100644 --- a/ESP-IDF_Robot/tutorial/docs/source/data.rst +++ b/ESP-IDF_Robot/tutorial/docs/source/data.rst @@ -20,6 +20,10 @@ It's intended to be sent from a transmitting device (like a remote control or ma uint8_t motor4_rpm_pwm; } __attribute__((packed)) sensors_data_t; +When used with communication protocols like ESP-NOW, this struct is **encoded** into a byte stream, then +**transmitted** at regular intervals or in response to user input, and finally +**decoded** on the receiving end to control hardware. + Struct Walkthrough ^^^^^^^^^^^^^^^^^^