Forum bépo

Forum des utilisateurs du bépo

Vous n'êtes pas identifié(e).

Annonce

⚠️⚠️⚠️ Ce forum va bientôt migrer vers Flarum, pour éviter de rester sur du vieux PHP non maintenu trop longtemps. Si vous avez une objection, vous pouvez venir m’en faire part sur ce topic. — Sardem FF7 ⚠️⚠️⚠️

#226 1/2/2015 13:14:20

c4software
Membres
Inscription : 20/1/2013
Messages : 63
Site Web

Re : [sujet technique] Adapter le bépo à l’ergodox

@yeKcim Pas mal dutout! Je trouve la touche ALTGR pas assez accessible à mon gout, mais il y a vraiment des bonnes idées.

Hors ligne

#227 12/2/2015 10:23:11

jonneve
Membres
Inscription : 12/2/2015
Messages : 11

Re : [sujet technique] Adapter le bépo à l’ergodox

yeKcim a écrit :

Voici la réponse universelle 42 :

Bonjour,

Bravo pour l'effort que vous mettez à essayer de trouver l'adaption parfaite du bépo pour l'ergodox. Je trouve le matériel génial, et j'aurais bien envie de me lancer.

Quelques remarques par rapport à ta disposition, qui, dans l'ensemble, me plaît beaucoup :

— le ALT-GR + SHIFT + ESPACE me semble quasiment inaccessible. J'imagine que je suis l'un des seuls à m'en servir (je suis traducteur, donc tenu de respecter la typographie française), mais pour moi, c'est une fonctionnalité importante du bépo qu'il ne faudrait pas détruire.

— la touche miroir, c'est quoi?

— la touche SHIFT avec le pouce, c'est ABSOLUMENT GÉNIAL!

— à quoi servent les touches étoile, le petit carré au-dessus du TAB, et le gros rectangle en dessous du Ç?

— CTRL-ENTRÉE, c'est pas trop dur? La touche CTRL me paraît limite mal placée. Personnellement, ça me plaît beaucoup de l'avoir en bas à gauche, car je l'enfonce facilement avec la main plutôt que le petit doigt, ce qui m'évite des contorsions.

— CTRL-SHIFT-TAB nécessite 2 mains, alors que c'est une combinaison très utile lorsqu'on a une main sur la souris.

Jonathan

Hors ligne

#228 12/2/2015 10:36:26

yeKcim
Membres
Inscription : 8/4/2014
Messages : 114
Site Web

Re : [sujet technique] Adapter le bépo à l’ergodox

jonneve a écrit :

le ALT-GR + SHIFT + ESPACE me semble quasiment inaccessible. J'imagine que je suis l'un des seuls à m'en servir (je suis traducteur, donc tenu de respecter la typographie française), mais pour moi, c'est une fonctionnalité importante du bépo qu'il ne faudrait pas détruire.

altgr en index droit, shift en pouce droit et espace en pouce gauche, ça se fait bien honnetement

jonneve a écrit :

la touche miroir, c'est quoi?

miroir + espace = entrée
miroir + X = G

les touches de la partie droite vont à gauche et inversement, ça peut éventuellement être pratique quand on à la main sur la souris. Mais finalement son accessibilité limitée limite son utilité

jonneve a écrit :

la touche SHIFT avec le pouce, c'est ABSOLUMENT GÉNIAL!

En effet

jonneve a écrit :

à quoi servent les touches étoile, le petit carré au-dessus du TAB, et le gros rectangle en dessous du Ç?

Étoile = Super Key = Touche windows
Au dessus de tab c’est backspace
Sous Ç c’est une touche compose (en fait touche windows droite, il faut ensuite configurer l’OS pour que celle-ci corresponde à la touche compose…) c’est très pratique !

jonneve a écrit :

CTRL-ENTRÉE, c'est pas trop dur? La touche CTRL me paraît limite mal placée. Personnellement, ça me plaît beaucoup de l'avoir en bas à gauche, car je l'enfonce facilement avec la main plutôt que le petit doigt, ce qui m'évite des contorsions.

J’ai toujours préféré ctrl dans le coin mais sur l’ergodox c’est cette place qui est la plus accessible. Impossible de me faire déplacer ce ctrl, vraiment, quand on a le clavier en main on ne peut pas faire autrement. La touche en dessous étant moins large elle est beaucoup moins accessible

jonneve a écrit :

CTRL-SHIFT-TAB nécessite 2 mains, alors que c'est une combinaison très utile lorsqu'on a une main sur la souris.

ctrl petit doigt, shift pouce et tab annulaire, ça doit pouvoir se faire mais il est vrai que ce n’est pas idéal

Merci pour toutes les remarques, cela permet d’envisager une version 43 :-)


yeknan.free.fr: Participer à un projet libre est un jeu... Et toi, à quoi tu joues ?

Hors ligne

#229 12/2/2015 15:49:18

jonneve
Membres
Inscription : 12/2/2015
Messages : 11

Re : [sujet technique] Adapter le bépo à l’ergodox

Je n'ai pas (encore!) d'ErgoDox, donc j'ai du mal à savoir ce qu'il en est réellement de l'accessibilité ou non de certaines touches. Par exemple, les touches W et Ç sont-elles facilement réalisables avec le pouce? Car personnellement, je trouve ça tendu de le faire avec l'index, ou alors il faut déplacer totalement la main, mais si on veut taper vite et limiter les fautes de frappe, mieux vaut éviter d'avoir à faire ça. Du coup, je me demande aussi si on ne devrait pas mettre dans ces positions des touches moins vitales, telles que la touche windows, la touche mirroir ou la touche compose (dont je ne comprends pas vraiment l'intérêt, vu le nombre de touches mortes qu'on a en bépo).

A ce propos, qu'en est-il de l'accessibilité des touches du pouce? Les deux grosses, j'imagine que c'est pas mal, mais les petites, on y arrive facilement sans trop se tromper? Car si c'est le cas, pourquoi pas utiliser ces emplacements pour des lettres, de sorte à vraiment se servir pleinement du pouce. Le W et le Ç peut-être? Mais je dis peut-être des bêtises, car j'ai du mal à savoir si c'est plus commode dans leur emplacement actuel (avec l'index je suppose), ou avec le pouce.

Les touches compose et suppr, c'est plutôt l'index ou le pouce?

Pour le CTRL, c'est vrai que ça doit pouvoir le faire puisque ça déborde. Les touches copier/coller fonctionnent? Rien que ça, c'est pas mal : je me suis habitué au CTRL-C / CTRL-V en bépo, mais faut avouer que c'est pas très pratique, surtout qu'on peut pas le faire avec la souris à la main droite.

Hors ligne

#230 12/2/2015 15:58:18

yeKcim
Membres
Inscription : 8/4/2014
Messages : 114
Site Web

Re : [sujet technique] Adapter le bépo à l’ergodox

l’index pour les touches w,ç, suppr et compose

les touches de pouces longues sont très accessibles, la petite (~L1 dans la disposition 42) est accessible, les autres sont difficiles d’accès.

les copier, couper, coller sont fonctionnels oui.


yeknan.free.fr: Participer à un projet libre est un jeu... Et toi, à quoi tu joues ?

Hors ligne

#231 20/2/2015 01:16:47

yeKcim
Membres
Inscription : 8/4/2014
Messages : 114
Site Web

Re : [sujet technique] Adapter le bépo à l’ergodox

Voici 43, légère retouche de 42, je n’arrive pas à me faire à la position de tab, dans les versions précédentes, backspace et suppr étaient l’une au-dessus de l’autre c’est assez logique et agréable, entrée à gauche me manque mais je ne veux pas me passer d’espace non plus… Je laisse dans le code un layer miroir mais je n’ai plus de touche pour y accéder, finalement je trouve cette touche assez inutile :

43.svg

Le code correspondant :

/*
Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdint.h>
#include <stdbool.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "keycode.h"
#include "action.h"
#include "action_util.h"
#include "action_code.h"
#include "action_macro.h"
#include "action_layer.h"
#include "bootloader.h"
#include "report.h"
#include "host.h"
#include "print.h"
#include "debug.h"
#include "keymap.h"
#include "ergodox.h"


/* ErgoDox keymap definition macro */
#define KEYMAP(                                                 \
                                                                \
    /* left hand, spatial positions */                          \
    k00,k01,k02,k03,k04,k05,k06,                                \
    k10,k11,k12,k13,k14,k15,k16,                                \
    k20,k21,k22,k23,k24,k25,                                    \
    k30,k31,k32,k33,k34,k35,k36,                                \
    k40,k41,k42,k43,k44,                                        \
                            k55,k56,                            \
                                k54,                            \
                        k53,k52,k51,                            \
                                                                \
    /* right hand, spatial positions */                         \
        k07,k08,k09,k0A,k0B,k0C,k0D,                            \
        k17,k18,k19,k1A,k1B,k1C,k1D,                            \
            k28,k29,k2A,k2B,k2C,k2D,                            \
        k37,k38,k39,k3A,k3B,k3C,k3D,                            \
                k49,k4A,k4B,k4C,k4D,                            \
    k57,k58,                                                    \
    k59,                                                        \
    k5C,k5B,k5A )                                               \
                                                                \
   /* matrix positions */                                       \
   {                                                            \
    { KC_##k00,KC_##k10,KC_##k20,KC_##k30,KC_##k40,KC_NO   },   \
    { KC_##k01,KC_##k11,KC_##k21,KC_##k31,KC_##k41,KC_##k51},   \
    { KC_##k02,KC_##k12,KC_##k22,KC_##k32,KC_##k42,KC_##k52},   \
    { KC_##k03,KC_##k13,KC_##k23,KC_##k33,KC_##k43,KC_##k53},   \
    { KC_##k04,KC_##k14,KC_##k24,KC_##k34,KC_##k44,KC_##k54},   \
    { KC_##k05,KC_##k15,KC_##k25,KC_##k35,KC_NO,   KC_##k55},   \
    { KC_##k06,KC_##k16,KC_NO,   KC_##k36,KC_NO,   KC_##k56},   \
                                                                \
    { KC_##k07,KC_##k17,KC_NO,   KC_##k37,KC_NO,   KC_##k57},   \
    { KC_##k08,KC_##k18,KC_##k28,KC_##k38,KC_NO,   KC_##k58},   \
    { KC_##k09,KC_##k19,KC_##k29,KC_##k39,KC_##k49,KC_##k59},   \
    { KC_##k0A,KC_##k1A,KC_##k2A,KC_##k3A,KC_##k4A,KC_##k5A},   \
    { KC_##k0B,KC_##k1B,KC_##k2B,KC_##k3B,KC_##k4B,KC_##k5B},   \
    { KC_##k0C,KC_##k1C,KC_##k2C,KC_##k3C,KC_##k4C,KC_##k5C},   \
    { KC_##k0D,KC_##k1D,KC_##k2D,KC_##k3D,KC_##k4D,KC_NO   }    \
   }

#if defined(KEYMAP_DVORAK)
#include "keymap_dvorak.h"
#elif defined(KEYMAP_COLEMAK)
#include "keymap_colemak.h"
#elif defined(KEYMAP_WORKMAN)
#include "keymap_workman.h"
#elif defined(KEYMAP_MICRO)
#include "keymap_micro.h"
#elif defined(KEYMAP_CUB)
#include "keymap_cub.h"
#else

static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    KEYMAP(  // layer 0 : default
        // left hand
        ESC, 1,   2,   3,   4,   5,   GRV,
        TAB,Q,   W,   E,   R,   T,   BSPC,
        ENT ,A,   S,   D,   F,   G,
        LCTL,Z,   X,   C,   V,   B,   DEL,
        HOME,PGUP,PGDN,END, LALT,
                                      RGUI, LGUI,
                                           FN17,
                                 SPC, LSFT, FN1,
						        // right hand
							   EQL, 6,   7,   8,   9,   0,   MINS,
							   RBRC,Y,   U,   I,   O,   P,   LBRC,
							        H,   J,   K,   L,   SCLN,QUOT,
							   BSLS,N,   M,   COMM,DOT, SLSH,RCTL,
	 							    RALT,LEFT,UP,  DOWN,RGHT,
						        LGUI,FN2,
						        APP ,
						        FN1 ,RSFT, SPC
    ),

    KEYMAP(  // layer 1 : function, numpad
        // left hand
        PWR, F1,  F2,  F3,  F4,  F5,  F6,
        SLEP,PGUP,HOME,UP,  END, FN11,INS,
        WAKE,PGDN,LEFT,DOWN,RGHT,FN8 ,
        TRNS,FN7,FN12,FN6, FN13,FN9 ,TRNS,  
        MYCM,VOLD,VOLU,MUTE,TRNS,
                                      TRNS,TRNS,
                                           TRNS,
                                 TRNS,TRNS,TRNS,
						        // right hand
							   F7,  F8,  F9,  F10, F11, F12, PSCR,
							   CAPS,Y   ,P7,  P8,  P9,  FN15,SLCK,
							        FN16,P4,  P5,  P6,  G   ,PAUS,
							   TRNS,P0  ,P1,  P2,  P3,  PDOT,TRNS,
								    MSEL,MPLY,MPRV,MNXT,MSTP,
						        TRNS,TRNS,
						        TRNS,
						        TRNS,TRNS,TRNS  
    ),

    KEYMAP(  // layer 2 : numpad
        // left hand
        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
        TRNS,TRNS,TRNS,TRNS,TRNS,
                                      TRNS,TRNS,
                                           TRNS,
                                 TRNS,TRNS,FN1,
						        // right hand
							   TRNS,NLCK,PPLS,PMNS,PSLS,PAST,PEQL,  
							   TRNS,Y   ,P7,  P8,  P9,  FN15,TRNS,  
							        FN16,P4,  P5,  P6,  G   ,TRNS,  
							   TRNS,P0  ,P1,  P2,  P3,  PDOT,TRNS,
								    TRNS,TRNS,TRNS,TRNS,TRNS,  
						        TRNS,FN4,
						        TRNS,
						        FN1,TRNS,PENT   
    ),
    
 
    KEYMAP(  // layer 3: mirror
            // left hand
        MINS,0,   9,   8,   7,   6,   EQL,
        LBRC,P,   O,   I,   U,   Y,   BSLS,
        QUOT,SCLN,L,   K,   J,   H,
        RCTL,SLSH,DOT, COMM,M,   N,   RGUI,
        RGHT,DOWN,UP,  LEFT,RALT,
                                      TRNS,LGUI,
                                           TRNS,
                                 ENT, RSFT,NO,
						        // right hand
							   GRV, 5,   4,   3,   2,   1,   ESC,
							   RBRC,T,   R,   E,   W,   Q,   BSPC,
							        G,   F,   D,   S,   A,   TAB, 
							   DEL, B,   V,   C,   X,   Z,   LCTL,
								    TAB, END, PGDN,PGUP,HOME, 
						        LGUI,FN2,
						        TRNS,
						        NO  ,LSFT,SPC
    ),

};

/* id for user defined functions */
enum function_id {
    TEENSY_KEY,
};

/*
 * Fn action definition
 */
static const uint16_t PROGMEM fn_actions[] = {
    ACTION_FUNCTION(TEENSY_KEY),                    // FN0 - Teensy key
    ACTION_LAYER_MOMENTARY(1),                      // FN1 - switch to Layer1
    ACTION_LAYER_SET(2, ON_PRESS),                  // FN2 - set Layer2
    ACTION_LAYER_MOMENTARY(3),                      // FN3 - toggle Layer3 aka Mirror
    ACTION_LAYER_SET(0, ON_PRESS),                  // FN4 - set Layer0
    
    ACTION_MODS_KEY(MOD_LCTL, KC_A),             // FN5 - Ctrl A
    ACTION_MODS_KEY(MOD_LCTL, KC_H),             // FN6 - Ctrl C
    ACTION_MODS_KEY(MOD_LCTL, KC_SLSH),          // FN7 - Ctrl F
    ACTION_MODS_KEY(MOD_LCTL, KC_LBRC),          // FN8 - Ctrl Z (undo)
    ACTION_MODS_KEY(MOD_LCTL, KC_X),             // FN9 - Ctrl Y (redo)
    ACTION_MODS_KEY(MOD_LCTL, KC_E),             // FN10 - Ctrl P
    ACTION_MODS_KEY(MOD_LCTL, KC_K),             // FN11 - Ctrl S
    ACTION_MODS_KEY(MOD_LCTL, KC_C),             // FN12 - Ctrl X
    ACTION_MODS_KEY(MOD_LCTL, KC_U),             // FN13 - Ctrl V    
    ACTION_MODS_KEY(MOD_LGUI, KC_I),             // FN14 - Win D
    ACTION_MODS_KEY(MOD_LSFT, KC_V),             // FN15 - shift+v → bépo → numpad :
    ACTION_MODS_KEY(MOD_RALT, KC_U),             // FN16 - altgr+u → bépo → numpad ˇ   
    ACTION_MODS(MOD_LCTL | MOD_LALT)             // FN17 - Ctrl + Alt 
};

void action_function(keyrecord_t *event, uint8_t id, uint8_t opt)
{
    if (id == TEENSY_KEY) {
        clear_keyboard();
        print("\n\nJump to bootloader... ");
        _delay_ms(250);
        bootloader_jump(); // should not return
        print("not supported.\n");
    }
}

#endif


#define KEYMAPS_SIZE    (sizeof(keymaps) / sizeof(keymaps[0]))
#define FN_ACTIONS_SIZE (sizeof(fn_actions) / sizeof(fn_actions[0]))

/* translates key to keycode */
uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key)
{
    if (layer < KEYMAPS_SIZE) {
        return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]);
    } else {
        // fall back to layer 0
        return pgm_read_byte(&keymaps[0][(key.row)][(key.col)]);
    }
}

#if defined(KEYMAP_CUB)

// function keymap_fn_to_action will be defined in keymap_cub.h

#else
/* translates Fn keycode to action */
action_t keymap_fn_to_action(uint8_t keycode)
{
    action_t action;
    if (FN_INDEX(keycode) < FN_ACTIONS_SIZE) {
        action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]);
    } else {
        action.code = ACTION_NO;
    }
    return action;
}
#endif

yeknan.free.fr: Participer à un projet libre est un jeu... Et toi, à quoi tu joues ?

Hors ligne

#232 22/2/2015 00:37:26

jonneve
Membres
Inscription : 12/2/2015
Messages : 11

Re : [sujet technique] Adapter le bépo à l’ergodox

J'ai reçu mon ErgoDox (via FalbaTech, assemblé et tout)!

Par contre, comment on fait pour charger une disposition sur le clavier?

Hors ligne

#233 22/2/2015 01:04:49

fauge
Membres
Lieu : Paris
Inscription : 26/10/2014
Messages : 57

Re : [sujet technique] Adapter le bépo à l’ergodox

Il faut utiliser l'application Teensy loader: https://www.pjrc.com/teensy/loader.html
Et connaitre la combinaison de touche sur le clavier pour le passer en mode programmation.

Si tu ne connais pas la combinaison, alors il faut démonter suffisamment le clavier pour avoir accès au Teensy et appuyer sur son bouton physique.

Hors ligne

#234 22/2/2015 12:14:32

jonneve
Membres
Inscription : 12/2/2015
Messages : 11

Re : [sujet technique] Adapter le bépo à l’ergodox

La combinaison de touches dépend de quoi? Il y en a une par défaut? J'ai posé la question chez FalbaTech, mais en attendant la réponse...

Hors ligne

#235 22/2/2015 12:44:18

fauge
Membres
Lieu : Paris
Inscription : 26/10/2014
Messages : 57

Re : [sujet technique] Adapter le bépo à l’ergodox

Elle dépend de la configuration initiale du clavier.
Perso je n'en avais aucune idée alors j'ai dû accéder au Teensy pour ma première programmation.

Hors ligne

#236 25/2/2015 12:04:31

jonneve
Membres
Inscription : 12/2/2015
Messages : 11

Re : [sujet technique] Adapter le bépo à l’ergodox

Ça y est, j'écris en utilisant mon ErgoDox, avec ta disposition,  yeKcim!!!!

Pas franchement évident au début, mais je vais m'y faire… Je trouve la position du backspace pas terrible par contre, vu que c'est une touche dont on se sert assez souvent, surtout quand on vient de se mettre à l'ErgoDox.

Au fait, pourquoi utilise-t-on le firmware tmk_keyboard plutôt que le firmnware officiel (github.com/benblazak/ergodox-firmware)?

En tout cas, je vais expérimenter un peu et sans doute apporter des modifications en fonction du ressenti.

Hors ligne

#237 25/2/2015 12:10:13

jonneve
Membres
Inscription : 12/2/2015
Messages : 11

Re : [sujet technique] Adapter le bépo à l’ergodox

Au fait, quelle est la touche à utiliser pour passer le Teensy en mode programmation?

Hors ligne

#238 27/2/2015 18:21:56

jonneve
Membres
Inscription : 12/2/2015
Messages : 11

Re : [sujet technique] Adapter le bépo à l’ergodox

Bonjour,

J'ai fait quelques adaptations au layout, mais j'ai un petit problème : je voulais placer une touche Fn (pour accéder à un autre niveau) à côté du ALT, mais quand je relâche la touche Fn, le layer correspondant reste actif, alors que le même Fn pour le même layer fonctionne correctement dans le pavé des pouces… Quelqu'un sait contourner ce pb?

Merci,
Jonathan

Hors ligne

#239 2/3/2015 15:03:55

jonneve
Membres
Inscription : 12/2/2015
Messages : 11

Re : [sujet technique] Adapter le bépo à l’ergodox

Bonjour,

Pour info, j'ai trouvé la solution pour la touche Fn qui restait enfoncée : ce phénomène se produit dès lors qu'on place une touche Fn sur un emplacement ayant un autre sens sur la couche Fn. Autrement dit, pour le faire fonctionner correctement, il suffit de s'assurer que la touche servant de Fn n'est pas utilisée sur le layer auquel la touche Fn donne accès (il faut que la touche soit transparente).

Une fois ce principe saisi, j'ai pu déplacer mes touches Fn pour leur donner des positions beaucoup plus accessibles, ce qui est à mon sens très important vu qu'elles servent à donner accès aux touches
F1, F2, etc., ainsi qu'à de nombreux raccorcis très utiles. J'ai aussi déplacé les touches SHIFT et CTRL et Entrée pour limiter les difficultés de migration depuis un clavier ordinaire (je suis développeur et traducteur, et je me sers donc beaucoup des touches de fonction ainsi que de raccouris du genre CTRL-F9 ou CTRL-SHIFT-F11, etc., et je ne vois pas l'utilité de déplacer toutes ces touches). J'ai déplacé le W et le Ç car je trouve l'accès par l'index étiré trop tendu (je les ai mis à gauche du A et sous le M respectivement). Enfin, j'ai revu le pavé numérique pour qu'il soit le plus identique possible au pavé numérique standard, et j'ai rajouté une touche Fn pour y avoir un accès facile et rapide en changement de layer temporaire. J'ai enlevé certaines touches qui ne me servent pas et qui me gênaient, mais il serait facile de les réintroduire en les positionnant autrement. 

Voici mon code :

/*
Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdint.h>
#include <stdbool.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "keycode.h"
#include "action.h"
#include "action_util.h"
#include "action_code.h"
#include "action_macro.h"
#include "action_layer.h"
#include "bootloader.h"
#include "report.h"
#include "host.h"
#include "print.h"
#include "debug.h"
#include "keymap.h"
#include "ergodox.h"


/* ErgoDox keymap definition macro */
#define KEYMAP(                                                 \
                                                                \
    /* left hand, spatial positions */                          \
    k00,k01,k02,k03,k04,k05,k06,                                \
    k10,k11,k12,k13,k14,k15,k16,                                \
    k20,k21,k22,k23,k24,k25,                                    \
    k30,k31,k32,k33,k34,k35,k36,                                \
    k40,k41,k42,k43,k44,                                        \
                            k55,k56,                            \
                                k54,                            \
                        k53,k52,k51,                            \
                                                                \
    /* right hand, spatial positions */                         \
        k07,k08,k09,k0A,k0B,k0C,k0D,                            \
        k17,k18,k19,k1A,k1B,k1C,k1D,                            \
            k28,k29,k2A,k2B,k2C,k2D,                            \
        k37,k38,k39,k3A,k3B,k3C,k3D,                            \
                k49,k4A,k4B,k4C,k4D,                            \
    k57,k58,                                                    \
    k59,                                                        \
    k5C,k5B,k5A )                                               \
                                                                \
   /* matrix positions */                                       \
   {                                                            \
    { KC_##k00,KC_##k10,KC_##k20,KC_##k30,KC_##k40,KC_NO   },   \
    { KC_##k01,KC_##k11,KC_##k21,KC_##k31,KC_##k41,KC_##k51},   \
    { KC_##k02,KC_##k12,KC_##k22,KC_##k32,KC_##k42,KC_##k52},   \
    { KC_##k03,KC_##k13,KC_##k23,KC_##k33,KC_##k43,KC_##k53},   \
    { KC_##k04,KC_##k14,KC_##k24,KC_##k34,KC_##k44,KC_##k54},   \
    { KC_##k05,KC_##k15,KC_##k25,KC_##k35,KC_NO,   KC_##k55},   \
    { KC_##k06,KC_##k16,KC_NO,   KC_##k36,KC_NO,   KC_##k56},   \
                                                                \
    { KC_##k07,KC_##k17,KC_NO,   KC_##k37,KC_NO,   KC_##k57},   \
    { KC_##k08,KC_##k18,KC_##k28,KC_##k38,KC_NO,   KC_##k58},   \
    { KC_##k09,KC_##k19,KC_##k29,KC_##k39,KC_##k49,KC_##k59},   \
    { KC_##k0A,KC_##k1A,KC_##k2A,KC_##k3A,KC_##k4A,KC_##k5A},   \
    { KC_##k0B,KC_##k1B,KC_##k2B,KC_##k3B,KC_##k4B,KC_##k5B},   \
    { KC_##k0C,KC_##k1C,KC_##k2C,KC_##k3C,KC_##k4C,KC_##k5C},   \
    { KC_##k0D,KC_##k1D,KC_##k2D,KC_##k3D,KC_##k4D,KC_NO   }    \
   }

#if defined(KEYMAP_DVORAK)
#include "keymap_dvorak.h"
#elif defined(KEYMAP_COLEMAK)
#include "keymap_colemak.h"
#elif defined(KEYMAP_WORKMAN)
#include "keymap_workman.h"
#elif defined(KEYMAP_MICRO)
#include "keymap_micro.h"
#elif defined(KEYMAP_CUB)
#include "keymap_cub.h"
#else

static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    KEYMAP(  // layer 0 : default
        // left hand
        ESC, 1,   2,   3,   4,   5,   GRV,
        TAB,Q,   W,   E,   R,   T,   BSPC,
        RBRC ,A,   S,   D,   F,   G,
        LSFT, Z,   X,   C,   V,   B, DEL,
        LCTL,LGUI,FN17,LALT, FN1,
                                      MUTE, VOLU,
                                           VOLD,
                                SPC , ENT, LCTL,
						        // right hand
							   EQL, 6,   7,   8,   9,   0,   MINS,
							   BSPC,Y,   U,   I,   O,   P,   LBRC,
							        H,   J,   K,   L,   SCLN,QUOT,
							   DEL,N,   M,   COMM,DOT, SLSH,BSLS,
	 							    FN1,LEFT,UP, DOWN,RGHT,
						        RGUI,FN2,
						        APP ,
						        RCTL, RALT,RSFT
    ),
    KEYMAP(  // layer 1 : function
        // left hand
        PWR, F1,  F2,  F3,  F4,  F5,  F6,
        FN18,PGUP,HOME,UP,  END, FN11,FN0,
        CAPS,PGDN,LEFT,DOWN,RGHT,FN8 ,
        TRNS,FN7,FN12,FN6, FN13,FN9 ,INS,  
        TRNS,TRNS,TRNS,TRNS,TRNS,
                                      TRNS,TRNS,
                                           TRNS,
                                 TRNS,TRNS,TRNS,
						        // right hand
							   F7,  F8,  F9,  F10, F11, F12, PSCR,
							   SLEP,TRNS   ,TRNS,  TRNS,  TRNS,  TRNS,SLCK,
							        TRNS,TRNS,  TRNS,  TRNS,  TRNS   ,PAUS,
							   WAKE,TRNS  ,TRNS, TRNS,  TRNS,  TRNS,TRNS,
								    TRNS,HOME,PGUP,PGDN,END,
						        TRNS,TRNS,
						        TRNS,
						        TRNS,TRNS,TRNS  
    ),
    KEYMAP(  // layer 2 : numpad
        // left hand
        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
        TRNS,TRNS,TRNS,TRNS,TRNS,
                                      TRNS,TRNS,
                                           TRNS,
                                 TRNS,TRNS,FN1,
						        // right hand		
							   TRNS,TRNS,NLCK,PSLS,PAST,PMNS,TRNS,  
							   TRNS,Y   ,P7,  P8,  P9,  PPLS,FN15,  
							        FN16,P4,  P5,  P6, PPLS	,TRNS,  
							   TRNS,  TRNS,P1,  P2,  P3,  ENT,TRNS,
								    P0,G,PDOT,TRNS,TRNS,  
						        TRNS,FN4,
						        TRNS,
						        FN1,TRNS,TRNS 		
    ),
    
 
    KEYMAP(  // layer 3: mirror
            // left hand
        MINS,0,   9,   8,   7,   6,   EQL,
        LBRC,P,   O,   I,   U,   Y,   BSLS,
        QUOT,SCLN,L,   K,   J,   H,
        RCTL,SLSH,DOT, COMM,M,   N,   RGUI,
        RGHT,DOWN,UP,  LEFT,RALT,
                                      TRNS,LGUI,
                                           TRNS,
                                 ENT, RSFT,NO,
						        // right hand
							   GRV, 5,   4,   3,   2,   1,   ESC,
							   RBRC,T,   R,   E,   W,   Q,   BSPC,
							        G,   F,   D,   S,   A,   TAB, 
							   DEL, B,   V,   C,   X,   Z,   LCTL,
								    TAB, END, PGDN,PGUP,HOME, 
						        LGUI,FN2,
						        TRNS,
						        NO  ,LSFT,SPC
    ),

};

/* id for user defined functions */
enum function_id {
    TEENSY_KEY,
};
	
/*
 * Fn action definition
 */
static const uint16_t PROGMEM fn_actions[] = {
    ACTION_FUNCTION(TEENSY_KEY),                    // FN0 - Teensy key
    ACTION_LAYER_MOMENTARY(1),                      // FN1 - switch to Layer1
    ACTION_LAYER_SET(2, ON_PRESS),                  // FN2 - set Layer2
    ACTION_LAYER_MOMENTARY(3),                      // FN3 - toggle Layer3 aka Mirror
    ACTION_LAYER_SET(0, ON_PRESS),                  // FN4 - set Layer0
    
    ACTION_MODS_KEY(MOD_LCTL, KC_A),             // FN5 - Ctrl A
    ACTION_MODS_KEY(MOD_LCTL, KC_H),             // FN6 - Ctrl C
    ACTION_MODS_KEY(MOD_LCTL, KC_SLSH),          // FN7 - Ctrl F
    ACTION_MODS_KEY(MOD_LCTL, KC_LBRC),          // FN8 - Ctrl Z (undo)
    ACTION_MODS_KEY(MOD_LCTL, KC_X),             // FN9 - Ctrl Y (redo)
    ACTION_MODS_KEY(MOD_LCTL, KC_E),             // FN10 - Ctrl P
    ACTION_MODS_KEY(MOD_LCTL, KC_K),             // FN11 - Ctrl S
    ACTION_MODS_KEY(MOD_LCTL, KC_C),             // FN12 - Ctrl X
    ACTION_MODS_KEY(MOD_LCTL, KC_U),             // FN13 - Ctrl V    
    ACTION_MODS_KEY(MOD_LGUI, KC_I),             // FN14 - Win D
    ACTION_MODS_KEY(MOD_LSFT, KC_V),             // FN15 - shift+v ? bépo ? numpad :
    ACTION_MODS_KEY(MOD_RALT, KC_U),             // FN16 - altgr+u ? bépo ? numpad ?   
    ACTION_LAYER_MOMENTARY(2),                      // FN17 - switch to Layer2
    ACTION_MODS_KEY(MOD_LALT, KC_TAB)             // FN17 - Alt + Tab
//    ACTION_MODS(MOD_LCTL | MOD_LALT)             // FN17 - Ctrl + Alt 
};

void action_function(keyrecord_t *event, uint8_t id, uint8_t opt)
{
    if (id == TEENSY_KEY) {
        clear_keyboard();
        print("\n\nJump to bootloader... ");
        _delay_ms(250);
        bootloader_jump(); // should not return
        print("not supported.\n");
    }
}

#endif


#define KEYMAPS_SIZE    (sizeof(keymaps) / sizeof(keymaps[0]))
#define FN_ACTIONS_SIZE (sizeof(fn_actions) / sizeof(fn_actions[0]))

/* translates key to keycode */
uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key)
{
    if (layer < KEYMAPS_SIZE) {
        return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]);
    } else {
        // fall back to layer 0
        return pgm_read_byte(&keymaps[0][(key.row)][(key.col)]);
    }
}

#if defined(KEYMAP_CUB)

// function keymap_fn_to_action will be defined in keymap_cub.h

#else
/* translates Fn keycode to action */
action_t keymap_fn_to_action(uint8_t keycode)
{
    action_t action;
    if (FN_INDEX(keycode) < FN_ACTIONS_SIZE) {
        action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]);
    } else {
        action.code = ACTION_NO;
    }
    return action;
}
#endif

Hors ligne

#240 2/3/2015 15:09:09

Mimoza
Admin
Lieu : Terre
Inscription : 19/9/2012
Messages : 1 242

Re : [sujet technique] Adapter le bépo à l’ergodox

Une petite image avec pour bien visualiser tu dispo ?

Hors ligne

#241 2/3/2015 15:37:37

jonneve
Membres
Inscription : 12/2/2015
Messages : 11

Re : [sujet technique] Adapter le bépo à l’ergodox

Mimoza a écrit :

Une petite image avec pour bien visualiser tu dispo ?

Oui, je pensais préparer ça ce soir, pas le temps là tout de suite. Ma disposition actuelle n'est probablement pas définitive, mais elle est en tout cas en bonne voie. Non pas que celle de yeKcim soit mauvaise ni forcément moins bien (car les préférences sont très personnelles), mais je pense que mes modifications devraient en tout cas rendre l'ErgoDox beaucoup plus facile d'accès (car je suis revenu pour un certain nombre de touches à une disposition plus proche du clavier standard), sans à mon sens y perdre quoi que ce soit. Il restera toujours un petit temps d'adaptation car c'est un clavier différent, il y a moins de touches, il y a des touches de raccourci programmables, etc, mais en même temps, j'ai cherché à éviter les modifications superflues, surtout sur les touches CTRL, SHIFT, ALT, WIN et companie, qui servent dans beaucoup de raccourcis un peu partout, et je ne vois pas l'intérêt de tout réapprendre autrement, surtout que certaines combinaisons devenaient franchement difficiles d'accès.

Hors ligne

#242 2/3/2015 18:01:34

Mimoza
Admin
Lieu : Terre
Inscription : 19/9/2012
Messages : 1 242

Re : [sujet technique] Adapter le bépo à l’ergodox

Tu n'as pas a te justifier … ma dispo d'ergodox est elle aussi bien plus proche d'un clavier standard que celle de yeKcim. mais c'est juste qu'un long discour wink

Hors ligne

#243 27/4/2015 23:01:59

fauge
Membres
Lieu : Paris
Inscription : 26/10/2014
Messages : 57

Re : [sujet technique] Adapter le bépo à l’ergodox

Ça y est, j'ai enfin eu le courage de refaire ma configuration sur le firmware « tmk » ce week-end et du coup j'utilise à nouveau mon ErgoDox au boulot smile

Cette fois c'est la bonne, avec les raccourcis copier/couper/coller qui fonctionnent, les touches multimédia et même déplacer la souris au clavier, c'est sûr que je ne suis pas prêt de revenir en arrière !!! Pouvoir tout faire sans même décoller les poignets, c'est un tel confort…
Je ne partage pas encore mon fichier de conf, car des petites choses vont encore bouger, j'ai gagné pas mal de touches sur lesquelles je peux encore mettre des fonctionnalités depuis que je me suis inspiré des couches « Fn » des claviers 60%.

En fouillant dans les fichiers de layouts prédéfinis du « tmk », j'ai découvert le SpaceFn layout, ça m'a paru intéressant, alors j'ai lancé un nouveau thread sur le sujet: http://forum.bepo.fr/viewtopic.php?id=1182

Dernière modification par fauge (27/4/2015 23:22:54)

Hors ligne

#244 27/4/2015 23:07:57

Mimoza
Admin
Lieu : Terre
Inscription : 19/9/2012
Messages : 1 242

Re : [sujet technique] Adapter le bépo à l’ergodox

Yep il faut que je m'y remette aussi a refaire la config de mon ergodox … ton truc SpaceFN est pas mal en effet, ça donne envie d'essayer wink

Hors ligne

#245 5/5/2015 17:02:09

kluck
Membres
Inscription : 19/2/2011
Messages : 5

Re : [sujet technique] Adapter le bépo à l’ergodox

Bonjour,

Pour ceux qui le souhaitent, j'ai créé un « keylogger » (soyez rassurés, il n'enregistre pas tout ce que vous tapez, mais compte juste le nombre de fois où vous appuyez sur telle ou telle touche), ainsi qu'un outil qui permet d'interpréter le fichier obtenu pour réaliser une heatmap de l'utilisation du clavier.

Je me sers de ça pour déterminer les combinaisons de touches que j'utilise le plus, et pour essayer d'adapter ma disposition ergodox en fonction smile

Pour l'utilisation, c'est très simple (surtout pour les linuxiens, pour les autres, vous me direz si ça marche big_smile), il faut dans un premier temps cloner le repository du keylogger :

git clone https://github.com/lucmazon/keylogger.git

Le repository contient déjà un fichier keycodes.json, adapté à la disposition bépo. Si vous êtes dans une autre disposition, créez le fichier liant les keycodes envoyés par votre clavier et les « lettres » générées par votre OS et remplacez le dans la commande pour lancer le script (les explications sur le format du fichier sont sur http://lucmazon.github.io/heatmap/).

Le lancement du script se fait alors de la manière suivante (c'est un simple script python) :

./heatmapper.py keycodes.json ~/heatmap.json

(Remplacez ~/heatmap.json par le nom et l'emplacement du fichier de sortie)

Une fois que vous avez terminé de taper, vous pouvez arrêter le script avec un Ctrl+C, le résultat sera automatiquement sauvegardé (il est de toute manière sauvé toutes les 30s).
Petit bonus, vous pouvez vérifier que le script fonctionne bien en ajoutant l'option --debug.

Il ne reste maintenant plus qu'à aller sur https://lucmazon.github.io/heatmap et de suivre les instructions pour voir une magnifique heatmap de l'utilisation de votre clavier !

J'ai essayé d'expliquer au mieux sur le site, mais s'il y a des choses que vous ne comprenez pas, faites-moi signe ^^

Hors ligne

#246 5/5/2015 17:05:09

c4software
Membres
Inscription : 20/1/2013
Messages : 63
Site Web

Re : [sujet technique] Adapter le bépo à l’ergodox

Super outil! Merci

Hors ligne

#247 6/5/2015 23:02:37

Mimoza
Admin
Lieu : Terre
Inscription : 19/9/2012
Messages : 1 242

Re : [sujet technique] Adapter le bépo à l’ergodox

@yeKcim : Pourquoi ne pas avoir mis  les touches directionnel à l'image de VI (inverser haut et bas ) ?
http://www.catonmat.net/blog/why-vim-us … rrow-keys/

Hors ligne

#248 12/7/2015 18:11:27

yeKcim
Membres
Inscription : 8/4/2014
Messages : 114
Site Web

Re : [sujet technique] Adapter le bépo à l’ergodox

Voici 44, retour de la symétrie (w et ç de retour à gauche) car à l’usage c’est vraiment perturbant d’avoir un clavier non symétrique. Les touches de volumes ont également été modifiées, le pavé numérique est le même en Fn ou en lock donc les touches F1, F2, F3,… font leur retour à gauche.

44.svg

Le code correspondant :

/*
Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdint.h>
#include <stdbool.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "keycode.h"
#include "action.h"
#include "action_util.h"
#include "action_code.h"
#include "action_macro.h"
#include "action_layer.h"
#include "bootloader.h"
#include "report.h"
#include "host.h"
#include "print.h"
#include "debug.h"
#include "keymap.h"
#include "ergodox.h"


/* ErgoDox keymap definition macro */
#define KEYMAP(                                                 \
                                                                \
    /* left hand, spatial positions */                          \
    k00,k01,k02,k03,k04,k05,k06,                                \
    k10,k11,k12,k13,k14,k15,k16,                                \
    k20,k21,k22,k23,k24,k25,                                    \
    k30,k31,k32,k33,k34,k35,k36,                                \
    k40,k41,k42,k43,k44,                                        \
                            k55,k56,                            \
                                k54,                            \
                        k53,k52,k51,                            \
                                                                \
    /* right hand, spatial positions */                         \
        k07,k08,k09,k0A,k0B,k0C,k0D,                            \
        k17,k18,k19,k1A,k1B,k1C,k1D,                            \
            k28,k29,k2A,k2B,k2C,k2D,                            \
        k37,k38,k39,k3A,k3B,k3C,k3D,                            \
                k49,k4A,k4B,k4C,k4D,                            \
    k57,k58,                                                    \
    k59,                                                        \
    k5C,k5B,k5A )                                               \
                                                                \
   /* matrix positions */                                       \
   {                                                            \
    { KC_##k00,KC_##k10,KC_##k20,KC_##k30,KC_##k40,KC_NO   },   \
    { KC_##k01,KC_##k11,KC_##k21,KC_##k31,KC_##k41,KC_##k51},   \
    { KC_##k02,KC_##k12,KC_##k22,KC_##k32,KC_##k42,KC_##k52},   \
    { KC_##k03,KC_##k13,KC_##k23,KC_##k33,KC_##k43,KC_##k53},   \
    { KC_##k04,KC_##k14,KC_##k24,KC_##k34,KC_##k44,KC_##k54},   \
    { KC_##k05,KC_##k15,KC_##k25,KC_##k35,KC_NO,   KC_##k55},   \
    { KC_##k06,KC_##k16,KC_NO,   KC_##k36,KC_NO,   KC_##k56},   \
                                                                \
    { KC_##k07,KC_##k17,KC_NO,   KC_##k37,KC_NO,   KC_##k57},   \
    { KC_##k08,KC_##k18,KC_##k28,KC_##k38,KC_NO,   KC_##k58},   \
    { KC_##k09,KC_##k19,KC_##k29,KC_##k39,KC_##k49,KC_##k59},   \
    { KC_##k0A,KC_##k1A,KC_##k2A,KC_##k3A,KC_##k4A,KC_##k5A},   \
    { KC_##k0B,KC_##k1B,KC_##k2B,KC_##k3B,KC_##k4B,KC_##k5B},   \
    { KC_##k0C,KC_##k1C,KC_##k2C,KC_##k3C,KC_##k4C,KC_##k5C},   \
    { KC_##k0D,KC_##k1D,KC_##k2D,KC_##k3D,KC_##k4D,KC_NO   }    \
   }

#if defined(KEYMAP_DVORAK)
#include "keymap_dvorak.h"
#elif defined(KEYMAP_COLEMAK)
#include "keymap_colemak.h"
#elif defined(KEYMAP_WORKMAN)
#include "keymap_workman.h"
#elif defined(KEYMAP_MICRO)
#include "keymap_micro.h"
#elif defined(KEYMAP_CUB)
#include "keymap_cub.h"
#else

static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    KEYMAP(  // layer 0 : default
        // left hand
        ESC, 1,   2,   3,   4,   5,   GRV,
        RBRC,Q,   W,   E,   R,   T,   ENT,
        BSLS ,A,   S,   D,   F,   G,
        LCTL,Z,   X,   C,   V,   B,   TAB,
        HOME,PGUP,PGDN,END, LALT,
                                      LGUI, RGUI,
                                           FN17,
                                 SPC, LSFT, FN1,
						        // right hand
							   EQL, 6,   7,   8,   9,   0,   MINS,
							   BSPC,Y,   U,   I,   O,   P,   LBRC,
							        H,   J,   K,   L,   SCLN,QUOT,
							   DEL ,N,   M,   COMM,DOT, SLSH,RCTL,
	 							    RALT,LEFT,UP,  DOWN,RGHT,
						        APP,LGUI,
						        FN2 ,
						        FN1 ,RSFT, SPC
    ),

    KEYMAP(  // layer 1 : function, numpad
        // left hand
        PWR, F1,  F2,  F3,  F4,  F5,  F6,
        SLEP,F7,  F8,  F9,  F10, F11, F12,
        WAKE,TRNS,TRNS,TRNS,TRNS,TRNS,
        TRNS,FN12,FN6 ,FN13,FN8, FN9 ,TRNS,  
        MYCM,MUTE,VOLD,VOLU,TRNS,
                                      TRNS,TRNS,
                                           TRNS,
                                 TRNS,TRNS,TRNS,
						        // right hand
							   CAPS,NLCK,PPLS,PMNS,PSLS,PAST,PSCR,
							   TRNS,Y   ,P7,  P8,  P9,  FN15,SLCK,
							        FN16,P4,  P5,  P6,  G   ,PAUS,
							   INS ,P0  ,P1,  P2,  P3,  PDOT,TRNS,
								    MSEL,MPLY,MPRV,MNXT,MSTP,
						        TRNS,TRNS,
						        TRNS,
						        TRNS,TRNS,TRNS  
    ),

    KEYMAP(  // layer 2 : numpad
        // left hand
        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
        TRNS,TRNS,TRNS,TRNS,TRNS,
                                      TRNS,TRNS,
                                           TRNS,
                                 TRNS,TRNS,FN1,
						        // right hand
							   TRNS,NLCK,PPLS,PMNS,PSLS,PAST,TRNS,  
							   TRNS,Y   ,P7,  P8,  P9,  FN15,TRNS,  
							        FN16,P4,  P5,  P6,  G   ,TRNS,  
							   TRNS,P0  ,P1,  P2,  P3,  PDOT,TRNS,
								    TRNS,TRNS,TRNS,TRNS,TRNS,  
						        TRNS,FN4,
						        TRNS,
						        FN1,TRNS,PENT   
    ),
    
 
    KEYMAP(  // layer 3: mirror
            // left hand
        MINS,0,   9,   8,   7,   6,   EQL,
        LBRC,P,   O,   I,   U,   Y,   BSLS,
        QUOT,SCLN,L,   K,   J,   H,
        RCTL,SLSH,DOT, COMM,M,   N,   RGUI,
        RGHT,DOWN,UP,  LEFT,RALT,
                                      TRNS,LGUI,
                                           TRNS,
                                 ENT, RSFT,NO,
						        // right hand
							   GRV, 5,   4,   3,   2,   1,   ESC,
							   RBRC,T,   R,   E,   W,   Q,   BSPC,
							        G,   F,   D,   S,   A,   TAB, 
							   DEL, B,   V,   C,   X,   Z,   LCTL,
								    TAB, END, PGDN,PGUP,HOME, 
						        LGUI,FN2,
						        TRNS,
						        NO  ,LSFT,SPC
    ),

};

/* id for user defined functions */
enum function_id {
    TEENSY_KEY,
};

/*
 * Fn action definition
 */
static const uint16_t PROGMEM fn_actions[] = {
    ACTION_FUNCTION(TEENSY_KEY),                    // FN0 - Teensy key
    ACTION_LAYER_MOMENTARY(1),                      // FN1 - switch to Layer1
    ACTION_LAYER_SET(2, ON_PRESS),                  // FN2 - set Layer2
    ACTION_LAYER_MOMENTARY(3),                      // FN3 - toggle Layer3 aka Mirror
    ACTION_LAYER_SET(0, ON_PRESS),                  // FN4 - set Layer0
    
    ACTION_MODS_KEY(MOD_LCTL, KC_A),             // FN5 - Ctrl A
    ACTION_MODS_KEY(MOD_LCTL, KC_H),             // FN6 - Ctrl C
    ACTION_MODS_KEY(MOD_LCTL, KC_SLSH),          // FN7 - Ctrl F
    ACTION_MODS_KEY(MOD_LCTL, KC_LBRC),          // FN8 - Ctrl Z (undo)
    ACTION_MODS_KEY(MOD_LCTL, KC_X),             // FN9 - Ctrl Y (redo)
    ACTION_MODS_KEY(MOD_LCTL, KC_E),             // FN10 - Ctrl P
    ACTION_MODS_KEY(MOD_LCTL, KC_K),             // FN11 - Ctrl S
    ACTION_MODS_KEY(MOD_LCTL, KC_C),             // FN12 - Ctrl X
    ACTION_MODS_KEY(MOD_LCTL, KC_U),             // FN13 - Ctrl V    
    ACTION_MODS_KEY(MOD_LGUI, KC_I),             // FN14 - Win D
    ACTION_MODS_KEY(MOD_LSFT, KC_V),             // FN15 - shift+v → bépo → numpad :
    ACTION_MODS_KEY(MOD_RALT, KC_U),             // FN16 - altgr+u → bépo → numpad ˇ   
    ACTION_MODS(MOD_LCTL | MOD_LALT)             // FN17 - Ctrl + Alt 
};

void action_function(keyrecord_t *event, uint8_t id, uint8_t opt)
{
    if (id == TEENSY_KEY) {
        clear_keyboard();
        print("\n\nJump to bootloader... ");
        _delay_ms(250);
        bootloader_jump(); // should not return
        print("not supported.\n");
    }
}

#endif


#define KEYMAPS_SIZE    (sizeof(keymaps) / sizeof(keymaps[0]))
#define FN_ACTIONS_SIZE (sizeof(fn_actions) / sizeof(fn_actions[0]))

/* translates key to keycode */
uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key)
{
    if (layer < KEYMAPS_SIZE) {
        return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]);
    } else {
        // fall back to layer 0
        return pgm_read_byte(&keymaps[0][(key.row)][(key.col)]);
    }
}

#if defined(KEYMAP_CUB)

// function keymap_fn_to_action will be defined in keymap_cub.h

#else
/* translates Fn keycode to action */
action_t keymap_fn_to_action(uint8_t keycode)
{
    action_t action;
    if (FN_INDEX(keycode) < FN_ACTIONS_SIZE) {
        action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]);
    } else {
        action.code = ACTION_NO;
    }
    return action;
}
#endif

yeknan.free.fr: Participer à un projet libre est un jeu... Et toi, à quoi tu joues ?

Hors ligne

#249 13/7/2015 10:47:21

Elivagar
Membres
Lieu : Quelque part sous les Étoiles
Inscription : 29/8/2014
Messages : 119

Re : [sujet technique] Adapter le bépo à l’ergodox

@yeKcim : As tu essayé le Space Fn Layout ? Depuis que je l'ai mis en place je le trouve très pratique, j'ai appliqué la logique de ce qui est le plus utilisé sur la rangée de repos.
Les flèches de déplacement sont directement sur la rangée de repos et comme je descend le plus fréquemment j'ai mis la flèche vers le bas sous l'index («T»), la flèche vers la gauche est sur le «C», haut est sur le «S» et droite est sur le «R». Home est sur «'», page down est sur «Q», page up est sur «G» et Fin est sur «H». Ce qui pourrait te libérer 8 touches sur ton layout de base.
J'ai mis Retour arrière sur «V» et Supprimer sur «D» puisque j'utilise plus le retour arrière. Sur ton layout ils sont accessible un peu comme sur le TM mais je le trouve plus confortable là.
Echapp est sur «^».
Bon ça c'était pour la main droite mais la gauche à de quoi faire aussi :
Il y a Ctrl+V sur «E», Ctrl+C sur «I», Ctrl+X sur «U», Ctrl+Z sur «O», Ctrl+Y sur «È» et Ctrl+S sur «K».
J'ai mis les chiffres aussi accessible par espace sur mon clavier mais comme sur ta disposition le shift est à coté de espace ce n'est pas intéressant mais par contre y mettre les touches de fonction pourrait être plus utile que de créer un layout dédié.
Je n'ai pas trouvé l'utilité à d'autres raccourcis sur ce layout mais on peut y rajouter Imprime écran, Arrêt défilement, pause,...
Pour faire ceci j'utilise TouchCursor mais j'espère que le software du Keymouse pourra le faire directement.

Hors ligne

#250 24/8/2015 18:35:51

yeKcim
Membres
Inscription : 8/4/2014
Messages : 114
Site Web

Re : [sujet technique] Adapter le bépo à l’ergodox

45.svg

Juste une mini correction (position L0) et une mini modification (voldown et mute intervertis)

/*
Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com>

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdint.h>
#include <stdbool.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "keycode.h"
#include "action.h"
#include "action_util.h"
#include "action_code.h"
#include "action_macro.h"
#include "action_layer.h"
#include "bootloader.h"
#include "report.h"
#include "host.h"
#include "print.h"
#include "debug.h"
#include "keymap.h"
#include "ergodox.h"


/* ErgoDox keymap definition macro */
#define KEYMAP(                                                 \
                                                                \
    /* left hand, spatial positions */                          \
    k00,k01,k02,k03,k04,k05,k06,                                \
    k10,k11,k12,k13,k14,k15,k16,                                \
    k20,k21,k22,k23,k24,k25,                                    \
    k30,k31,k32,k33,k34,k35,k36,                                \
    k40,k41,k42,k43,k44,                                        \
                            k55,k56,                            \
                                k54,                            \
                        k53,k52,k51,                            \
                                                                \
    /* right hand, spatial positions */                         \
        k07,k08,k09,k0A,k0B,k0C,k0D,                            \
        k17,k18,k19,k1A,k1B,k1C,k1D,                            \
            k28,k29,k2A,k2B,k2C,k2D,                            \
        k37,k38,k39,k3A,k3B,k3C,k3D,                            \
                k49,k4A,k4B,k4C,k4D,                            \
    k57,k58,                                                    \
    k59,                                                        \
    k5C,k5B,k5A )                                               \
                                                                \
   /* matrix positions */                                       \
   {                                                            \
    { KC_##k00,KC_##k10,KC_##k20,KC_##k30,KC_##k40,KC_NO   },   \
    { KC_##k01,KC_##k11,KC_##k21,KC_##k31,KC_##k41,KC_##k51},   \
    { KC_##k02,KC_##k12,KC_##k22,KC_##k32,KC_##k42,KC_##k52},   \
    { KC_##k03,KC_##k13,KC_##k23,KC_##k33,KC_##k43,KC_##k53},   \
    { KC_##k04,KC_##k14,KC_##k24,KC_##k34,KC_##k44,KC_##k54},   \
    { KC_##k05,KC_##k15,KC_##k25,KC_##k35,KC_NO,   KC_##k55},   \
    { KC_##k06,KC_##k16,KC_NO,   KC_##k36,KC_NO,   KC_##k56},   \
                                                                \
    { KC_##k07,KC_##k17,KC_NO,   KC_##k37,KC_NO,   KC_##k57},   \
    { KC_##k08,KC_##k18,KC_##k28,KC_##k38,KC_NO,   KC_##k58},   \
    { KC_##k09,KC_##k19,KC_##k29,KC_##k39,KC_##k49,KC_##k59},   \
    { KC_##k0A,KC_##k1A,KC_##k2A,KC_##k3A,KC_##k4A,KC_##k5A},   \
    { KC_##k0B,KC_##k1B,KC_##k2B,KC_##k3B,KC_##k4B,KC_##k5B},   \
    { KC_##k0C,KC_##k1C,KC_##k2C,KC_##k3C,KC_##k4C,KC_##k5C},   \
    { KC_##k0D,KC_##k1D,KC_##k2D,KC_##k3D,KC_##k4D,KC_NO   }    \
   }

#if defined(KEYMAP_DVORAK)
#include "keymap_dvorak.h"
#elif defined(KEYMAP_COLEMAK)
#include "keymap_colemak.h"
#elif defined(KEYMAP_WORKMAN)
#include "keymap_workman.h"
#elif defined(KEYMAP_MICRO)
#include "keymap_micro.h"
#elif defined(KEYMAP_CUB)
#include "keymap_cub.h"
#else

static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    KEYMAP(  // layer 0 : default
        // left hand
        ESC, 1,   2,   3,   4,   5,   GRV,
        RBRC,Q,   W,   E,   R,   T,   ENT,
        BSLS ,A,   S,   D,   F,   G,
        LCTL,Z,   X,   C,   V,   B,   TAB,
        HOME,PGUP,PGDN,END, LALT,
                                      LGUI, RGUI,
                                           FN17,
                                 SPC, LSFT, FN1,
						        // right hand
							   EQL, 6,   7,   8,   9,   0,   MINS,
							   BSPC,Y,   U,   I,   O,   P,   LBRC,
							        H,   J,   K,   L,   SCLN,QUOT,
							   DEL ,N,   M,   COMM,DOT, SLSH,RCTL,
	 							    RALT,LEFT,UP,  DOWN,RGHT,
						        APP,LGUI,
						        FN2 ,
						        FN1 ,RSFT, SPC
    ),

    KEYMAP(  // layer 1 : function, numpad
        // left hand
        PWR, F1,  F2,  F3,  F4,  F5,  F6,
        SLEP,F7,  F8,  F9,  F10, F11, F12,
        WAKE,TRNS,TRNS,TRNS,TRNS,TRNS,
        TRNS,FN12,FN6 ,FN13,FN8, FN9 ,TRNS,  
        MYCM,VOLD,MUTE,VOLU,TRNS,
                                      TRNS,TRNS,
                                           TRNS,
                                 TRNS,TRNS,TRNS,
						        // right hand
							   CAPS,NLCK,PPLS,PMNS,PSLS,PAST,PSCR,
							   TRNS,Y   ,P7,  P8,  P9,  FN15,SLCK,
							        FN16,P4,  P5,  P6,  G   ,PAUS,
							   INS ,P0  ,P1,  P2,  P3,  PDOT,TRNS,
								    MSEL,MPLY,MPRV,MNXT,MSTP,
						        TRNS,TRNS,
						        TRNS,
						        TRNS,TRNS,TRNS  
    ),

    KEYMAP(  // layer 2 : numpad
        // left hand
        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
        TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
        TRNS,TRNS,TRNS,TRNS,TRNS,
                                      TRNS,TRNS,
                                           TRNS,
                                 TRNS,TRNS,FN1,
						        // right hand
							   TRNS,NLCK,PPLS,PMNS,PSLS,PAST,TRNS,  
							   TRNS,Y   ,P7,  P8,  P9,  FN15,TRNS,  
							        FN16,P4,  P5,  P6,  G   ,TRNS,  
							   TRNS,P0  ,P1,  P2,  P3,  PDOT,TRNS,
								    TRNS,TRNS,TRNS,TRNS,TRNS,  
						        TRNS,TRNS,
						        FN4,
						        FN1,TRNS,PENT   
    ),
    
 
    KEYMAP(  // layer 3: mirror ------ not used anymore
            // left hand
        MINS,0,   9,   8,   7,   6,   EQL,
        LBRC,P,   O,   I,   U,   Y,   BSLS,
        QUOT,SCLN,L,   K,   J,   H,
        RCTL,SLSH,DOT, COMM,M,   N,   RGUI,
        RGHT,DOWN,UP,  LEFT,RALT,
                                      TRNS,LGUI,
                                           TRNS,
                                 ENT, RSFT,NO,
						        // right hand
							   GRV, 5,   4,   3,   2,   1,   ESC,
							   RBRC,T,   R,   E,   W,   Q,   BSPC,
							        G,   F,   D,   S,   A,   TAB, 
							   DEL, B,   V,   C,   X,   Z,   LCTL,
								    TAB, END, PGDN,PGUP,HOME, 
						        LGUI,FN2,
						        TRNS,
						        NO  ,LSFT,SPC
    ),

};

/* id for user defined functions */
enum function_id {
    TEENSY_KEY,
};

/*
 * Fn action definition
 */
static const uint16_t PROGMEM fn_actions[] = {
    ACTION_FUNCTION(TEENSY_KEY),                    // FN0 - Teensy key
    ACTION_LAYER_MOMENTARY(1),                      // FN1 - switch to Layer1
    ACTION_LAYER_SET(2, ON_PRESS),                  // FN2 - set Layer2
    ACTION_LAYER_MOMENTARY(3),                      // FN3 - toggle Layer3 aka Mirror
    ACTION_LAYER_SET(0, ON_PRESS),                  // FN4 - set Layer0
    
    ACTION_MODS_KEY(MOD_LCTL, KC_A),             // FN5 - Ctrl A
    ACTION_MODS_KEY(MOD_LCTL, KC_H),             // FN6 - Ctrl C
    ACTION_MODS_KEY(MOD_LCTL, KC_SLSH),          // FN7 - Ctrl F
    ACTION_MODS_KEY(MOD_LCTL, KC_LBRC),          // FN8 - Ctrl Z (undo)
    ACTION_MODS_KEY(MOD_LCTL, KC_X),             // FN9 - Ctrl Y (redo)
    ACTION_MODS_KEY(MOD_LCTL, KC_E),             // FN10 - Ctrl P
    ACTION_MODS_KEY(MOD_LCTL, KC_K),             // FN11 - Ctrl S
    ACTION_MODS_KEY(MOD_LCTL, KC_C),             // FN12 - Ctrl X
    ACTION_MODS_KEY(MOD_LCTL, KC_U),             // FN13 - Ctrl V    
    ACTION_MODS_KEY(MOD_LGUI, KC_I),             // FN14 - Win D
    ACTION_MODS_KEY(MOD_LSFT, KC_V),             // FN15 - shift+v → bépo → numpad :
    ACTION_MODS_KEY(MOD_RALT, KC_U),             // FN16 - altgr+u → bépo → numpad ˇ   
    ACTION_MODS(MOD_LCTL | MOD_LALT)             // FN17 - Ctrl + Alt 
};

void action_function(keyrecord_t *event, uint8_t id, uint8_t opt)
{
    if (id == TEENSY_KEY) {
        clear_keyboard();
        print("\n\nJump to bootloader... ");
        _delay_ms(250);
        bootloader_jump(); // should not return
        print("not supported.\n");
    }
}

#endif


#define KEYMAPS_SIZE    (sizeof(keymaps) / sizeof(keymaps[0]))
#define FN_ACTIONS_SIZE (sizeof(fn_actions) / sizeof(fn_actions[0]))

/* translates key to keycode */
uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key)
{
    if (layer < KEYMAPS_SIZE) {
        return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]);
    } else {
        // fall back to layer 0
        return pgm_read_byte(&keymaps[0][(key.row)][(key.col)]);
    }
}

#if defined(KEYMAP_CUB)

// function keymap_fn_to_action will be defined in keymap_cub.h

#else
/* translates Fn keycode to action */
action_t keymap_fn_to_action(uint8_t keycode)
{
    action_t action;
    if (FN_INDEX(keycode) < FN_ACTIONS_SIZE) {
        action.code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]);
    } else {
        action.code = ACTION_NO;
    }
    return action;
}
#endif

Dernière modification par yeKcim (24/8/2015 18:36:30)


yeknan.free.fr: Participer à un projet libre est un jeu... Et toi, à quoi tu joues ?

Hors ligne

Pied de page des forums